翻譯的官網文檔質量不錯啊,在看本身翻的,TAT。html
class scrapy.spider.Spider #官網手冊後面還有幾個,例如CrawlSpider,但感受仍是這個用的多,github上的使用比例爲30000對4300。若是CrawlSpider更好用,還望大神告知。
python
Spider是最簡單的spider。每一個其餘的spider必須繼承自該類(包括Scrapy自帶的其餘spider以及您本身編寫的spider)。 Spider並無提供什麼特殊的功能。 其僅僅請求給定的 start_urls/start_requests ,並根據返回的結果(resulting responses)調用spider的 parse 方法。git
closed(reason)github
當spider關閉時,該函數被調用。 該方法提供了一個替代調用signals.connect()來監聽 spider_closed 信號的快捷方式。web
log(message[, level, component])架構
使用 scrapy.log.msg() 方法記錄(log)message。 log中自動帶上該spider的 name 屬性。 更多數據請參見 Logging 。dom
parse(response)scrapy
當response沒有指定回調函數時,該方法是Scrapy處理下載的response的默認方法。ide
parse 負責處理response並返回處理的數據以及(/或)跟進的URL。Spider 對其餘的Request的回調函數也有相同的要求。函數
該方法及其餘的Request回調函數必須返回一個包含Request 及(或) Item的可迭代的對象。
參數: | response (Response) – 用於分析的response |
---|
make_requests_from_url(url)
該方法接受一個URL並返回用於爬取的 Request 對象。 該方法在初始化request時被 start_requests() 調用,也被用於轉化url爲request。
默認未被複寫(overridden)的狀況下,該方法返回的Request對象中,parse() 做爲回調函數,dont_filter參數也被設置爲開啓。 (詳情參見 Request).
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
start_urls
URL列表。當沒有制定特定的URL時,spider將從該列表中開始進行爬取。 所以,第一個被獲取到的頁面的URL將是該列表之一。 後續的URL將會從獲取到的數據中提取。
allowed_domains
可選。包含了spider容許爬取的域名(domain)列表(list)。 當 OffsiteMiddleware 啓用時, 域名不在列表中的URL不會被跟進。(必定要注意,要否則你怎麼跪的都不知道,DEBUG的提示很坑爹的。)
name
定義spider名字的字符串(string)。spider的名字定義了Scrapy如何定位(並初始化)spider,因此其必須是惟一的。 不過您能夠生成多個相同的spider實例(instance),這沒有任何限制。 name是spider最重要的屬性,並且是必須的。
若是該spider爬取單個網站(single domain),一個常見的作法是以該網站(domain)(加或不加 後綴 )來命名spider。 例如,若是spider爬取 mywebsite.com ,該spider一般會被命名爲 mywebsite 。
以上是Scrapy.spider的組成。這裏要說一下parse方法,這個方法必須返回Request和Item的可迭代對象。返回Item能夠理解,爲什麼要返回Request呢?事實上Scrapy調用了spider的parse方法,而後迭代獲得的對象,並執行對象自身的callback函數。關於Scrapy架構的更詳細狀況,推薦這篇blog:http://blog.csdn.net/frylion/article/details/8558538。
利用上述特性,咱們就能夠執行遞歸抓取等操做。例如像http://www.newxue.com/gkmz/sgyy/這種,咱們想要抓取每章的內容,就能夠經過parse函數中抓取全部的章節url,而後生成request對象,url爲章節url,回調函數爲parse2,並編寫parse2對章節內容進行抓取。就像這樣:
#待完善,老闆不讓說抓的細節T_T def parse(self, response): for i in response.xpath(xpath表達式): url = 章節url yield scrapy.Request(url,callback=self.parse_page2) def parse_page2(self, response): # this would log http://www.example.com/some_page.html self.log("Visited %s" % response.url)
此外,若是須要在父頁面抓取一些信息,在子頁面另外抓取一些信息,能夠利用scrapy.Request的meta字段:meta是一個字典,它會被淺拷貝到子parse的response.meta之中。你能夠將items在父parse函數添加到meta之中,而在子parse函數中利用response.meta提取items。示例以下:
#這個暫時沒用到。。。 def parse_page1(self, response): item = MyItem() item['main_url'] = response.url request = scrapy.Request("http://www.example.com/some_page.html", callback=self.parse_page2) request.meta['item'] = item return request def parse_page2(self, response): item = response.meta['item'] item['other_url'] = response.url return item
待續