python 爬蟲之深度爬蟲(CrawlSpider)

1.深度爬蟲crawlspider

scrapy.spiders.CrawlSpider

創(chuà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.鏈接提认怼:LinkExtractor

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

classscrapy.contrib.spiders.CrawlSpider
爬取一般網(wǎng)站常用的spider呛牲。其定義了一些規(guī)則(rule)來提供跟進link的方便的機制。 也許該spider并不是完全適合您的特定網(wǎng)站或項目痘番,但其對很多情況都使用核无。 因此您可以以其為起點,根據(jù)需求修改部分方法款违。當然您也可以實現(xiàn)自己的spider唐瀑。
除了從Spider繼承過來的(您必須提供的)屬性外,其提供了一個新的屬性:
rules
一個包含一個(或多個) Rule
對象的集合(list)插爹。 每個 Rule
對爬取網(wǎng)站的動作定義了特定表現(xiàn)哄辣。 Rule對象在下邊會介紹。 如果多個rule匹配了相同的鏈接赠尾,則根據(jù)他們在本屬性中被定義的順序力穗,第一個會被使用。
該spider也提供了一個可復寫(overrideable)的方法:
parse_start_url(response)
當start_url的請求返回時气嫁,該方法被調(diào)用当窗。 該方法分析最初的返回值并必須返回一個 Item
對象或者 一個 Request
對象或者 一個可迭代的包含二者對象。

3.爬取規(guī)則

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

classscrapy.contrib.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None,process_links=None, process_request=None)
link_extractor
是一個 Link Extractor 對象崖面。 其定義了如何從爬取到的頁面提取鏈接。
callback
是一個callable或string(該spider中同名的函數(shù)將會被調(diào)用)梯影。 從link_extractor中每獲取到鏈接時將會調(diào)用該函數(shù)巫员。該回調(diào)函數(shù)接受一個response作為其第一個參數(shù), 并返回一個包含Item
以及(或) Request
對象(或者這兩者的子類)的列表(list)甲棍。
警告
當編寫爬蟲規(guī)則時简识,請避免使用 parse作為回調(diào)函數(shù)。 由于 CrawlSpider 使用 parse方法來實現(xiàn)其邏輯感猛,如果 您覆蓋了 parse方法财异,crawl spider 將會運行失敗。
cb_kwargs 包含傳遞給回調(diào)函數(shù)的參數(shù)(keyword argument)的字典唱遭。
follow 是一個布爾(boolean)值戳寸,指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進。 如果callback 為None拷泽, follow 默認設置為 True 疫鹊,否則默認為 False 。
process_links 是一個callable或string(該spider中同名的函數(shù)將會被調(diào)用)司致。 從link_extractor中獲取到鏈接列表時將會調(diào)用該函數(shù)拆吆。該方法主要用來過濾
process_request 是一個callable或string(該spider中同名的函數(shù)將會被調(diào)用)。 該規(guī)則提取到每個request時都會調(diào)用該函數(shù)脂矫。該函數(shù)必須返回一個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') 的鏈接并跟進鏈接(沒有callback意味著follow默認為True)
        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # 提取匹配 'item.php' 的鏈接并使用spider的parse_item方法進行分析
        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的鏈接并對后者使用 parse_item
方法庭再。 當item獲得返回(response)時捞奕,將使用XPath處理HTML并生成一些數(shù)據(jù)填入 Item

4.如何在pycharm中啟動爬蟲程序

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

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

運行文件即可

點擊Edit Configurations

添加python文件

配置完畢后牺堰,點擊ok

點擊運行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市颅围,隨后出現(xiàn)的幾起案子伟葫,更是在濱河造成了極大的恐慌,老刑警劉巖院促,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筏养,死亡現(xiàn)場離奇詭異,居然都是意外死亡常拓,警方通過查閱死者的電腦和手機渐溶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弄抬,“玉大人茎辐,你說我怎么就攤上這事∶级茫” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵废膘,是天一觀的道長竹海。 經(jīng)常有香客問我,道長丐黄,這世上最難降的妖魔是什么斋配? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮灌闺,結(jié)果婚禮上艰争,老公的妹妹穿的比我還像新娘。我一直安慰自己桂对,他們只是感情好甩卓,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕉斜,像睡著了一般逾柿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宅此,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天机错,我揣著相機與錄音,去河邊找鬼父腕。 笑死弱匪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的璧亮。 我是一名探鬼主播萧诫,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斥难,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了财搁?” 一聲冷哼從身側(cè)響起蘸炸,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尖奔,沒想到半個月后搭儒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡提茁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年淹禾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茴扁。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡铃岔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出峭火,到底是詐尸還是另有隱情毁习,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布卖丸,位于F島的核電站纺且,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稍浆。R本人自食惡果不足惜载碌,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衅枫。 院中可真熱鬧嫁艇,春花似錦、人聲如沸弦撩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽益楼。三九已至歧斟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間偏形,已是汗流浹背静袖。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俊扭,地道東北人队橙。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捐康。 傳聞我的和親對象是個殘疾皇子仇矾,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

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