Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

編程語言 Scrapy 網絡爬蟲 Python 開發技術專注者 2017-05-21

感興趣的可以關注我,之後會發出爬去亞馬遜商品評論的數據,還有更多高質量原創文章發出!

如上篇文章所述,首先,準備scrapy環境:

  1. 安裝Python,pip,使用pip安裝lxml和scrapy。

  2. scrapy startproject qiubai新建一個名為qiubai的scrapy爬蟲項目。

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

新建qiubai爬蟲項目

使用PyCharm打開,項目結構如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

項目結構


定義QiubaiItem

新建項目之後,在items.py裡面定義我們需要爬取的段子數據的數據結構。

那怎麼知道我們要爬取哪些數據呢?去糗事百科段子頁面看一下,如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

段子數據特徵

一個糗事百科段子差不多包含了用戶頭像、個人主頁鏈接、暱稱、性別、年齡、段子內容、該段子的主頁鏈接、該段子的點贊數、評論數這麼9項內容。

因此,我們在items.py中定義QiubaiItem如下:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

QiubaiItem


編寫爬蟲QiubaiSpider

定義好QiubaiSpider之後,我們就可以在spiders文件夾中編寫我們的爬蟲spider了。

如上篇文章所述,scrapy.spiders.Spider的主要方法是parse方法,主要屬性有name,allowed_domains,start_urls等,所以我們創建QiubaiSpider來繼承Spider,然後定義好這些屬性。如下圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

QiubaiSpider

由於一般的網站很可能會通過User-Agent,cookie等內容來簡單的反爬蟲,識別你是用戶訪問的還是機器訪問的,所以,我們這裡一般都會寫上headers,在每次請求的時候都帶上這個headers,這樣,就可以繞過一些很簡單的反爬蟲程序。

但是,在scrapy中,我們一般把配置項放在settings.py中,這個文件中保存了很多scrapy運行時的配置信息,比如默認的headers,User-Agent,用戶定義的pipeline等等。所以,我們把Spider中的headers轉移到settings.py中。如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

settings


定位網頁中的Item數據,編寫xpath提取Item

創建好基本的QiubaiSpider之後,我們就可以分析網頁中段子數據在網頁HTML中的位置等信息,然後在QiubaiSpider的parse方法中使用選擇器的xpath提取段子數據了。如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

段子元素定位

如上圖,id為content-left的div元素中的每一個class屬性為"article block untagged mb15"的div都代表了一個段子。對應的xpath的表達式就是'//div[@id="content-left"]/div[@class="article block untagged mb15"]'。這樣,就獲取到了每一個段子的選擇器,然後在每一個段子的選擇器上,可以繼續使用xpath來繼續提取段子的各種特徵。

特徵定位如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

段子特徵

上圖中段子特徵與我們前面定義的QiubaiItem的屬性是一一對應的。

然後,就可以開始寫我們的parse方法了。

提取段子的每一個特徵的xpath表達式就交給讀者寫了,如果有哪裡不懂的,可以關注後在文章中評論描述一下,我會一一解答。

最終,QiubaiSpider完成如下:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

QiubaiSpider完成

但是我們翻了兩頁,發現有些發段子的用戶是匿名用戶,如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

匿名用戶

這樣,就肯定獲取不到用戶的頭像,暱稱,性別,年齡了,所以,我們在parse方法中要處理好這種異常情況。

最終真正完成的QiubaiSpider如下圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

最終真正完成的QiubaiSpider


編寫pipeline,保存Item

編寫好QiubaiSpider後,我們就能獲取到item了。

然後,我們需要在pipelines.py中編寫QiubaiPipeline來保存我們的item數據。

這裡,我們使用MongoDB來保存item數據。如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

QiubaiPipeline保存item數據


最終項目結構:

最終,我們完成了我們的qiubai的scrapy爬蟲,最終的項目結構如圖:

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

最終項目結構

感興趣的可以關注我,之後會發出爬去亞馬遜商品評論的數據,還有更多高質量原創文章發出!

Python爬蟲框架Scrapy之爬取糗事百科大量段子數據

更多文章

  1. Python爬蟲框架之Scrapy詳解

  2. Java網絡爬蟲工具,OkHttp完全詳細用法

相關推薦

推薦中...