這個文章是延續以前《爬取妹子圖 Lv1》的延續,以前的爬蟲能夠爬取一個頁面的圖片,爬取一次大概400張圖片的樣子,按照以前的計劃,本次要進一步完善爬蟲,爬取妹子圖全網圖片。因爲以前已經有了爬蟲的雛形,因此本篇文章僅對增改內容進行說明。html
System Version:Ubuntu 16.04
Python Version:3.5.2
Scrapy Version:1.5.0正則表達式
from scrapy import Request from scrapy.spiders import Spider from spider_meizitu.items import SpiderMeizituItem import re class MeizituSpider(Spider): name = 'meizitu' start_urls = { 'http://www.meizitu.com/a/more_1.html', } def parse(self, response): meizi_pic_lists = response.xpath('//ul[@class="wp-list clearfix"]/li') for i, meizi_item in enumerate(meizi_pic_lists): meizi_item_url = meizi_item.xpath('.//h3[@class="tit"]/a/@href').extract()[0] print('===== 當前爬取頁面共有圖片%s組,正在抓取第%s組圖片,頁面連接:: %s ====='% (len(meizi_pic_lists),i+1,meizi_item_url)) yield Request(meizi_item_url,callback=self.parse_meizi_pic) next_url = re.findall('<a href="(.*)">下一頁</a>',response.xpath('//*[@id="wp_page_numbers"]').extract()[0]) print('next_url:::::',next_url) #print('response:::::',response.xpath('//*[@id="wp_page_numbers"]').extract()[0]) if next_url: next_url = 'http://www.meizitu.com/a/' + next_url[0] print('========== Request Next Url :: %s ==========' % next_url ) yield Request(next_url,callback=self.parse) def parse_meizi_pic(self,response): print('========== parse_meizi_pic response::: %s =========='% response) item = SpiderMeizituItem() meizitu_pics = response.xpath('//div[@id="picture"]/p/img') for i, meizitu_pic in enumerate(meizitu_pics): item['images'] = meizitu_pic.xpath('.//@alt').extract()[0].split(',')[0] item['image_urls'] = meizitu_pic.xpath('.//@src').extract() print('===== 當前頁面共有圖片%s張,正在抓取第%s張圖片,圖片連接:: %s ====='% (len(meizitu_pics),i+1,item['image_urls'])) yield item
爲了定位下一頁的跳轉連接,因此加入了正則表達式。segmentfault
next_url = re.findall('<a href="(.*)">下一頁</a>',response.xpath('//*[@id="wp_page_numbers"]').extract()[0])
利用正則表達式來提取下一頁
的連接地址,re.findall
的第一個參數是正則表達式,第二個參數是要匹配的字符串。利用response.xpath
將頁面中分頁菜單部分的html代碼提取出來用於正則匹配,返回的結果就是下一頁
按鈕中的超連接。若是當前頁面是http://www.meizitu.com/a/more_1.html
,獲得的url就是more_2.html
。cookie
接下來就將獲得的next_url 與主連接合併成完整連接,輸出給parse函數繼續處理。併發
作完以前的改動後,我開始爬取頁面圖片,爬取more_1.html
頁面以後能夠正常跳轉到more_2.html
,以後到more_3.html
、more_4.html
。可是出現一個問題就是在爬取到後期的時候,每一個頁面的39個項目中只能爬取到最後一個,有時候一個也爬不到,最終爬蟲運行完畢後,我只獲得了900+的圖片。因爲本人基礎知識還不夠紮實,只是有兩方面懷疑,一是網站對請求作了限制,規定時間內若是請求過多則爬不到頁面,二是scrapy的download隊列有數量限制,爬取到大概50個頁面的時候,好像隊列就滿了,沒法再新增項目,只有前面的隊列完成後,纔能有新的項目進入隊列。不管是哪一個緣由,我對setting作了些修改,打開或者增長了一些setting設置,具體以下:框架
配置Scrapy執行的最大併發請求 默認16
CONCURRENT_REQUESTS = 128
設置下載延遲 默認 0
DOWNLOAD_DELAY = 5
禁用cookies
COOKIES_ENABLED = False
日誌輸出基本,默認: 'DEBUG',log的最低級別。可選的級別有: CRITICAL、 ERROR、WARNING、INFO、DEBUG。
LOG_LEVEL = 'INFO'
作完上述改動後,爬蟲運行基本正常,可是爬取的速度有點慢,12個小時大概爬取了9000張圖片。scrapy
有心的朋友可以看到,在這兩個爬蟲實例中,我始終沒有去寫pipeline,一直使用scrapy自帶的pipeline模塊。可是默認的pipeline模塊下載的圖片名稱不可讀,下一步,我將重寫pipeline組件,實現文件命名和分目錄存儲的功能。ide
最後,發一個我本身理解的這個爬蟲的運行流程圖,因爲scrapy框架比較大,高端應用(如調度器、規則等)尚未用到,也沒在這個圖裏體現出來,僅供新手學習。函數