開頭來波小程序搖一搖:php
最近皮爺讀書,看到了一個很牛逼的理論:html
注意力 > 時間 > 金錢複製代碼
具體怎麼理解,各位看官各有各的理解,我就很少說了。面試
近幾篇文章,能夠說的上是精品文章,並且是精品中的精品。請諸位看官仔細閱讀。我準備給你們好好的說道說道Scrapy的爬蟲具體應該怎麼寫,怎麼用CrawSpider,這幾篇文章,算是一個進階內容,短期暴力進階?具體目標:讀過文章以後,你就能夠寫一個通用的爬蟲,超級靈活的爬蟲。shell
如今看來,市面上大部分關於講爬蟲的文章,均可以算是入門級別。雖然有些文章說的很巧,好比有些場合適合用requests直接寫啊,有些場合用NumPy就能夠搞定,還有些場合沒有必要用Scrapy這麼厲害的框架來作之類的。可見,你學習爬蟲現在面臨這麼幾個問題和思考:編程
綜上所述,纔有了這幾篇爬蟲進階文章,專門爲你拔高 Scrapy 的使用上限。等你讀完,你就知道,以前你本身寫的 Scrapy 爬蟲,都是屎,相信我,你確定會有,我本身就有這種感受。小程序
既然是乾貨公號,那麼咱們基本就是以實戰爲主。不知你們是否還看過我以前寫的一篇文章『Python爬蟲加速神器的牛刀小試,就問你怕不怕』,沒有看過的,能夠在公衆號裏面的歷史文章裏面查閱,這篇文章主要就是講了一下用 aiohttp 來作爬蟲。目標是爬取的美劇排行榜裏面的信息。bash
目標網頁是下面這個:框架
http://www.ttmeiju.me/index.php/summary/index/p/1.html複製代碼
長這個樣子:
scrapy
那篇文章只是簡單的介紹一下 aiohttp 的使用,其實並不能做爲爬蟲生產工具。因此,從這篇文章開始,我會系統的給大家講解 Scrapy ,最後讓大家能夠產出一個能夠實際生產的爬蟲工具。ide
在此以前,皮爺寫的爬蟲,基本上都是選用的 scrapy.Spider 裏面的最基本款,即 spider。其實 scrapy 的 spider 還有好多種:CrawlSpider, XMLFeedSpider, CSVFeedSpider, SitemapSpider。今天咱們作通用爬蟲的須要用到 CrawSpider。
仍是很簡單,和上回同樣,爬取全部排行榜網頁(總共36頁),而後將每一條的關鍵信息存到一個類裏面,最後把全部信息存入到阿里雲上的 MongoDB 裏面。
此次,咱們準備用 CrawlSpider 來作。
CrawlSpider 是 scrapy.Spider 的一個子類,他是在原有 spider 上面的擴展。他擁有父類全部的特性,同時也有本身獨特的地方:經過 Rule 來提取網頁信息。
通俗的說,就是爬蟲經過開發者定義的爬取規則(Rule),來從網頁信息裏面提取 link,而後作相應的操做處理。
這其中,咱們使用 xpath 來作提取器,固然也可使用CSS selector,可是咱們再也不使用 BeautifulSoup。雖然 BeautifulSoup 寫起來更加簡單易懂,適合萌新使用,可是從速度方面考慮, xpath 要更勝一籌,並且若是運用熟練以後, xpath 的開發速度是要比 BeautifulSoup 快不少的。
建立 Scrapy 項目很簡單,咱們只須要在終端裏面輸入指令就好。若是對 Scrapy 命令不是很熟悉的,能夠選擇百度,也能夠選擇輸入 scrapy --help
來查看幫助文檔。
固然,若是遇到哪一個 scrapy 的指令不會,也能夠用 --help
來查看文檔。
建立項目,只須要挨個輸入如下命令就能夠了:
$ scrapy startproject HellProject$ cd HellProject/$ scrapy genspider -t crawl playranking www.ttmeiju.me複製代碼
這一系列命令敲好以後,咱們就成功的建立了咱們的 Scrapy 工程。下面,咱們用 PyCharm 打開,就長下面這個樣子:
至此,建立項目的任務就告一段落,接下來就是咱們的擼碼環節。
這裏咱們是經過命令行 scrapy genspider -t crawl <spiderName> <hostAddress>
建立的CrawlSpider,並不是以前的 scrapySpider,因此,代碼的樣子長得和以前有所區別。
其實,CrawlSpider最關鍵的部分就是紅色框框裏面的 rules 的編寫。由於 CrawlSpider 每次會按照 rules 的規則來提取出來頁面中的 link,再遍歷訪問全部提取出來的 link,處理爬取結果。
因此,針對咱們這裏的需求,咱們能夠預估出來咱們只要寫一個 Rule 就能夠,即:
每一頁面最下面的 頁數 部分,並且,咱們只要提取出來 下一頁
的連接就能夠,即圖中藍色圈圈對應的地方。咱們檢查
網頁:
發現 >>
對應的是一個 ul
標籤底下的 a
標籤,而且這個 a
標籤有明顯的特徵,就是 class=next
,這就簡單了。
咱們這裏爲了提取網頁信息內容,再也不採起以前的BeautifulSoup 方法,並且採起更加快捷的 xpath 方法來提取分析網頁。
剛開始接觸 xpath 的同窗,可能對我這裏的寫法有一些跳躍,可是不要慌,等你看完個人這幾篇文章以後,我在項目裏面所用到的 xpath 的那幾種寫法,其實就已經徹底可以覆蓋到你 95% 以上的平常所需了。因此,別慌,靜下心來細細讀文章。
接着說,咱們這裏要編寫 Rule, 看到項目例子裏面給的是一個叫 LinkExtractor 的東西,這個從字面意思就能看出來是一個 Link提取器,咱們這裏就照貓畫虎的來寫咱們第一個 LinkExtractor 。
因爲咱們是採用 xpath 來定位數據,這裏多給你們說一個調試 xpath 的小技巧: 使用 scrapy shell
來進行調試!!!
在終端,直接輸入 $ scrapy shell
命令,就進入了大名鼎鼎的 scrapy shell 裏面了。退出scrapy shell直接輸入 exit
而後按回車便可。
咱們要在:
http://www.ttmeiju.me/index.php/summary/index/p/1.html複製代碼
這個頁面調用 xpath 來分析,因此,咱們有兩種方式來調試:
$ scrapy shell
進入 shell 中,而後直接調用 fetch()
函數便可,括號裏面填寫要訪問的url地址。$ scrapy shell http://www.ttmeiju.me/index.php/summary/index/p/1.html
,即在最後一個參數直接跟頁面url便可。我採用的是第二種方法,成功打開shell以後長下面這個樣子:
其實到這裏,shell 已經將咱們的頁面訪問過了,而且放到了 response 裏面,你直接輸入 response
、 response.text
或者 response.body
是能夠看到結果的。
在這個 shell 界面,咱們就能夠調試 xpath 了,怎麼調試?這麼調試,直接寫代碼:
response.xpath('//ul//a[@class="next"]')response.xpath('//ul//a[@class="next"]').extract()response.xpath('//ul//a[@class="next"]//text()').extract()複製代碼
這三個對應的就是你要的在 ul
標籤下的 a
標籤,而且 a
標籤的 class=next
:
你看,這裏是否是提取出來的 text
是 >>
?
若是你要提取別的東西,直接輸入 response.xpath()
括號裏面填寫選擇條件便可:
這個就是選出來頁面中全部的 li
標籤。
接下來咱們就返回來看咱們的 LinkExtractor 怎麼寫:
rules = ( Rule(LinkExtractor(restrict_xpaths='//ul[@class="pagination"]//a[@class="next"]'), callback='parse_item', follow=True), )複製代碼
看到這裏咱們就把以前的xpath的 (Items/)
改成 (//ul[@class="pagination"]//a[@class="next"])
。
同時,咱們把 start_urls
改成:
start_urls = ['http://www.ttmeiju.me/']複製代碼
稍微修改一下底下的 parse_item() 函數:
def parse_item(self, response): print(response.url)複製代碼
咱們的目的就是看咱們的爬蟲是否能夠順利的一頁一頁的按照 下一頁
來爬取網頁,而後咱們經過命令 scrapy crawl playranking
運行一下爬蟲,看一下結果:
這裏能夠看到,log裏面順利的打出了從 1 ~ 36 頁的 URL,證實咱們的程序沒有問題。那麼接下來的爬蟲,咱們將在以後的章節講述。
這裏說一下哈,全部的爬蟲代碼,我均已發佈到網上了,獲取方法很簡單,關注公號『皮爺擼碼』,回覆『代碼』便可找到,記住對應的代碼編號是『CS001』,代碼編號是『CS001』,代碼編號是『CS001』。
『皮爺擼碼』,一個很硬核的公號,若是你能從這裏學到知識,皮爺很高興,很但願你也可以將這分內容分享出去,讓更多的人感覺到編程的樂趣。