Scrapy爬取圖片純新手試用篇(一)

Scrapy爬取圖片純新手試用篇(一)

4 人贊了文章

最近在學習scrapy框架,看了官方文檔和一些文章,基本能寫點簡單的應用了。很多文章雖然也是很基礎的應用,但是純新手看起來還是不知所云。所以我想以純新手的視角寫一篇scrapy學習經歷,當然默認你有基礎爬蟲知識。

一、scrapy安裝

scrapy安裝依賴很多其它庫或者軟體,根據錯誤提示,百度一下,一個個裝上就行了。我在安裝時遇到的最大的問題是,Pywin32的安裝。我的電腦是win10 64位,Python為3.6 32位。Pywin32需要選擇對應版本的32位,安裝64位會報錯。安裝32位版本時,需要在註冊表上修改Python下一個文件夾的名稱,把後綴去掉,只留3.6,就能安裝了。

二、初識scrapy框架

因為剛開始學,所以要求低一點,能用就行。首先我們需要創建一個scrapy project,在cmd中,先cd到目標文件夾,然後輸入scrapy startproject ProjectName

E:衍生文件收納scrapy項目>scrapy startproject image

然後進入項目中的spiders文件夾,輸入scrapy genspider SpiderName URL

E:衍生文件收納scrapy項目imageimagespiders>scrapy genspider cat win4000.com

這樣,我們就創建了一個叫image的scrapy project,和一個叫cat的spider。

用pycharm打開後,結構如下:

本次體驗需要用的文件有cat.py、items.py、pipelines.py、settings.py

先簡單介紹下簡單的流程:

1.首先需要在items.py確定你要爬取的信息名稱,定義item對象。

2.然後cat.py中編寫對response的處理,返回item對象,傳給pipeline。

3.在pipelines.py中編寫管道文件,對item進行處理,以你想要的方式輸出信息。

4.在settings中啟用pipeline。

三、具體實例:用scrapy吸貓 (????)

要求分析:用scrapy爬取貓咪套圖,以套圖名稱作為文件夾名存放圖片。

目標網址:可愛貓咪桌面壁紙

1.確定item:

從頁面中我們看到,每一個頁面可以獲取到的信息有,套圖名稱,和具體URL。那我們不如先實現獲取所有套圖的名稱和URL吧,並把它們保存起來。

所以我們的item只需要2個值,名稱和地址。讓我們打開items.py來編輯吧

import scrapyclass ImageItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() url = scrapy.Field()

Item類編寫很簡單,文件中也有提示#name = scrapy.Field(),一個Item類你可以當字典來操作,當然最後輸出的時候還是要dict(item)方法把它真正的轉化為字典,在pipeline中處理item時會用到。

2.編寫spider,提取數據:

讓我們來打開cat.py

# -*- coding: utf-8 -*-import scrapyclass CatSpider(scrapy.Spider): name = cat allowed_domains = [win4000.com] start_urls = [http://win4000.com/] def parse(self, response): pass

我們可以看到這個Spider類已有的屬性有:name、allowed_domains、start_urls

外加一個parse方法。

name:顧名思義就是這個spider的名稱,用來唯一標識這個spider,是必須的。

allowed_domains:允許爬取的域名。如果爬取的鏈接不是這個域名下的就會被過濾掉。

start_urls :用來定義一個爬蟲的初始請求。

parse:傳入了一個response參數,它是用來解析響應,提取數據的 ,需要我們自己來寫。

通過檢查網頁元素髮現,我們需要的信息在ul下的li標籤中。讓我們來編寫cat.py

# -*- coding: utf-8 -*-import scrapyfrom image.items import ImageItemclass CatSpider(scrapy.Spider): name = cat allowed_domains = [win4000.com] #把初始地址改為我們的目標地址 start_urls = [http://www.win4000.com/zt/mao_1.html] def parse(self, response): #new一個Item對象 item = ImageItem() lis = response.xpath("/html/body/div[4]/div/div[3]/div[1]/div[1]/div[2]/div/div/ul/li") for li in lis: item[title] = li.xpath("./a/@title").extract()[0] item[url] = li.xpath("./a/@href").extract()[0] yield item

這裡我們做了2個操作,第一更改start_urls ,第二提取response中的數據。

spider為我們提供了3中提取數據的方法,XPath選擇器、CSS選擇器、正則匹配

我這裡用的是xpath選擇器,提取lis我寫這麼長是因為該頁面有3個結構一樣的div,所以只好精確定位了。其實也不用自己打。

右擊目標元素,copy XPath就行了

然後用,XPath Helper查看一下選擇是否正確,這裡我們看到篩選出來24個元素,是正確的。當然我們也可以用scrapy的shell命令進行查看。

在cmd命令行中輸入:

scrapy shell "http://www.win4000.com/zt/mao_1.html"

獲得該頁面的request對象,你可以嘗試各種提取。比如:

response.xpath("/html/body/div[4]/div/div[3]/div[1]/div[1]/div[2]/div/div/ul/li")

3.編寫pipelines,處理item

首先打開pipelines.py

# -*- coding: utf-8 -*-# Define your item pipelines here## Dont forget to add your pipeline to the ITEM_PIPELINES setting# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlclass ImagePipeline(object): def process_item(self, item, spider): return item

裡面有一些提示和一個Pipeline類,我們編寫process_item來處理item,該方法返回一個item是因為,pipelines.py這個文件中可以存在多個Pipeline類,來處理item,我們可以人為設置優先順序,讓它們依次處理同一個item,如果該方法不return item,那麼優先順序比該類低的Pipeline類就得不到item了。

class ImagePipeline(object): def process_item(self, item, spider): with open(data.txt,a) as f: f.write(str(dict(item))+
) return item

我們把得到的數據存放在一個txt文件中。

# Dont forget to add your pipeline to the ITEM_PIPELINES setting

所以最後我們來編寫settings.py

4.編寫settings

settings.py就是配置文件,我們也可以把自己的一些配置變數也放到這裡面來。介紹幾個常用的吧。

DOWNLOAD_TIMEOUT:下載器在超時前等待的時間量,默認180秒。

DOWNLOAD_DELAY :對同一網站的連續訪問間隔的時間,控制爬取速度。

ROBOTSTXT_OBEY : 是否遵循robots協議

本次體驗我們只需要修改ITEM_PIPELINES ,大概在67行,我們只需要取消注釋就可以了

當你有多個Pipeline的時候,就可以把你自己寫的添加上去,後面的數值代表優先順序,數值越小優先順序越大。

最後讓我們來運行爬蟲吧!在cmd中輸入scrapy crawl spiderName

E:衍生文件收納scrapy項目imageimage>scrapy crawl cat

運行完我們得到了24個結果。因為沒有設置data.txt的目錄,所以在pipelines.py的同級目錄下,我們打開看一下吧,注意把編碼設置為GBK。

寫的有點啰嗦,總算是把第一步完成了。自動翻頁,和圖片下載在下一篇中。


推薦閱讀:

Pandas入門基本知識
OpenCV3計算機視覺 Python語言實現(3)
Python數據結構與演算法視頻教程發布啦
從零開始的python世界的闖蕩之視頻學習篇 第十五話 多進程
如何用 Python 可視化《三國》人物與兵器出現頻率?(視頻教程)

TAG:爬蟲計算機網路 | scrapy | Python |