1. 程式人生 > >Scrapy系列教程(3)------Spider(爬蟲核心,定義連結關係和網頁資訊抽取)

Scrapy系列教程(3)------Spider(爬蟲核心,定義連結關係和網頁資訊抽取)

Spiders

Spider類定義瞭如何爬取某個(或某些)網站。包括了爬取的動作(例如:是否跟進連結)以及如何從網頁的內容中提取結構化資料(爬取item)。 換句話說,Spider就是您定義爬取的動作及分析某個網頁(或者是有些網頁)的地方。

對spider來說,爬取的迴圈類似下文:

  1. 以初始的URL初始化Request,並設定回撥函式。 當該request下載完畢並返回時,將生成response,並作為引數傳給該回調函式。

  2. 在回撥函式內分析返回的(網頁)內容,返回 Item 物件或者 Request 或者一個包括二者的可迭代容器。 返回的Request物件之後會經過Scrapy處理,下載相應的內容,並呼叫設定的callback函式(函式可相同)。

  3. 在回撥函式內,您可以使用 選擇器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 來分析網頁內容,並根據分析的資料生成item。

  4. 最後,由spider返回的item將被存到資料庫(由某些 Item Pipeline 處理)或使用 Feed exports 存入到檔案中。

雖然該迴圈對任何型別的spider都(多少)適用,但Scrapy仍然為了不同的需求提供了多種預設spider。 之後將討論這些spider。

Spider引數

Spider可以通過接受引數來修改其功能。 spider引數一般用來定義初始URL或者指定限制爬取網站的部分。 您也可以使用其來配置spider的任何功能。

在執行 crawl 時新增 -a 可以傳遞Spider引數:

scrapy crawl myspider -a category=electronics

Spider在構造器(constructor)中獲取引數:

import scrapy

class MySpider(Spider):
    name = 'myspider'

    def __init__(self, category=None, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self
.start_urls = ['http://www.example.com/categories/%s' % category] # ...

Spider引數也可以通過Scrapyd的 schedule.json API來傳遞。 參見 Scrapyd documentation.

內建Spider參考手冊

Scrapy提供多種方便的通用spider供您繼承使用。 這些spider為一些常用的爬取情況提供方便的特性, 例如根據某些規則跟進某個網站的所有連結、根據 Sitemaps 來進行爬取,或者分析XML/CSV源。

下面spider的示例中,我們假定您有個專案在 myproject.items 模組中聲明瞭 TestItem:

import scrapy

class TestItem(scrapy.Item):
    id = scrapy.Field()
    name = scrapy.Field()
    description = scrapy.Field()

Spider

classscrapy.spider.Spider

Spider是最簡單的spider。每個其他的spider必須繼承自該類(包括Scrapy自帶的其他spider以及您自己編寫的spider)。 Spider並沒有提供什麼特殊的功能。 其僅僅請求給定的start_urls/start_requests ,並根據返回的結果(resulting responses)呼叫spider的 parse 方法。

name

定義spider名字的字串(string)。spider的名字定義了Scrapy如何定位(並初始化)spider,所以其必須是唯一的。 不過您可以生成多個相同的spider例項(instance),這沒有任何限制。 name是spider最重要的屬性,而且是必須的。

如果該spider爬取單個網站(single domain),一個常見的做法是以該網站(domain)(加或不加字尾 )來命名spider。 例如,如果spider爬取 mywebsite.com ,該spider通常會被命名為mywebsite 。

allowed_domains

可選。包含了spider允許爬取的域名(domain)列表(list)。 當 OffsiteMiddleware 啟用時, 域名不在列表中的URL不會被跟進。

start_urls

URL列表。當沒有制定特定的URL時,spider將從該列表中開始進行爬取。 因此,第一個被獲取到的頁面的URL將是該列表之一。 後續的URL將會從獲取到的資料中提取。

start_requests()

該方法必須返回一個可迭代物件(iterable)。該物件包含了spider用於爬取的第一個Request。

當spider啟動爬取並且未制定URL時,該方法被呼叫。 當指定了URL時,make_requests_from_url() 將被呼叫來建立Request物件。 該方法僅僅會被Scrapy呼叫一次,因此您可以將其實現為生成器。

該方法的預設實現是使用 start_urls 的url生成Request。

如果您想要修改最初爬取某個網站的Request物件,您可以重寫(override)該方法。 例如,如果您需要在啟動時以POST登入某個網站,你可以這麼寫:

def start_requests(self):
    return [scrapy.FormRequest("http://www.example.com/login",
                               formdata={'user': 'john', 'pass': 'secret'},
                               callback=self.logged_in)]

def logged_in(self, response):
    # here you would extract links to follow and return Requests for
    # each of them, with another callback
    pass
make_requests_from_url(url)

該方法接受一個URL並返回用於爬取的 Request 物件。 該方法在初始化request時被start_requests() 呼叫,也被用於轉化url為request。

預設未被複寫(overridden)的情況下,該方法返回的Request物件中, parse() 作為回撥函式,dont_filter引數也被設定為開啟。 (詳情參見 Request).

parse(response)

當response沒有指定回撥函式時,該方法是Scrapy處理下載的response的預設方法。

parse 負責處理response並返回處理的資料以及(/或)跟進的URL。 Spider 對其他的Request的回撥函式也有相同的要求。

該方法及其他的Request回撥函式必須返回一個包含 Request 及(或) Item 的可迭代的物件。

引數: response (Response) – 用於分析的response
log(message[levelcomponent])

使用 scrapy.log.msg() 方法記錄(log)message。 log中自動帶上該spider的 name 屬性。 更多資料請參見 Logging 。

closed(reason)

當spider關閉時,該函式被呼叫。 該方法提供了一個替代呼叫signals.connect()來監聽spider_closed 訊號的快捷方式。

Spider樣例

讓我們來看一個例子:

import scrapy

class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/1.html',
        'http://www.example.com/2.html',
        'http://www.example.com/3.html',
    ]

    def parse(self, response):
        self.log('A response from %s just arrived!' % response.url)

另一個在單個回撥函式中返回多個Request以及Item的例子:

import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/1.html',
        'http://www.example.com/2.html',
        'http://www.example.com/3.html',
    ]

    def parse(self, response):
        sel = scrapy.Selector(response)
        for h3 in response.xpath('//h3').extract():
            yield MyItem(title=h3)

        for url in response.xpath('//a/@href').extract():
            yield scrapy.Request(url, callback=self.parse)

CrawlSpider

classscrapy.contrib.spiders.CrawlSpider

爬取一般網站常用的spider。其定義了一些規則(rule)來提供跟進link的方便的機制。 也許該spider並不是完全適合您的特定網站或專案,但其對很多情況都使用。 因此您可以以其為起點,根據需求修改部分方法。當然您也可以實現自己的spider。

除了從Spider繼承過來的(您必須提供的)屬性外,其提供了一個新的屬性:

rules

一個包含一個(或多個) Rule 物件的集合(list)。 每個 Rule 對爬取網站的動作定義了特定表現。 Rule物件在下邊會介紹。 如果多個rule匹配了相同的連結,則根據他們在本屬性中被定義的順序,第一個會被使用。

該spider也提供了一個可複寫(overrideable)的方法:

parse_start_url(response)

當start_url的請求返回時,該方法被呼叫。 該方法分析最初的返回值並必須返回一個 Item物件或者 一個 Request 物件或者 一個可迭代的包含二者物件。

爬取規則(Crawling rules)

classscrapy.contrib.spiders.Rule(link_extractorcallback=Nonecb_kwargs=Nonefollow=None,process_links=Noneprocess_request=None)

link_extractor 是一個 Link Extractor 物件。 其定義瞭如何從爬取到的頁面提取連結。

callback 是一個callable或string(該spider中同名的函式將會被呼叫)。 從link_extractor中每獲取到連結時將會呼叫該函式。該回調函式接受一個response作為其第一個引數, 並返回一個包含

相關推薦

Scrapy系列教程3------Spider爬蟲核心定義連結關係網頁資訊抽取

Spiders Spider類定義瞭如何爬取某個(或某些)網站。包括了爬取的動作(例如:是否跟進連結)以及如何從網頁的內容中提取結構化資料(爬取item)。 換句話說,Spider就是您定義爬取的動作及分析某個網頁(或者是有些網頁)的地方。 對spider

Scrapy系列教程6------怎樣避免被禁

order mil 設有 led ace set lin pac ont 避免被禁止(ban) 有些網站實現了特定的機制,以一定規則來避免被爬蟲爬取。 與這些規

【Web API系列教程3.2 — 實戰:處理資料新增模型控制器

前言 在本部分中,你將新增用於定義資料庫實體的模型類。然後你將新增用於在這些實體上執行CRUD(Create、Retrieve、Update、Delete——譯者注)操作的Web API 控制器。 新增模型類 在本教程中,我們將通過使用“Code Fi

Scrapy系列教程2------Item結構化資料儲存結構

擴充套件Item 您可以通過繼承原始的Item來擴充套件item(新增更多的欄位或者修改某些欄位的元資料)。 例如: class DiscountedProduct(Product): discount_percent = scrapy.Field(serializer=str) di

VMware vSphere系列教程-配置主機網絡

vmware vsphere 配置主機網絡 一、配置主機網絡 當出現此畫?時,啟動完成,按【F2】進入設置輸入root密碼如圖所示,選擇【configure management network】配置管理網絡 選擇第一個,配置管理網絡的網卡改成如圖所示選擇【IPV4 configuration】配置e

VMware vSphere系列教程-創建虛擬機

vmware vsphere 創建虛擬機 創建Windows 2012 R2虛擬機 點擊左側【虛擬機】,右側【創建虛擬機】 輸入虛擬機的名稱【DC1】,選擇要安裝的操作系統類型選擇虛擬機存儲位置設置虛擬機配置,默認即可,如果想要性能好,可以把vcpu改成【2】安裝web控制臺組件VMware vSph

Electron 基礎教程-2.3 主程序Main Process

主程序(Main Process) 正如之前所提,Electron有兩大程序:主程序(Main Process)和渲染程序(Renderer Process)。在這個示例程式中,主程序程式碼就在main.js檔案中。 Note 通常將主程序檔案命

springcloud 系列教程四:服務消費者Feign

一、Feign簡介 Feign 的英文表意為 "假裝,偽裝,變形", 是一個http請求呼叫的輕量級框架,可

OpenCV 3 pyton第三章二值化尋找輪廓線

retval, dst = cv.threshold( src, thresh, maxval, type[, dst] ) 這是個閾值化操作 src是input array (多通道, 8-bit or 32-bit floating point). d

cmake工具使用簡明教程基於命令列gui編譯到windowslinux雙平臺

cmake可以用來構建跨平臺的專案,本文簡要講解針對多目錄原始碼專案使用cmake構建和編譯的方法。 專案結構 整個工程多目錄多檔案組織而成,其中build目錄用於生成各平臺解決方案檔案的,程式碼如下 bird.h class bird

一天殺了兩千宦官袁紹也曾仗義過為東漢徹底除去了宦官禍害

-s 大小 都在 name 技術分享 spa 人生 便在 哥哥 一天殺了兩千宦官,袁紹人生中讓人忽略的一起暴行 送交者: hgao[★★★★天山隱士★★★★] 於 2017-07-29 14:07 已讀 195 次 大字閱讀 在前面的

轉——WGS84坐標系圖層轉火星坐標系是整個圖層轉喲不是轉單點坐標

無法 工具 open cal 根據 線性 雙擊 延伸 出版 開篇嘮叨(著急的略過) 大天朝“火星坐標系”小科普:是一種國家保密插件,對真實坐標系統進行人為的加偏處理,將真實的坐標加密成虛假的坐標,加密後的坐標被稱為火星坐標系統。所有的電子地圖所有的導航設備,都需要加入國家

多執行緒基礎二執行緒的啟動、終止執行緒面臨的三種問題

一、執行緒的啟動、終止方式   啟動: start native(呼叫外部介面啟動)     終止:    stop(類似kill,暴力終止)  interrupt 中斷的方式 通過指令的方式 volatile boolean stop

多線程基礎二線程的啟動、終止線程面臨的三種問題

主線程 影響 stop pub atom out 通過 println 性問題 一、線程的啟動、終止方式  啟動: start native(調用外部接口啟動) 終止: stop(類似kill,暴力終止) interrupt 中斷的方式 通過指令的方式 v

Python基礎--- Python面向物件oop類、方法變數繼承

一、面向物件oop ----------------------------------------------------- 1.類 用來描述具有相同的屬性和方法的物件的集合。 它定義了該集合中每個物件所共有的屬性和方法。 物件是類的例項。

LeetCode刷題Easy篇斐波那契數列問題遞迴,尾遞迴非遞迴動態規劃解法

題目 斐波那契數列:  f(n)=f(n-1)+f(n-2)(n>2) f(0)=1;f(1)=1;  即有名的兔子繁衍問題  1 1 2 3 5 8 13 21 .... 我的解法 遞迴 public static int Recursion

智慧小區解決方案含IPTV、監控、語音、物業管理系統智慧傢俱產品

工作中有個客戶需要出一個智慧小區的解決方案,小菜在這裡做一個小記錄,感謝各位看官的光臨和CSDN平臺的支援。 解決的問題 問題1:網路質量不能保證 手機、電視上網、看視訊掉線、網速不穩定、高峰時段卡頓 深圳市奧捷迅科技  問題2:服務同質化 1、一般只提供寬

常見的資料結構棧、佇列、陣列、連結串列紅黑樹

(一)棧 棧:stack,又稱堆疊,它是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其 他任何位置進行新增、查詢、刪除等操作。 簡單的說:採用該結構的集合,對元素的存取有如下的特點先進後出(即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素)。例如,子彈

STM32-自學筆記7.用GPIO點亮LED程式用到的庫函式介紹

1.RCC_DeInit 函式原型:void RCC_DeInit (void) 功能:將外設RCC暫存器重設為預設值。 引數:無 例子:RCC_DeInit ();      //將外設RCC暫存器重設為預設值   2.RCC_HSE

劍指Offer演算法題JAVA版21-30題全是個人寫的非官方只供參考自己複習測試用例都通過了。

21.棧的壓入、彈出序列、 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓