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需要使用LinkExtractorRule,這兩個東西決定爬蟲的具體走向。

  1. allow設置規則的方法:要能夠限制在我們想要的url上面,不要跟其他的url產生相同的正則表達式即可。
  2. 什麼情況下使用follow:如果在爬取頁面的時候,需要將滿足當前條件的url再進行跟進,那麼就設置爲True,否則設置爲False。
  3. 什麼情況下該指定callback:如果這個url對應的頁面,只是爲了獲取更多的url,並不需要裏面的數據,那麼可以不指定callback,如果想要獲取url對應頁面中的數據,那麼就需要指定一個callback。

其他博文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章