Python爬蟲:Scrapy框架基礎框架結構及騰訊爬取
Scrapy終端是一個互動終端,我們可以在未啟動spider的情況下嘗試及除錯程式碼,也可以用來測試XPath或CSS表示式,檢視他們的工作方式,方便我們爬取的網頁中提取的資料。
如果安裝了 IPython ,Scrapy終端將使用 IPython (替代標準Python終端)。 IPython 終端與其他相比更為強大,提供智慧的自動補全,高亮輸出,及其他特性。(推薦安裝IPython)
Python學習資料或者需要程式碼、視訊加Python學習群:960410445
1 啟動Scrapy Shell
進入專案的根目錄,執行下列命令來啟動shell:
scrapyshell"https://hr.tencent.com/position.php?&start=0#a"
Scrapy Shell根據下載的頁面會自動建立一些方便使用的物件,例如 Response 物件,以及Selector 物件 (對HTML及XML內容)。
當shell載入後,將得到一個包含response資料的本地 response 變數,輸入response.body將輸出response的包體,輸出response.headers可以看到response的包頭。
輸入response.selector時, 將獲取到一個response 初始化的類 Selector 的物件,此時可以通過使用response.selector.xpath()或response.selector.css()來對 response 進行查詢。
Scrapy也提供了一些快捷方式, 例如response.xpath()或response.css()同樣可以生效(如之前的案例)。
2 Selectors選擇器
Scrapy Selectors 內建 XPath 和 CSS Selector 表示式機制
Selector有四個基本的方法,最常用的還是xpath:
xpath(): 傳入xpath表示式,返回該表示式所對應的所有節點的selector list列表
extract(): 序列化該節點為Unicode字串並返回list
css(): 傳入CSS表示式,返回該表示式所對應的所有節點的selector list列表,語法同 BeautifulSoup4
re(): 根據傳入的正則表示式對資料進行提取,返回Unicode字串list列表
response.xpath('//title')
3 Item Pipeline
當Item在Spider中被收集之後,它將會被傳遞到Item Pipeline,這些Item Pipeline元件按定義的順序處理Item。
每個Item Pipeline都是實現了簡單方法的Python類,比如決定此Item是丟棄而儲存。以下是item pipeline的一些典型應用:
驗證爬取的資料(檢查item包含某些欄位,比如說name欄位)
查重(並丟棄)
將爬取結果儲存到檔案或者資料庫中
編寫item pipeline很簡單,item pipiline元件是一個獨立的Python類,其中process_item()方法必須實現:
Pipeline實現檔案的寫入開啟操作
以下pipeline將所有(從所有'spider'中)爬取到的item,儲存到一個獨立地txt檔案
啟用一個Item Pipeline元件
為了啟用Item Pipeline元件,必須將它的類新增到 settings.py檔案ITEM_PIPELINES 配置,就像下面這個例子:
ITEM_PIPELINES = {'tianya.pipelines.TianyaPipeline':300,}
分配給每個類的整型值,確定了他們執行的順序,item按數字從低到高的順序,通過pipeline,通常將這些數字定義在0-1000範圍內(0-1000隨意設定,數值越低,元件的優先順序越高)
4 Spider
Spider類定義瞭如何爬取某個(或某些)網站。包括了爬取的動作(例如:是否跟進連結)以及如何從網頁的內容中提取結構化資料(爬取item)。 換句話說,Spider就是您定義爬取的動作及分析某個網頁(或者是有些網頁)的地方。
class scrapy.Spider是最基本的類,所有編寫的爬蟲必須繼承這個類。
主要用到的函式及呼叫順序為:
__init__(): 初始化爬蟲名字和start_urls列表
start_requests() 呼叫make_requests_from url():生成Requests物件交給Scrapy下載並返回response
parse(): 解析response,並返回Item或Requests(需指定回撥函式)。Item傳給Item pipline持久化 , 而Requests交由Scrapy下載,並由指定的回撥函式處理(預設parse()),一直進行迴圈,直到處理完所有的資料為止。
原始碼參考
主要屬性和方法
name
定義spider名字的字串。
例如,如果spider爬取 mywebsite.com ,該spider通常會被命名為 mywebsite
allowed_domains
包含了spider允許爬取的域名(domain)的列表,可選。
start_urls
初始URL元祖/列表。當沒有制定特定的URL時,spider將從該列表中開始進行爬取。
start_requests(self)
該方法必須返回一個可迭代物件(iterable)。該物件包含了spider用於爬取(預設實現是使用 start_urls 的url)的第一個Request。
當spider啟動爬取並且未指定start_urls時,該方法被呼叫。
parse(self, response)
當請求url返回網頁沒有指定回撥函式時,預設的Request物件回撥函式。用來處理網頁返回的response,以及生成Item或者Request物件。
log(self, message[, level, component])
使用 scrapy.log.msg() 方法記錄(log)message。 更多資料請參見logging
5 案例:騰訊招聘網自動翻頁採集
建立一個新的爬蟲:
scrapy genspider tencent "tencent.com"
編寫items.py
獲取職位名稱、詳細資訊、
編寫tencent.py
編寫pipeline.py檔案
在 setting.py 裡設定ITEM_PIPELINES
ITEM_PIPELINES = {"mySpider.pipelines.TencentJsonPipeline":300}
執行爬蟲:
scrapy crawl tencent.py