Scrapy爬蟲進階操做之CrawlSpider(一)

開頭來波小程序搖一搖:php

最近皮爺讀書,看到了一個很牛逼的理論:html

注意力 > 時間 > 金錢複製代碼

具體怎麼理解,各位看官各有各的理解,我就很少說了。面試

近幾篇文章,能夠說的上是精品文章,並且是精品中的精品。請諸位看官仔細閱讀。我準備給你們好好的說道說道Scrapy的爬蟲具體應該怎麼寫,怎麼用CrawSpider,這幾篇文章,算是一個進階內容,短期暴力進階?具體目標:讀過文章以後,你就能夠寫一個通用的爬蟲,超級靈活的爬蟲。shell

如今看來,市面上大部分關於講爬蟲的文章,均可以算是入門級別。雖然有些文章說的很巧,好比有些場合適合用requests直接寫啊,有些場合用NumPy就能夠搞定,還有些場合沒有必要用Scrapy這麼厲害的框架來作之類的。可見,你學習爬蟲現在面臨這麼幾個問題和思考:編程

  1. 市面上的爬蟲文章種類繁多,並且方法各異,對於萌新選擇入門學習形成困擾,由於太多了。
  2. 種類繁多,百花爭鳴是好事兒,並且豐富了你們的眼界,但是,你是否曾想過,你學習爬蟲是爲了幹什麼?
  3. 爬蟲若是是爲了本身玩,那麼,學習百家戲,確實沒有問題;可是若是爲了面試找工做呢?
  4. 不少萌新是讀大學的學生,他們基礎比較差(不要嫌我說的重,如今大學生的基礎,確實不好,不信你工做幾年回頭看當時的本身,固然,若是你工做也不進步的話,能夠忽略我說的),因此,他們的目標很簡單,就是爲了求職找工做。
  5. 若是爲了面試,那麼你有沒有想過用人單位最須要什麼樣的人啊?固然是面試經過以後就能直接來上班的人。什麼樣的人能上班?固然是會使用企業爬蟲框架的人啊。
  6. 這就引出了一個新的問題:什麼爬蟲框架企業會使用?
  7. 目前來講,通常企業用的都是本身修改過的Scrapy框架,因此,你若是學好Scrapy框架的話,對於找工做頗有優點。
  8. 再多一句,你若是有所研究Scrapy爬蟲框架的話,那麼對於其餘的爬蟲框架或者原理,你也能夠作到舉一反三的層面。

綜上所述,纔有了這幾篇爬蟲進階文章,專門爲你拔高 Scrapy 的使用上限。等你讀完,你就知道,以前你本身寫的 Scrapy 爬蟲,都是屎,相信我,你確定會有,我本身就有這種感受。小程序

既然是乾貨公號,那麼咱們基本就是以實戰爲主。不知你們是否還看過我以前寫的一篇文章『Python爬蟲加速神器的牛刀小試,就問你怕不怕』,沒有看過的,能夠在公衆號裏面的歷史文章裏面查閱,這篇文章主要就是講了一下用 aiohttp 來作爬蟲。目標是爬取的美劇排行榜裏面的信息。bash

目標網頁是下面這個:框架

http://www.ttmeiju.me/index.php/summary/index/p/1.html複製代碼

長這個樣子:
scrapy

那篇文章只是簡單的介紹一下 aiohttp 的使用,其實並不能做爲爬蟲生產工具。因此,從這篇文章開始,我會系統的給大家講解 Scrapy ,最後讓大家能夠產出一個能夠實際生產的爬蟲工具。ide

0x00_序

在此以前,皮爺寫的爬蟲,基本上都是選用的 scrapy.Spider 裏面的最基本款,即 spider。其實 scrapy 的 spider 還有好多種:CrawlSpider, XMLFeedSpider, CSVFeedSpider, SitemapSpider。今天咱們作通用爬蟲的須要用到 CrawSpider。

0x01_需求分析

仍是很簡單,和上回同樣,爬取全部排行榜網頁(總共36頁),而後將每一條的關鍵信息存到一個類裏面,最後把全部信息存入到阿里雲上的 MongoDB 裏面。

此次,咱們準備用 CrawlSpider 來作。

0x02_CrawlSpider

CrawlSpider 是 scrapy.Spider 的一個子類,他是在原有 spider 上面的擴展。他擁有父類全部的特性,同時也有本身獨特的地方:經過 Rule 來提取網頁信息。

通俗的說,就是爬蟲經過開發者定義的爬取規則(Rule),來從網頁信息裏面提取 link,而後作相應的操做處理。

這其中,咱們使用 xpath 來作提取器,固然也可使用CSS selector,可是咱們再也不使用 BeautifulSoup。雖然 BeautifulSoup 寫起來更加簡單易懂,適合萌新使用,可是從速度方面考慮, xpath 要更勝一籌,並且若是運用熟練以後, xpath 的開發速度是要比 BeautifulSoup 快不少的。

0x03_建立項目

建立 Scrapy 項目很簡單,咱們只須要在終端裏面輸入指令就好。若是對 Scrapy 命令不是很熟悉的,能夠選擇百度,也能夠選擇輸入 scrapy --help 來查看幫助文檔。

固然,若是遇到哪一個 scrapy 的指令不會,也能夠用 --help 來查看文檔。

建立項目,只須要挨個輸入如下命令就能夠了:

$ scrapy startproject HellProject$ cd HellProject/$ scrapy genspider -t crawl playranking www.ttmeiju.me複製代碼

這一系列命令敲好以後,咱們就成功的建立了咱們的 Scrapy 工程。下面,咱們用 PyCharm 打開,就長下面這個樣子:

至此,建立項目的任務就告一段落,接下來就是咱們的擼碼環節。

0x05_編寫CrawlSpider

這裏咱們是經過命令行 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 來分析,因此,咱們有兩種方式來調試:

  1. 終端經過命令 $ scrapy shell 進入 shell 中,而後直接調用 fetch() 函數便可,括號裏面填寫要訪問的url地址。
  2. 或者直接在命令行輸入後 $ scrapy shell http://www.ttmeiju.me/index.php/summary/index/p/1.html ,即在最後一個參數直接跟頁面url便可。

我採用的是第二種方法,成功打開shell以後長下面這個樣子:

其實到這裏,shell 已經將咱們的頁面訪問過了,而且放到了 response 裏面,你直接輸入 responseresponse.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』。

皮爺擼碼』,一個很硬核的公號,若是你能從這裏學到知識,皮爺很高興,很但願你也可以將這分內容分享出去,讓更多的人感覺到編程的樂趣。

相關文章
相關標籤/搜索