Scrapy網絡爬蟲:4.豌豆莢App安裝包爬取代碼實現與踩過的坑

Scrapy網絡爬蟲:4.豌豆莢App安裝包爬取代碼實現與踩過的坑

網絡爬蟲

FilesPipeline典型的工作流程

Scrapy框架提供了可重用的Files Pipelines為某個特定的Item去下載文件。典型的工作流程如下所示:

  1. 在一個爬蟲(Spider)裡,抓取數據(Item)後,把其中文件的URL放入 file_urls 組內。

  2. Item從爬蟲內返回,進入Item Pipeline中。

  3. 當Item進入 FilesPipeline,file_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中間件可以複用)安排下載,並且優先級更高,會在其他頁面被抓取前處理。Item會在這個特定的管道階段保持“locker”的狀態,直到完成文件的下載(或者由於某些原因未完成下載)。

  4. 當文件下載完後,另一個字段(files)將被更新到結構中。這個字段是一個字典列表,其中包括下載文件的信息,比如下載路徑、源抓取地址(從 file_urls 組獲得)和圖片的校驗碼(checksum)。 files 列表中的文件順序將和源 file_urls 組保持一致Scrapy網絡爬蟲:3.框架組成與工作原理-組件與數據流.note。如果某個文件下載失敗,將會記錄下錯誤信息,文件也不會出現在 files 組中。

使用File Pipeline爬取豌豆莢App安裝包

1. 項目需求

項目需求:爬取豌豆莢應用市場金融理財和考試學習類第一頁App的安裝包。

2. 豌豆莢網頁分析

打開豌豆莢應用市場考試學習類應用第一頁,可以看到正中央有一個應用列表,點開列表之後進入應用詳情頁,有一個“下載APK文件”,點開即可下載相應應用。

Scrapy網絡爬蟲:4.豌豆莢App安裝包爬取代碼實現與踩過的坑

豌豆莢考試學習類應用第一頁

Scrapy網絡爬蟲:4.豌豆莢App安裝包爬取代碼實現與踩過的坑

應用詳情頁面

3. Scrapy爬蟲項目

(1) 使用命令新建scrapy項目和爬蟲

scrapy startproject filedownload

cd filedownload

start genspider AppDownloadSpider www.wandoujia.com

(2) Item定義files和file_urls字段

class AppDownloadItem(scrapy.Item):

file_urls = scrapy.Field()

files = scrapy.Field()

(3)開發Spider

爬取下載鏈接之後賦值給Item的file_urls字段

import scrapy

from scrapy.linkextractors import LinkExtractor

from filedownload.items import AppDownloadItem

class AppdownloadspiderSpider(scrapy.Spider):

name = 'AppDownloadSpider'

allowed_domains = ['wandoujia.com']

start_urls = ['http://www.wandoujia.com/category/5026',

'http://www.wandoujia.com/category/5023']

def parse(self, response):

# 使用LinkExtractor提取該頁面應用詳情鏈接

le = LinkExtractor(restrict_xpaths='//*[@id="j-tag-list"]/li/div[1]/a')

for link in le.extract_links(response):

yield scrapy.Request(link.url, callback=self.parse_download)

def parse_download(self, response):

download_url = response.xpath('//div[@class="qr-info"]/a/@href').extract_first()

item = AppDownloadItem()

# 保存下載鏈接,注意此處是列表不是字符串

item['file_urls'] = [download_url]

yield item

(4) 開啟FilesPipleLine

在setting.py文件中開啟FilesPipleLine

ITEM_PIPELINES = {'scrapy.pipeline.files.FilesPipeline': 1}

接著FILES_STORE 設置為一個有效的文件夾,用來存儲下載的文件。 否則管道將保持禁用狀態,即使你在 ITEM_PIPELINES 設置中添加了它。

FILES_STORE = './wandoujia_app'

允許重定向

MEDIA_ALLOW_REDIRECTS = True

(5) 運行爬蟲,開啟下載文件之旅。

scrapy crawl AppDownloadSpider -o app.json

(6)結果

Scrapy網絡爬蟲:4.豌豆莢App安裝包爬取代碼實現與踩過的坑

安裝包文件

Scrapy網絡爬蟲:4.豌豆莢App安裝包爬取代碼實現與踩過的坑

json文本

踩過的坑

(1)AttributeError: 'str' object has no attribute 'iter'

LinkExtractor的路徑定位到元素而不是href屬性

(2)ValueError: Missing scheme in request url: h

file_urls的類型是列表而不是字符串

(3)“File (code: 302): Error downloading file” in Scrapy Files Pipeline

允許重定向


分享到:


相關文章: