單獨使用 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 專案…