Python爬蟲5.8 — scrapy框架CrawlSpider模塊的使用
綜述
本系列文檔用於對Python爬蟲技術的學習進行簡單的教程講解,鞏固自己技術知識的同時,萬一一不小心又正好對你有用那就更好了。
Python 版本是3.7.4
在前面的幾篇文章中我們對Scrapy框架做了整體的介紹說明,和一些基本功能的使用教程。下面我們就開始學習一些Scrapy框架的高級用法。
CrawlSpider 介紹
在上面的第一個糗事百科的爬蟲案例中,我們是自己在解析完整個頁面後獲取下一頁的url,然後重新發送一個請求。有時候我們想要這樣做,只要滿足某個條件的url,都要進行爬取。那麼這時候我們就可以通過CrawlSpider
來幫我們完成。CrawlSpider
繼承自Spider
,只不過是在之前的基礎上增加了新的功能,可以定義爬取的url的規則,以後scrapy碰到滿足條件的url都進行爬取,而不用手動的yield Request()
。
CrawlSpider 爬蟲
創建CrawlSpider爬蟲
之前創建爬蟲的方式是通過scrapy genspider [爬蟲名稱] [域名]
的方式創建的,如果想要創建CrawlSpider
爬蟲,那麼應該通過以下命令創建:
scrapy genspider -t crawl [爬蟲名字] [域名]
LinkExtractors鏈接提取器
使用LinkExtractors
可以不用程序員自己提取想要的url,然後發送請求。這些工作都可以交給LinkExtractors
,它會在所有爬的頁面中找到滿足規劃的url,實現自動的爬取。以下對LinkExtractors
類做一個簡單的介紹:
class scrapy.linkextractors.LinkExtractor {
allow = {},
deny = {},
allow_domains = {},
deny_domains = {},
deny_extensions = None,
restrict_xpath = {},
tags = ('a','area'),
attrs = ('href'),
canonicalize = True,
unique = True,
process_value = None
}
主要參數講解:
allow
: 所有滿足這個正則表達式的url都會被提取。deny
: 禁止的url,所有滿足這個正則表達式的url都不會被提取。allow_domains
: 允許的域名。只有在這個裏面指定的域名的url纔會被提取。deny_domains
: 禁止的域名,所有在這個裏面指定的域名的url都不會被提取。restrict_xpath
: 嚴格的xpath,和allow共同過濾鏈接。
Rule規則類
定義爬蟲的規則類,以下對這個類做一個簡單的介紹:
class scrapy.spider.Rule {
link_extractor,
callback = None,
cb_kwargs = None,
follow = None,
process_links = None,
process_request = None
}
主要參數講解:
link_extractor
: 一個LinkExtractor
對象,用於定義爬取規則。callback
: 滿足這個規則的url,應該要執行那個回調函數,因爲CrawlSpider
繼承類的底層使用了parse
作爲回調函數,因此如果在定義parse
就會覆蓋掉底層parse
函數從而會可能造成錯誤。follow
: 指定根據該規則從response中提取的鏈接是否需要跟進。process_link
: 從link_extractor中獲取到鏈接後會傳遞給這個函數,用來過濾不需要爬取的來鏈接。
微信小程序社區CrawlSpider使用案例
根據下列命令創建項目:
# 創建項目
scrapy startproject wxapp
# 創建爬蟲
scrapy genspider -t crawl wxapp_spider wxapp-union.com
進行修改setting.py
文件更改完善爬蟲配置,修改items.py
文件定義item內容(在這裏就不再貼這兩個文件的代碼)。然後在wxapp_spider.py
文件寫入如下代碼:
# -*- coding: utf-8 -*-
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from wxapp.items import WxappItem
class WxappSpiderSpider(CrawlSpider):
name = 'wxapp_spider'
allowed_domains = ['wxapp-union.com']
start_urls = ['http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1']
# 定義提取url地址規則
rules = (
# LinkExtractor鏈接提取器,獲取符合要求的url鏈接地址
# callback 提取出來的url地址的response會交給callback處理
# follow 當前url地址的相應是否重新經過Rules來提取url地址
Rule(LinkExtractor(allow=r'.+mod=list&catid=2&page=\d+'), follow=True),
Rule(LinkExtractor(allow=r'.+article-.+\.html'), callback="parse_detail", follow=False),
)
# parse函數有特殊功能,不能定義,此函數名已被底層使用,不能重新定義覆蓋
def parse_detail(self, response):
title = response.xpath('//h1[@class="ph"]/text()').get()
author_p = response.xpath('//p[@class="authors"]')
author = author_p.xpath('.//a/text()').get()
pub_time = author_p.xpath('.//span/text()').get()
content = response.xpath('//td[@id="article_content"]//text()').getall()
item = WxappItem(title=title, author=author, pub_time=pub_time, content=content)
yield item
在pipeline.py
中寫入相應的代碼進行保存數據,允許即可查看效果。
CrawlSpider總結
CrawlSpider需要使用LinkExtractor
和Rule
,這兩個東西決定爬蟲的具體走向。
- allow設置規則的方法:要能夠限制在我們想要的url上面,不要跟其他的url產生相同的正則表達式即可。
- 什麼情況下使用follow:如果在爬取頁面的時候,需要將滿足當前條件的url再進行跟進,那麼就設置爲True,否則設置爲False。
- 什麼情況下該指定callback:如果這個url對應的頁面,只是爲了獲取更多的url,並不需要裏面的數據,那麼可以不指定callback,如果想要獲取url對應頁面中的數據,那麼就需要指定一個callback。
其他博文鏈接
- Python爬蟲1.1 — urllib基礎用法教程
- Python爬蟲1.2 — urllib高級用法教程
- Python爬蟲1.3 — requests基礎用法教程
- Python爬蟲1.4 — requests高級用法教程
- Python爬蟲2.1 — BeautifulSoup用法教程
- Python爬蟲2.2 — xpath用法教程
- Python爬蟲3.1 — json用法教程
- Python爬蟲3.2 — csv用法教程
- Python爬蟲3.3 — txt用法教程
- Python爬蟲4.1 — threading(多線程)用法教程
- Python爬蟲4.2 — ajax(動態網頁數據抓取)用法教程
- Python爬蟲4.3 — selenium基礎用法教程
- Python爬蟲4.4 — selenium高級用法教程
- Python爬蟲4.5 — tesseract(圖片驗證碼識別)用法教程
- Python爬蟲5.1 — scrapy框架簡單入門
- Python爬蟲5.2 — scrapy框架pipeline模塊的使用
- Python爬蟲5.3 — scrapy框架spider[Request和Response]模塊的使用
- Python爬蟲5.4 — scrapy框架items模塊的使用
- Python爬蟲5.5 — scrapy框架logging模塊的使用
- Python爬蟲5.6 — scrapy框架setting模塊的使用
- Python爬蟲5.7 — scrapy框架Shell命令的使用