Scrapy框架之Spiders類理解
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作為其第一個引數, 並返回一個包含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框架來獲取網