1. 程式人生 > >Python爬蟲:Scrapy框架基礎框架結構及騰訊爬取

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