FilesPipeline典型的工作流程
Scrapy框架提供了可重用的Files Pipelines為某個特定的Item去下載文件。典型的工作流程如下所示:
在一個爬蟲(Spider)裡,抓取數據(Item)後,把其中文件的URL放入 file_urls 組內。
Item從爬蟲內返回,進入Item Pipeline中。
當Item進入 FilesPipeline,file_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中間件可以複用)安排下載,並且優先級更高,會在其他頁面被抓取前處理。Item會在這個特定的管道階段保持“locker”的狀態,直到完成文件的下載(或者由於某些原因未完成下載)。
當文件下載完後,另一個字段(files)將被更新到結構中。這個字段是一個字典列表,其中包括下載文件的信息,比如下載路徑、源抓取地址(從 file_urls 組獲得)和圖片的校驗碼(checksum)。 files 列表中的文件順序將和源 file_urls 組保持一致Scrapy網絡爬蟲:3.框架組成與工作原理-組件與數據流.note。如果某個文件下載失敗,將會記錄下錯誤信息,文件也不會出現在 files 組中。
使用File Pipeline爬取豌豆莢App安裝包
1. 項目需求
項目需求:爬取豌豆莢應用市場金融理財和考試學習類第一頁App的安裝包。
2. 豌豆莢網頁分析
打開豌豆莢應用市場考試學習類應用第一頁,可以看到正中央有一個應用列表,點開列表之後進入應用詳情頁,有一個“下載APK文件”,點開即可下載相應應用。
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)結果
踩過的坑
(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
允許重定向
閱讀更多 初沏的茶 的文章