2016年8月,一位自稱“Peace”的黑客聲稱盜取了2億雅虎用戶賬戶和密碼,并尋求在暗網(wǎng)(dark web)上進行售賣。黑客所聲稱的2億條信息的泄露似乎盜取自2012年,同時發(fā)生的還有MySpace(3.6億條)和Linkedln(1億條)兩家網(wǎng)站的信息泄露。
有趣的是 Linkedln 的泄露事件還間接導致了扎克伯格的推特賬號被黑。因為扎克伯格在兩個網(wǎng)站都使用了同一個密碼:“dadada”……
在信息化時代,數(shù)據(jù)泄露無處不在,這種風險可能來自于我們上網(wǎng)的每一個步驟。下面筆者將介紹一種批量獲取信息的方式——爬蟲。編程語言基于Python,如果對這門語言不是很熟悉可以先了解下它的語法結(jié)構(gòu)。本文將對于爬蟲做一個簡單入門介紹。
關于爬蟲
我們一直在說的爬蟲究竟是個什么鬼?
網(wǎng)絡爬蟲(web crawler),是一個自動提取網(wǎng)頁的程序,它為搜索引擎從網(wǎng)路上下載網(wǎng)頁。傳統(tǒng)爬蟲從一個或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL,在抓取網(wǎng)頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統(tǒng)的一定停止條件。另外,所有被爬蟲抓取的網(wǎng)頁將會被系統(tǒng)存貯,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索。
(摘自百度百科)
簡單來講,爬蟲是通過程序或者腳本獲取網(wǎng)頁上的一些文本、圖片、音頻的數(shù)據(jù)。
從筆者的經(jīng)驗來看,做一個簡單的爬蟲程序有以下幾個步驟:確立需求、網(wǎng)頁下載、網(wǎng)頁分析與解析、保存。接下來大家可以跟隨筆者的流程,我們來寫個抓取豆瓣書籍信息的爬蟲。
1、 需求
以豆瓣讀書為例,我們爬取豆瓣的書籍信息,需要獲取的信息包括:圖書名稱,出版社,作者,年份,評分。
2、 網(wǎng)頁下載
頁面下載分為靜態(tài)和動態(tài)兩種下載方式。
靜態(tài)主要是純 html 頁面,動態(tài)是網(wǎng)頁會使用 java 處理,并通過Ajax 異步獲取的頁面。在這里,我們下載的是靜態(tài)頁面。
在下載網(wǎng)頁的過程中我們需要用到網(wǎng)絡庫。在 Python 中有自帶的 urllib、urllib2 網(wǎng)絡庫,但是我們一般采用基于 urllib3 的第三方庫Requests ,這是一個深受 Pythoner 喜愛的更為高效簡潔的網(wǎng)絡庫,能滿足我們目前的 web 需求。
3、 網(wǎng)頁分析與解析1)網(wǎng)頁分析:
選好網(wǎng)絡庫后我們需要做的是:分析我們要爬取的路徑——也就是邏輯。
這個過程中我們要找到爬取的每一個入口,例如豆瓣讀書的頁面。已知圖書標簽的 url,點擊每個 url 能得到圖書列表,在圖書列表中存放需要的圖書信息,求解如何獲得圖書信息。
所以很簡單!我們的爬取路徑就是:圖書標簽 url —> 圖書列表—>圖書信息。
2)網(wǎng)頁解析:
網(wǎng)頁解析主要就是通過解析網(wǎng)頁源代碼獲取我們需要的數(shù)據(jù),網(wǎng)頁解析的方式有很多種,如:正則表達式, BeautifulSoup, XPath 等等,在這里我們采用的是 XPath。Xpath 的語法很簡單,是根據(jù)路徑來進行定位。
舉個栗子:上海的位置是 地球—中國—上海,語法表達為 //地球/中國[@城市名=上海]
接下來我們需要解析網(wǎng)頁獲取到圖書的 tag 標簽的url。打開網(wǎng)頁,右擊選擇審查元素,然后就會出現(xiàn)調(diào)試工具,左上角點擊獲取我們需要的數(shù)據(jù),下面的調(diào)試窗口就會直接定位到其所在代碼。
根據(jù)其位置,寫出其 Xpath 解析式://table[@class='tagCol']//a
這里我們看到小說在一個< table >標簽下的< td >標簽的< a >標簽里。< table >標簽可以用 class 屬性進行定位。
以下是獲取 tag 的 url 的代碼:
獲取完了 tag ,我們還需要獲取到圖書的信息,下面我們對圖書列表頁進行解析:
解析之后代碼如下:
爬取的信息內(nèi)容如下:
4、 數(shù)據(jù)保存
獲取到了數(shù)據(jù)之后,我們可以選擇把數(shù)據(jù)保存在數(shù)據(jù)庫中,或者直接寫在文件中。這里我們把數(shù)據(jù)保存到了 mongodb。接下來做一些統(tǒng)計,例如使用圖表插件 echarts,將我們的統(tǒng)計結(jié)果展示出來。
5、 爬蟲相關問題1)網(wǎng)站限制:
爬蟲過程中可能會遇到爬不到數(shù)據(jù)了的問題,這是因為相應網(wǎng)站做了一些反爬的處理來進行爬取限制,比如在爬取豆瓣的時候,就遇到了 403forbidden 。怎么辦?這時候可以通過一些相應的方法來解決,比如使用代理服務器,降低爬取速度等,在這里我們采用每次請求 sleep2秒。
2)URL 去重:
URL 去重是爬蟲運行中一項關鍵的步驟,由于運行中的爬蟲主要阻塞在網(wǎng)絡交互中,因此避免重復的網(wǎng)絡交互至關重要。爬蟲一般會將待抓取的 URL 放在一個隊列中,從抓取后的網(wǎng)頁中提取到新的 URL,在他們被放入隊列之前,首先要確定這些新的 URL 沒有被抓取過,如果之前已經(jīng)抓取過了,就不再放入隊列了。
3)并發(fā)操作:
Python 中的并發(fā)操作主要涉及的模型有:多線程模型、多進程模型、協(xié)程模型。在 Python 中可以通過:threading 模塊、multiprocessing 模塊、gevent 庫 來實現(xiàn)多線程、多進程、或協(xié)程的并發(fā)操作。
scrapy —— 強大的爬蟲框架
談到爬蟲,不得不提的是 Scrapy。Scrapy 是 Python 開發(fā)的一個快速,高層次的爬蟲框架,用于抓取 web 站點并從頁面中提取結(jié)構(gòu)化的數(shù)據(jù)。Scrapy 用途廣泛,可以用于數(shù)據(jù)挖掘、監(jiān)測和自動化測試。
Scrapy 吸引人的地方在于它是一個框架,任何人都可以根據(jù)需求方便的修改。它也提供了多種類型爬蟲的基類,如 BaseSpider、sitemap 爬蟲等。
scrapy 的架構(gòu):
其中綠線是數(shù)據(jù)流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載之后會交給 Spider 進行分析,需要保存的數(shù)據(jù)則會被送到 Item Pipeline,對數(shù)據(jù)進行后期處理。
另外,在數(shù)據(jù)流動的通道里還可以安裝各種中間件,進行必要的處理。 因此在開發(fā)爬蟲的時候,最好也先規(guī)劃好各種模塊。
注:
Xpath 教程:http://www.w3school.com.cn/xpath/index.asp
Requests官方文檔:http://docs.python-requests.org/en/master/
更多的 Scrapy 請參考:http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html
本文作者:胡宇涵(點融黑幫),就職于點融網(wǎng)工程部infra團隊運維開發(fā)工程師。愛自然,愛生活。
本文由@點融黑幫(ID:DianrongMafia)原創(chuàng)發(fā)布于搜狐科技,未經(jīng)許可,禁止轉(zhuǎn)載。