程序員實戰scrapy框架,爬取網站信息

所謂網絡爬蟲,就是一個在網上到處或定向抓取數據的程序,當然,這種說法不夠專業,更專業的描述就是,抓取特定網站網頁的HTML數據。不過由於一個網站的網頁很多,而我們又不可能事先知道所有網頁的URL地址,所以,如何保證我們抓取到了網站的所有HTML頁面就是一個有待考究的問題了。一般的方法是,定義一個入口頁面,然後一般一個頁面會有其他頁面的URL,於是從當前頁面獲取到這些URL加入到爬蟲的抓取隊列中,然後進入到新頁面後再遞歸的進行上述的操作,其實說來就跟深度遍歷或廣度遍歷一樣。

Scrapy是一個基於Twisted,純Python實現的爬蟲框架,用戶只需要定製開發幾個模塊就可以輕鬆的實現一個爬蟲,用來抓取網頁內容以及各種圖片,非常之方便~

Scrapy 使用 Twisted這個異步網絡庫來處理網絡通訊,架構清晰,並且包含了各種中間件接口,可以靈活的完成各種需求。整體架構如下圖所示:

程序員實戰scrapy框架,爬取網站信息

綠線是數據流向,首先從初始URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載之後會交給 Spider 進行分析,Spider分析出來的結果有兩種:一種是需要進一步抓取的鏈接,例如之前分析的"下一頁"的鏈接,這些東西會被傳回 Scheduler ;另一種是需要保存的數據,它們則被送到Item Pipeline 那裡,那是對數據進行後期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道里還可以安裝各種中間件,進行必要的處理。

我假定你已經安裝了Scrapy。假如你沒有安裝,你可以參考這篇文章。

在本文中,我們將學會如何使用Scrapy建立一個爬蟲程序,並爬取指定網站上的內容

1. 創建一個新的Scrapy Project

2. 定義你需要從網頁中提取的元素Item

3.實現一個Spider類,通過接口完成爬取URL和提取Item的功能

4. 實現一個Item PipeLine類,完成Item的存儲功能

我將會用騰訊招聘官網作為例子。

Github源碼:https://github.com/maxliaops/scrapy-itzhaopin

程序員實戰scrapy框架,爬取網站信息

目標:抓取騰訊招聘官網職位招聘信息並保存為JSON格式。

新建工程

首先,為我們的爬蟲新建一個工程,首先進入一個目錄(任意一個我們用來保存代碼的目錄),執行:

scrapy startprojectitzhaopin

最後的itzhaopin就是項目名稱。這個命令會在當前目錄下創建一個新目錄itzhaopin,結構如下:

.

├── itzhaopin

│ ├── itzhaopin

│ │ ├── __init__.py

│ │ ├── items.py

│ │ ├── pipelines.py

│ │ ├── settings.py

│ │ └── spiders

│ │ └── __init__.py

│ └── scrapy.cfg

scrapy.cfg: 項目配置文件

items.py: 需要提取的數據結構定義文件

pipelines.py:管道定義,用來對items裡面提取的數據做進一步處理,如保存等

settings.py: 爬蟲配置文件

spiders: 放置spider的目錄

定義Item

在items.py裡面定義我們要抓取的數據:

實現Spider

Spider是一個繼承自scrapy.contrib.spiders.CrawlSpider的Python類,有三個必需的定義的成員

name: 名字,這個spider的標識

start_urls:一個url列表,spider從這些網頁開始抓取

parse():一個方法,當start_urls裡面的網頁抓取下來之後需要調用這個方法解析網頁內容,同時需要返回下一個需要抓取的網頁,或者返回items列表

所以在spiders目錄下新建一個spider,tencent_spider.py:

實現PipeLine

PipeLine用來對Spider返回的Item列表進行保存操作,可以寫入到文件、或者數據庫等。

PipeLine只有一個需要實現的方法:process_item,例如我們將Item保存到JSON格式文件中:

pipelines.py

到現在,我們就完成了一個基本的爬蟲的實現,可以輸入下面的命令來啟動這個Spider:

爬蟲運行結束後,在當前目錄下將會生成一個名為tencent.json的文件,其中以JSON格式保存了職位招聘信息。

部分內容如下:

{"recruitNumber": ["1"], "name": ["SD5-資深手遊策劃(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15626&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["產品/項目類"], "workLocation": ["深圳"]}

{"recruitNumber": ["1"], "name": ["TEG13-後臺開發工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15666&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技術類"], "workLocation": ["深圳"]}

{"recruitNumber": ["2"], "name": ["TEG12-數據中心高級經理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15698&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技術類"], "workLocation": ["深圳"]}

{"recruitNumber": ["2"], "name": ["SNG06-後臺開發工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15499&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技術類"], "workLocation": ["深圳"]}

{"recruitNumber": ["1"], "name": ["HY08-QT客戶端Windows開發工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=11378&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技術類"], "workLocation": ["深圳"]}

{"recruitNumber": ["5"], "name": ["HY1-移動遊戲測試經理(上海)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15607&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["技術類"], "workLocation": ["上海"]}

{"recruitNumber": ["1"], "name": ["HY6-網吧平臺高級產品經理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=10974&keywords=&tid=0&lid=0", "publishTime": ["2014-04-25"], "catalog": ["產品/項目類"], "workLocation": ["深圳"]}

{"recruitNumber": ["4"], "name": ["TEG14-雲存儲研發工程師(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=15168&keywords=&tid=0&lid=0", "publishTime": ["2014-04-24"], "catalog": ["技術類"], "workLocation": ["深圳"]}

{"recruitNumber": ["1"], "name": ["CB-薪酬經理(深圳)"], "detailLink": "http://hr.tencent.com/position_detail.php?id=2309&keywords=&tid=0&lid=0", "publishTime": ["2013-11-28"], "catalog": ["職能類"], "workLocation": ["深圳"]}

喜歡請關注

官方諮詢諮詢任何問題和系


分享到:


相關文章: