1. 程式人生 > >單獨使用 Scrapy 框架的 Selector 選擇器

單獨使用 Scrapy 框架的 Selector 選擇器

mywang88

2018-12-16

背景

Scrapy 框架是一個經典的 Python 爬蟲框架。

Scrapy 框架中的 Selector 類提供了多種 html/xml 節點選擇器的方法,例如:css 選擇器、xpath 選擇器、re 選擇器等。

使用 scrapy.Selector 類的好處之一,就是不需要再匯入(import)其它工具包,例如 lxml 等,直接呼叫選擇器,並輸入對應語法即可。

在開發和測試中,有時我們需要單獨使用 Scrapy 框架的 Selector 類的方法,而不是建立一個完整的 Scrapy 專案,因為建立一個專案需要好多步驟。例如,當我們只需要傳送一個 get 請求,然後解析響應體(html 程式碼),那麼我們明顯更傾向於使用 requests 庫的 get 方法,而不是使用 Scrapy 框架(建立一個專案,建立一個爬蟲,建立 start_request 方法,建立 parse 方法,在命令列模式下啟動爬蟲,初始化各種設定,載入各種中介軟體,等等等等)。

筆者就遇到了這樣的需求:

不啟動 Scrapy 框架,在程式中單獨使用 scrapy.Selector 類

這樣做還有一個好處,那就是這樣開發出的解析函式可以直接用在已有的 Scrapy 框架專案中,而不需要額外匯入其它依賴。

方法

實現方法可以概括成一句話:

用要解析的 html 程式碼,建立一個 scrapy.Selector 類的例項。

程式碼如下:

import scrapy

# 這是一段 html 程式碼
html = '''
<html>
    <body>
        <h1>這是標題</h1>
        <p>這是第一段</p>
        <p>這是第二段</p>
    </body>
</html>
'''
# 建立一個 Selector 類的例項,將 html 賦值給類屬性 text sel = scrapy.Selector(text=html) # 呼叫 Selector 類的 css 方法,即 css 選擇器 words = sel.css('p::text').extract() print(words)

執行結果:

[‘這是第一段’, ‘這是第二段’]

這樣,就在不建立也不啟動 Scrapy 專案的情形下呼叫了 Selector 類的選擇器方法。

實際應用場景是這樣的:

import requests
import scrapy

# 這是百度新聞主頁
url = 'https://news.baidu.com/' res = requests.get(url=url) html = res.text sel = scrapy.Selector(text=html) # 解析抓取“熱點要聞” words = sel.css('div[id="pane-news"] a::text').extract() for word in words: print(word)

執行結果篇幅較大,涉及詞彙較多,有時效性,因此就不展示了。

需要補充的是,用來解析的 css 選擇器也有時效性,網站隨時會重構。

總之,沒有啟動 Scrapy 專案,用了 Selector 選擇器。

小結

沒什麼好總結的,既然折騰測試了倆小時,就寫個帖子水一發…

實際情況是最近要給一個新聞採集的 Scrapy 爬蟲專案寫一個通用型的新聞內容解析函式,需要頻繁地實時分析除錯,懶得每次都啟動 Scrapy 專案…