三十三、scrapy的crawlspider爬蟲
阿新 • • 發佈:2018-12-27
1.crawlspider是什麼
回顧之前的程式碼中,我們有很大一部分時間在尋找下一頁的url地址或者是內容的url地址上面,這個過程能更簡單一些麼?
思路:
- 從response中提取所有的滿足規則的url地址
- 自動的構造自己requests請求,傳送給引擎
對應的crawlspider就可以實現上述需求,能夠匹配滿足條件的url地址,組裝成Reuqest物件後自動傳送給引擎,同時能夠指定callback函式,即:crawlspider爬蟲可以按照規則自動獲取連線
crawlspider的作用:crawlspider可以按照規則自動獲取連線
2.建立crawlspider爬蟲並觀察爬蟲內的預設內容
2.1 建立crawlspider爬蟲:
scrapy genspider -t crawl tencent xxx
2.2 spider中預設生成的內容如下:
class TencentSpider(CrawlSpider):
name = 'itcast1'
allowed_domains = ['hr.tencent.com']
start_urls = ['http://hr.tencent.com']
rules = (
Rule(LinkExtractor( allow=r'Items/'), callback='parse_item', follow=True),
)
def parse_item(self, response):
i = {}
#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
#i['name'] = response.xpath('//div[@id="name"]').extract()
#i['description'] = response.xpath('//div[@id="description"]').extract()
return i
2.3 觀察跟普通的scrapy.spider的區別
在crawlspider爬蟲中,沒有parse函式
重點在rules中:
- rules是一個元組或者是列表,包含的是Rule物件
- Rule表示規則,其中包含LinkExtractor,callback和follow等引數
LinkExtractor:連線提取器,可以通過正則或者是xpath來進行url地址的匹配
callback :表示經過連線提取器提取出來的url地址響應的回撥函式,可以沒有,沒有表示響應不會進行回撥函式的處理
follow:連線提取器提取的url地址對應的響應是否還會繼續被rules中的規則進行提取,True表示會,Flase表示不會
3. crawlspider騰訊招聘爬蟲
通過crawlspider爬取騰訊招聘的詳情頁的招聘資訊
思路分析:
- 定義一個規則,來進行列表頁翻頁,follow需要設定為True
- 定義一個規則,實現從列表頁進入詳情頁,並且指定回撥函式
- 在詳情頁提取資料
注意:連線提取器LinkExtractor中的allow對應的正則表示式匹配的是href屬性的值
4.crawlspider使用的注意點:
- 除了用命令scrapy genspider -t crawl <爬蟲名> <allowed_domail>建立一個crawlspider的模板,還可以手動建立
- crawlspider中不能再有以parse為名的資料提取方法,該方法被crawlspider用來實現基礎url提取等功能
- Rule物件中LinkExtractor為固定引數,其他callback、follow為可選引數
不指定callback且follow為True的情況下,滿足rules中規則的url還會被繼續提取和請求 - 如果一個被提取的url滿足多個Rule,那麼會從rules中選擇一個滿足匹配條件的Rule執行
5 瞭解crawlspider其他知識點
(1)連結提取器LinkExtractor的更多常見引數
- allow: 滿足括號中的’re’表示式的url會被提取,如果為空,則全部匹配
- deny: 滿足括號中的’re’表示式的url不會被提取,優先順序高於allow
- allow_domains: 會被提取的連結的domains(url範圍),如:[‘hr.tencent.com’, ‘baidu.com’]
- deny_domains: 不會被提取的連結的domains(url範圍)
- restrict_xpaths: 使用xpath規則進行匹配,和allow共同過濾url,即xpath滿足的範圍內的url地址會被提取,如:restrict_xpaths=’//div[@class=“pagenav”]’
(2)Rule常見引數
- LinkExtractor: 連結提取器,可以通過正則或者是xpath來進行url地址的匹配
- callback: 表示經過連線提取器提取出來的url地址響應的回撥函式,可以沒有,沒有表示響應不會進行回撥函式的處理
- follow: 連線提取器提取的url地址對應的響應是否還會繼續被rules中的規則進行提取,預設True表示會,Flase表示不會
- process_links: 當連結提取器LinkExtractor獲取到連結列表的時候呼叫該引數指定的方法,這個自定義方法可以用來過濾url,且這個方法執行後才會執行callback指定的方法
6 參考程式碼
- crawlspider的作用:crawlspider可以按照規則自動獲取連線
Tencent/spiders/tencent.py
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class TencentSpider(CrawlSpider):
name = 'tencent'
allowed_domains = ['hr.tencent.com']
start_urls = ['https://hr.tencent.com/position.php']
rules = (
# 列表頁
Rule(LinkExtractor(allow=r'position\.php\?&start=\d+#a'), follow=True),
# 詳情頁
Rule(LinkExtractor(allow=r'position_detail\.php\?id=\d+&keywords=&tid=0&lid=0'), callback='parse_item'),
)
def parse_item(self, response):
i = {}
# 崗位職責資料
i['job_content'] = response.xpath('//ul[@class="squareli"]/li/text()').extract()
print(i)
return i
Tencent/settings.py
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
ROBOTSTXT_OBEY = False