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