Scrapy系列教程(3)------Spider(爬蟲核心,定義連結關係和網頁資訊抽取)
Spiders
Spider類定義瞭如何爬取某個(或某些)網站。包括了爬取的動作(例如:是否跟進連結)以及如何從網頁的內容中提取結構化資料(爬取item)。 換句話說,Spider就是您定義爬取的動作及分析某個網頁(或者是有些網頁)的地方。
對spider來說,爬取的迴圈類似下文:
-
以初始的URL初始化Request,並設定回撥函式。 當該request下載完畢並返回時,將生成response,並作為引數傳給該回調函式。
-
在回撥函式內分析返回的(網頁)內容,返回 Item 物件或者 Request 或者一個包括二者的可迭代容器。 返回的Request物件之後會經過Scrapy處理,下載相應的內容,並呼叫設定的callback函式(函式可相同)。
-
在回撥函式內,您可以使用 選擇器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 來分析網頁內容,並根據分析的資料生成item。
-
最後,由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[, level, component])
-
使用 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)的方法:
爬取規則(Crawling rules)
- 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中同名的函式將會被呼叫)。 從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,編譯到windows和linux雙平臺)
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就不可能是該壓