1. 程式人生 > >Scrapy框架之Spiders類理解

Scrapy框架之Spiders類理解

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作為其第一個引數, 並返回一個包含Item 以及(或) Request 物件(或者這兩者的子類)的列表(list)。

警告

當編寫爬蟲規則時,請避免使用 parse 作為回撥函式。 由於 CrawlSpider 使用 parse 方法來實現其邏輯,如果 您覆蓋了 parse 方法,crawl spider 將會執行失敗。

cb_kwargs 包含傳遞給回撥函式的引數(keyword argument)的字典。

follow 是一個布林(boolean)值,指定了根據該規則從response提取的連結是否需要跟進。 如果

相關推薦

Scrapy框架Spiders理解

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

Python爬蟲從入門到放棄(十五) Scrapy框架Spiders用法

ide 字典 初始化 需要 工作流程 www. 默認 apple 一個 原文地址https://www.cnblogs.com/zhaof/p/7192503.html Spider類定義了如何爬去某個網站,包括爬取的動作以及如何從網頁內容中提取結構化的數據,總的來說spi

tp框架Model與命名空間

自動調用 toolbar dmi 系統常量 根目錄 復制代碼 php span main 1.獲取系統常量信息 public function shuchu() { var_dump(get_defined_constants());

自定義MVC框架工具-模型

else pri 數據庫連接 執行 field date http one www. 截止目前已經改造了5個類: ubuntu:通過封裝驗證碼類庫一步步安裝php的gd擴展 自定義MVC框架之工具類-分頁類的封裝 自定義MVC框架之工具類-文件上傳類 自定義MVC框

JavaScript的PureMVC框架Facade

pure app instance 通用方法 javascrip cad pre ica rem Facade類 facade類是pureMVC框架的單例類,Facade提供了與核心層通信的唯一接口 以下是AppFacade單例類 繼承自puremvc.Facade sta

scrapy框架cookie和代理操作

一,scrapy傳送post請求 scrapy框架中預設傳送的是get請求,原始碼: scrapy.Spider父類中的start_request方法: def start_requests(self): cls = self.__class__ if

scrapy框架日誌等級和請求傳參

一.Scrapy的日誌等級   - 在使用scrapy crawl spiderFileName執行程式時,在終端裡列印輸出的就是scrapy的日誌資訊。   - 日誌資訊的種類:         ERROR : 一般錯誤         WARNING : 警告         INFO : 一般

scrapy框架CrawlSpider

提問:如果想要通過爬蟲程式去爬取”糗百“全站資料新聞資料的話,有幾種實現方法? 方法一:基於Scrapy框架中的Spider的遞迴爬取進行實現(Request模組遞歸回調parse方法)。 方法二:基於CrawlSpider的自動爬取進行實現(更加簡潔和高效)。 一,介紹

5----scrapy框架日誌級和請求傳參

一、Scrapy的日誌等級 在使用scrapy crawl spiderFileName執行程式時,在終端裡列印輸出的就是scrapy的日誌資訊。 日誌資訊的種類:   ERROR : 一般錯誤   WARNING : 警告   INFO : 一般的資訊   DEBUG : 除錯資訊   預設的

6 scrapy框架分布式操作

raw start isp page 其他 set 分布式爬蟲 d+ sed 分布式爬蟲一.redis簡單回顧  1.啟動redis:    mac/linux: redis-server redis.conf    windows: redis-server.exe

12.scrapy框架遞迴解析和post請求

今日概要 遞迴爬取解析多頁頁面資料 scrapy核心元件工作流程 scrapy的post請求傳送 今日詳情 1.遞迴爬取解析多頁頁面資料 - 需求:將糗事百科所有頁碼的作者和段子內容資料進行爬取切持久化儲存 - 需求分析:每一個頁面對應一個url,則scrapy工程需要對每一個頁碼

Scrapy框架基於RedisSpider實現的分散式爬蟲

需求:爬取的是基於文字的網易新聞資料(國內、國際、軍事、航空)。   基於Scrapy框架程式碼實現資料爬取後,再將當前專案修改為基於RedisSpider的分散式爬蟲形式。 一、基於Scrapy框架資料爬取實現 1、專案和爬蟲檔案建立 $ scrapy startproject wangyiPro $

python爬蟲基礎(13:Scrapy框架架構流程與目錄)

框架 對於特別小的爬蟲,一般直接編寫就可以了,但一般面對一個專案級別的爬蟲,都選擇用框架 框架可以理解為一個 等你填坑的程式碼: 1. 為你編寫好那些必須的、重複的程式碼        2. 為你模組化好每一個元件,自動建立元件之間的聯絡,這樣就方便使用者清晰瞭解它的

Scrapy框架基於RedisSpider實現的分布式爬蟲

.com ont 如何 test head 下載 obj gen 好的 需求:爬取的是基於文字的網易新聞數據(國內、國際、軍事、航空)。   基於Scrapy框架代碼實現數據爬取後,再將當前項目修改為基於RedisSpider的分布式爬蟲形式。 一、基於Scrapy框架數據

python爬蟲(四)---scrapy框架騰訊招聘專案實戰

目的:功能就是翻頁請求 步驟:如下 爬取職位名,職位連結等  職位名:  職位詳情連結:  職位類別:  人數:  地點:  釋出時間: 下一步驟:寫爬蟲 :tencent.py檔案寫 方法一: 或者這樣寫

Python專案-Day46-Scrapy框架利用ImagesPipeline下載圖片.md

專案程式碼 import scrapy from scrapy.item import Item,Field class ZiyuanItem(scrapy.Item): href=Field()#域 title=Field() date=Field()

《零基礎入門學習Python》第063講:論一隻爬蟲的自我修養11:Scrapy框架初窺門徑

上一節課我們好不容易裝好了 Scrapy,今天我們就來學習如何用好它,有些同學可能會有些疑惑,既然我們懂得了Python編寫爬蟲的技巧,那要這個所謂的爬蟲框架又有什麼用呢?其實啊,你懂得Python寫爬蟲的程式碼,好比你懂武功,會打架,但行軍打仗你不行,畢竟敵人是千軍萬馬,縱使你再強,

python爬蟲學習筆記-scrapy框架start_url

在使用命令列建立scrapy專案後,會發現在spider.py檔案內會生成這樣的程式碼: name = 'quotes' allowed_domains = ['quotes.toscrape.com'] start_urls = ['http://quotes.toscrape.com

python爬蟲入門(六) Scrapy框架原理介紹

Scrapy框架 Scrapy簡介 Scrapy是用純Python實現一個為了爬取網站資料、提取結構性資料而編寫的應用框架,用途非常廣泛。 框架的力量,使用者只需要定製開發幾個模組就可以輕鬆的實現一個爬蟲,用來抓取網頁內容以及各種圖片,非常之方便。 Scrapy 使用了 Twi

跟著派森學scrapy框架什麼是scrapy

十個爬蟲九個python寫,九個python爬蟲全部由scrapy寫。社會上在招聘爬蟲工程師時,百分之百會需要掌握scrapy爬蟲框架。但是scrapy十個什麼東西你知道嗎? 什麼是scrapy 我們先看百科詞條 Scrapy是我們熟知的爬蟲框架,我們用scrapy框架來獲取網