python 爬蟲之深度爬蟲(CrawlSpider)

1.深度爬蟲crawlspider

scrapy.spiders.CrawlSpider

創(chuàng)建項(xiàng)目:scrapy startproject <project_name>

創(chuàng)建爬蟲:scrapy genspider -t crawl <spider_name> <domains>

核心處理規(guī)則:from scrapy.spiders import CrawlSpider,Rule

核心處理提取:from scrapy.linkextractors import LinkExtractor

2.鏈接提?。篖inkExtractor

class scrapy.contrib.linkextractor.sgml.SgmlLinkExtractor(
        allow = (),                  #符合正則表達(dá)式參數(shù)的數(shù)據(jù)會(huì)被提取
        deny = (),                   #符合正則表達(dá)式參數(shù)的數(shù)據(jù)會(huì)禁止提取
        allow_domains = (),          #包含在域名中可以提取數(shù)據(jù)
        deny_domains = (),           #包含在域名中禁止提取數(shù)據(jù)
        deny_extensions = (),       
        restrict_xpath = (),         #使用xpath提取數(shù)據(jù),和allow共同起作用
        tags = (),                   #根據(jù)標(biāo)簽名稱提取數(shù)據(jù)
        attrs = (),                  #根據(jù)標(biāo)簽屬性提取數(shù)據(jù)
        canonicalize = (),
        unique = True,               #剔除重復(fù)鏈接請(qǐng)求
        process_value = None
)

classscrapy.contrib.spiders.CrawlSpider
爬取一般網(wǎng)站常用的spider。其定義了一些規(guī)則(rule)來提供跟進(jìn)link的方便的機(jī)制。 也許該spider并不是完全適合您的特定網(wǎng)站或項(xiàng)目,但其對(duì)很多情況都使用。 因此您可以以其為起點(diǎn),根據(jù)需求修改部分方法。當(dāng)然您也可以實(shí)現(xiàn)自己的spider。
除了從Spider繼承過來的(您必須提供的)屬性外,其提供了一個(gè)新的屬性:
rules
一個(gè)包含一個(gè)(或多個(gè)) Rule
對(duì)象的集合(list)。 每個(gè) Rule
對(duì)爬取網(wǎng)站的動(dòng)作定義了特定表現(xiàn)。 Rule對(duì)象在下邊會(huì)介紹。 如果多個(gè)rule匹配了相同的鏈接,則根據(jù)他們?cè)诒緦傩灾斜欢x的順序,第一個(gè)會(huì)被使用。
該spider也提供了一個(gè)可復(fù)寫(overrideable)的方法:
parse_start_url(response)
當(dāng)start_url的請(qǐng)求返回時(shí),該方法被調(diào)用。 該方法分析最初的返回值并必須返回一個(gè) Item
對(duì)象或者 一個(gè) Request
對(duì)象或者 一個(gè)可迭代的包含二者對(duì)象。

3.爬取規(guī)則

rules = [
    Rule(
        link_extractor,     # LinkExtractor對(duì)象
        callback=None,      # 請(qǐng)求到響應(yīng)數(shù)據(jù)時(shí)的回調(diào)函數(shù)
        cb_kwargs=None,     # 調(diào)用函數(shù)設(shè)置的參數(shù)
        follow=None,        # 是否從response跟進(jìn)鏈接:不要指定為parse
        process_links=None, # 過濾linkextractor列表,每次獲取列表時(shí)都會(huì)調(diào)用
        process_request=None    # 過濾request,每次提取request都會(huì)調(diào)用
    )
]

classscrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None,process_links=None, process_request=None)
link_extractor
是一個(gè) Link Extractor 對(duì)象。 其定義了如何從爬取到的頁面提取鏈接。
callback
是一個(gè)callable或string(該spider中同名的函數(shù)將會(huì)被調(diào)用)。 從link_extractor中每獲取到鏈接時(shí)將會(huì)調(diào)用該函數(shù)。該回調(diào)函數(shù)接受一個(gè)response作為其第一個(gè)參數(shù), 并返回一個(gè)包含Item
以及(或) Request
對(duì)象(或者這兩者的子類)的列表(list)。
警告
當(dāng)編寫爬蟲規(guī)則時(shí),請(qǐng)避免使用 parse作為回調(diào)函數(shù)。 由于 CrawlSpider 使用 parse方法來實(shí)現(xiàn)其邏輯,如果 您覆蓋了 parse方法,crawl spider 將會(huì)運(yùn)行失敗。
cb_kwargs 包含傳遞給回調(diào)函數(shù)的參數(shù)(keyword argument)的字典。
follow 是一個(gè)布爾(boolean)值,指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進(jìn)。 如果callback 為None, follow 默認(rèn)設(shè)置為 True ,否則默認(rèn)為 False 。
process_links 是一個(gè)callable或string(該spider中同名的函數(shù)將會(huì)被調(diào)用)。 從link_extractor中獲取到鏈接列表時(shí)將會(huì)調(diào)用該函數(shù)。該方法主要用來過濾
process_request 是一個(gè)callable或string(該spider中同名的函數(shù)將會(huì)被調(diào)用)。 該規(guī)則提取到每個(gè)request時(shí)都會(huì)調(diào)用該函數(shù)。該函數(shù)必須返回一個(gè)request或者None。 (用來過濾request)

CrawlSpider樣例

import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        # 提取匹配 'category.php' (但不匹配 'subsection.php') 的鏈接并跟進(jìn)鏈接(沒有callback意味著follow默認(rèn)為True)
        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # 提取匹配 'item.php' 的鏈接并使用spider的parse_item方法進(jìn)行分析
        Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.log('Hi, this is an item page! %s' % response.url)

        item = scrapy.Item()
        item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
        item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
        item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
        return item

該spider將從example.com的首頁開始爬取,獲取category以及item的鏈接并對(duì)后者使用 parse_item
方法。 當(dāng)item獲得返回(response)時(shí),將使用XPath處理HTML并生成一些數(shù)據(jù)填入 Item

4.如何在pycharm中啟動(dòng)爬蟲程序

在項(xiàng)目下創(chuàng)建start.py文件

# -*- coding:utf-8 -*-
from scrapy import cmdline  #引入命令行
cmdline.execute('scrapy crawl dang'.split())

運(yùn)行文件即可

點(diǎn)擊Edit Configurations

添加python文件

配置完畢后,點(diǎn)擊ok

點(diǎn)擊運(yùn)行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 13,079評(píng)論 4 46
  • Spiders Spider類定義了如何爬取某個(gè)網(wǎng)站。包括了爬取的動(dòng)作(例如:是否跟進(jìn)鏈接)以及如何從網(wǎng)頁的內(nèi)容中...
    cnkai閱讀 1,602評(píng)論 1 4
  • 總結(jié)一下之前的spider,總的來說,Spider類就是定義了如何爬取某個(gè)(或某些)網(wǎng)站。包括了爬取的動(dòng)作以及如何...
    王小魚鱻閱讀 1,292評(píng)論 0 2
  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬蟲入門教程一 安裝和基本使用Scr...
    inke閱讀 35,851評(píng)論 7 93
  • 天天向上你最棒,勤奮好學(xué)日日忙。 少年立志苦讀書,長(zhǎng)大行遍萬里路。 尊老愛幼記心上,走到哪里不能忘。 做個(gè)文明好孩...
    hwc閱讀 364評(píng)論 0 0

友情鏈接更多精彩內(nèi)容