Python爬蟲 - scrapy - 爬取妹子圖 Lv2

0. 前言

這個文章是延續以前《爬取妹子圖 Lv1》的延續,以前的爬蟲能夠爬取一個頁面的圖片,爬取一次大概400張圖片的樣子,按照以前的計劃,本次要進一步完善爬蟲,爬取妹子圖全網圖片。因爲以前已經有了爬蟲的雛形,因此本篇文章僅對增改內容進行說明。html

系統環境

System Version:Ubuntu 16.04
Python Version:3.5.2
Scrapy Version:1.5.0正則表達式

1. 爬蟲文件

1.1. 完整文件

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

1.2. 增改項目說明

1.2.1. import re

爲了定位下一頁的跳轉連接,因此加入了正則表達式。segmentfault

1.2.2. next_url

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.htmlcookie

接下來就將獲得的next_url 與主連接合併成完整連接,輸出給parse函數繼續處理。併發

2. settings

作完以前的改動後,我開始爬取頁面圖片,爬取more_1.html頁面以後能夠正常跳轉到more_2.html,以後到more_3.htmlmore_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

clipboard.png

3. 後續

有心的朋友可以看到,在這兩個爬蟲實例中,我始終沒有去寫pipeline,一直使用scrapy自帶的pipeline模塊。可是默認的pipeline模塊下載的圖片名稱不可讀,下一步,我將重寫pipeline組件,實現文件命名和分目錄存儲的功能。ide

最後,發一個我本身理解的這個爬蟲的運行流程圖,因爲scrapy框架比較大,高端應用(如調度器、規則等)尚未用到,也沒在這個圖裏體現出來,僅供新手學習。函數

clipboard.png

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息