爬取的目標網站是:
http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1
目的是爬取每一個教程的標題,作者,時間和詳細內容
通過下面的命令可以快速創建 CrawlSpider模板 的代碼:
scrapy genspider wsapp wxapp-union.com
CrawlSpider是Spider的派生類,Spider類的設計原則是只爬取start_url列表中的網頁,而CrawlSpider類定義了一些規則(rule)來提供跟進link的方便的機制,從爬取的網頁中獲取link並繼續爬取的工作更適合。
在之前爬取免費代理的爬蟲里面,我們沒有使用crawlspider,當我們想要爬取下一頁的時候,采用的是xpath解析response,找到下一頁的鏈接,然后再次請求
但是這樣的弊端在於難以靈活爬取網站,因此這里我們使用crawlspider來讓爬取任務更簡單。
CrawlSpider
繼承自Spider
, 爬取網站常用的爬蟲,其定義了一些規則(rule
)方便追蹤或者是過濾link。 也許該spider並不完全適合您的特定網站或項目,但其對很多情況都是適用的。 因此您可以以此為基礎,修改其中的方法,當然您也可以實現自己的spider
。
除了從Spider
繼承過來的(您必須提供的)屬性外,其提供了一個新的屬性:
- rules
一個包含一個(或多個) Rule
對象的集合(list)。 每個 Rule
對爬取網站的動作定義了特定表現。 Rule
對象在下邊會介紹。 如果多個rule匹配了相同的鏈接,則根據他們在本屬性中被定義的順序,第一個會被使用。
該spider也提供了一個可復寫(overrideable
)的方法:
- parse_start_url(response)
當start_url
的請求返回時,該方法被調用。 該方法分析最初的返回值並必須返回一個 Item
對象或者 一個 Request
對象或者 一個可迭代的包含二者對象。
這里我們使用rules設置規則爬取我們需要的鏈接。
因為我們需要爬取教程,點擊下一頁之后發現網頁鏈接的變化是page,即第一頁到第二頁的變化是page=1變成了page=2
/portal.php?mod=list&catid=2&page=1
如果有爬蟲經驗的話這里應該很容易理解
可以知道頁數鏈接是在類似於list&catid=2&page=x這種格式的鏈接里面
接着我們查看每一頁里面的每一篇文章的鏈接,比如:
http://www.wxapp-union.com/article-5798-1.html
可知教程的詳情是在類似於article-xxx.html這種格式的鏈接里面
所以我們可以在rules里面編寫這兩條規則
rules = ( Rule(LinkExtractor(allow=r'.+list&catid=2&page=\d+'), follow=True), Rule(LinkExtractor(allow=r'.+article-.+\.html'), callback='parse_detail', follow=False), )
我們需要使用LinkExtractor和Rule這兩個東西來決定爬蟲的具體走向
需要注意的是:
1,allow設置規則的方法:要能夠限制在我們想要的url上面,不是和其他url產生相同的正則表達式即可
在我們這里設置的rules里面,使用 .+來匹配任意字符,\d+來匹配page后面的數字
2,什么情況下使用follow:如果在爬取頁面的時候,需要將滿足當前條件的url在進行跟進,那么就設置為Ture,否則設置為False
在我們的這個例子里面,對於這個界面,我們選擇了跟進:
因為我們在這個頁面里再爬取教程的詳情頁面,所以需要跟進
而在這個頁面我們沒有跟進:
因為我們到了這個頁面並且獲取了教程詳細信息之后,這個頁面對於我們來說就已經無用了,雖然在這個頁面的旁邊可能還有其他的教程詳情鏈接等待我們去點擊,但是這些詳情鏈接我們會在其他的地方爬取到的,雖然scrapy里面自動會去重,但我們為了省事,得到我們需要的東西之后就終止爬蟲對於這個頁面的探索,這樣爬蟲脈絡更清晰一點
3,什么情況下該指定callback:如果這個url對應的頁面,只是為了獲取更多的url,並不需要里面的數據,那么可以不指定callback,如果想要獲取url對應頁面中的數據,那么就需要指定一個callback
callback里面的函數是我們對於頁面進行詳細解析的回調函數。我們需要對詳細教程頁的教程內容進行分析,所以需要callback,而在portal.php?mod=list&catid=2&page=1這一類頁面里,我們僅僅是想要獲取更多的詳細教程的鏈接,也不需要更多的處理,所以不使用callback
除了這些之外,其他的地方跟原來的spider大致相同,爬取到的詳細內容保存在了json文件里面
代碼放在了github上面,歡迎Star
https://github.com/Cl0udG0d/scrapy_demo
參考鏈接:
https://geek-docs.com/scrapy/scrapy-tutorials/scrapy-crawlspider.html
https://www.kancloud.cn/ju7ran/scrapy/1364596
https://www.cnblogs.com/derek1184405959/p/8451798.html
https://www.bilibili.com/video/av57909837?p=8