Scrapy -- 04

翻譯的官網文檔質量不錯啊,在看本身翻的,TAT。html

Spider

  • 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 屬性。 更多數據請參見 Loggingdom

    • 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

待續

相關文章
相關標籤/搜索