Scrapy 使用LinkExtractor提取鏈接

LinkExtractor的使用非常簡單,通過一個例子進行講解,使用LinkExtractor替代Selector完成BooksSpider提取鏈接的任務,代碼如下:

from scrapy.linkextractors import LinkExtractor
class BooksSpider(scrapy.Spider):
    ...
    def parse(self, response):
        ...
        # 提取鏈接
        # 下一頁的url 在ul.pager > li.next > a 裏面
        # 例如: <li class="next"><a href="catalogue/page-2.html">next</a></li>
        le = LinkExtractor(restrict_css='ul.pager li.next')
        links = le.extract_links(response)
        if links:
            next_url = links[0].url
            yield scrapy.Request(next_url, callback=self.parse)

對上述代碼解釋如下:
● 導入LinkExtractor,它位於scrapy.linkextractors模塊。
● 創建一個LinkExtractor對象,使用一個或多個構造器參數描述提取規則,這裏傳遞給restrict_css參數一個CSS選擇器表達式。它描述出下一頁鏈接所在的區域(在li.next下)。
● 調用LinkExtractor對象的extract_links方法傳入一個Response對象,該方法依據創建對象時所描述的提取規則,在Response對象所包含的頁面中提取鏈接,最終返回一個列表,其中的每一個元素都是一個Link對象,即提取到的一個鏈接。
● 由於頁面中的下一頁鏈接只有一個,因此用links[0]獲取Link對象,Link對象的url屬性便是鏈接頁面的絕對url地址(無須再調用response.urljoin方法),用其構造Request對象並提交。
通過上面的例子,相信大家已經瞭解了使用LinkExtractor對象提取頁面中鏈接的流程。

下面依次介紹LinkExtractor構造器的各個參數:
● allow
接收一個正則表達式或一個正則表達式列表,提取絕對url與正則表達式匹配的鏈接,如果該參數爲空(默認),就提取全部鏈接。

● deny
接收一個正則表達式或一個正則表達式列表,與allow相反,排除絕對url與正則表達式匹配的鏈接。

● allow_domains
接收一個域名或一個域名列表,提取到指定域的鏈接。

● deny_domains
接收一個域名或一個域名列表,與allow_domains相反,排除到指定域的鏈接。

● restrict_xpaths
接收一個XPath表達式或一個XPath表達式列表,提取XPath表達式選中區域下的鏈接。

● restrict_css
接收一個CSS選擇器或一個CSS選擇器列表,提取CSS選擇器選中區域下的鏈接。

● tags
接收一個標籤(字符串)或一個標籤列表,提取指定標籤內的
鏈接,默認爲['a', 'area']。
● attrs
接收一個屬性(字符串)或一個屬性列表,提取指定屬性內的鏈接,默認爲['href']。

● process_value
接收一個形如func(value)的回調函數。如果傳遞了該參數,LinkExtractor將調用該回調函數對提取的每一個鏈接(如a的href)進行處理,回調函數正常情況下應返回一個字符串(處理結果),想要拋棄所處理的鏈接時,返回None。

 

發佈了15 篇原創文章 · 獲贊 6 · 訪問量 3577
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章