首先,咱們先來看看,若是是人正常的行爲,是如何獲取網頁內容的。python
(1)打開瀏覽器,輸入URL,打開源網頁
(2)選取咱們想要的內容,包括標題,做者,摘要,正文等信息
(3)存儲到硬盤中
上面的三個過程,映射到技術層面上,其實就是:網絡請求,抓取結構化數據,數據存儲。
咱們使用Python寫一個簡單的程序,實現上面的簡單抓取功能。
- #!/usr/bin/python #-*- coding: utf-8 -*- '' Created on 2014-03-16
-
- @author: Kris
- ''' import def '''
- @summary: 網頁抓取
- ''' def '''
- @summary: 網絡請求
- ''' try
-
- , )
- , )
- finally if return def '''
- @summary: 抓取結構化數據
- '''
-
- if ]
- return def '''
- @summary: 數據存儲
- ''' , )
- if:
-
- httpCrawler(url)
看着很簡單,是的,它就是一個爬蟲入門的基礎程序。固然,在實現一個採集過程,無非就是上面的幾個基礎步驟。可是實現一個強大的採集過程,你會遇到下面的問題:
(1)須要帶着cookie信息訪問,好比大多數的社交化軟件,基本上都是須要用戶登陸以後,才能看到有價值的東西,其實很簡單,咱們可使用Python提供的cookielib模塊,實現每次訪問都帶着源網站給的cookie信息去訪問,這樣只要咱們成功模擬了登陸,爬蟲處於登陸狀態,那麼咱們就能夠採集到登陸用戶看到的一切信息了。下面是使用cookie對httpRequest()方法的修改:web
- ckjar = cookielib.MozillaCookieJar()
-
- def '''
- @summary: 網絡請求
- ''' try
-
- , )
- , )
-
- finally if return ret
(2)編碼問題。網站目前最多的兩種編碼:utf-8,或者gbk,當咱們採集回來源網站編碼和咱們數據庫存儲的編碼不一致時,好比,163.com的編碼使用的是gbk,而咱們須要存儲的是utf-8編碼的數據,那麼咱們可使用Python中提供的encode()和decode()方法進行轉換,好比:
- content = content.decode(, )
- , )
中間出現了unicode編碼,咱們須要轉爲中間編碼unicode,才能向gbk或者utf-8轉換。
(3)網頁中標籤不完整,好比有些源代碼中出現了起始標籤,但沒有結束標籤,HTML標籤不完整,就會影響咱們抓取結構化數據,咱們能夠經過Python的BeautifulSoup模塊,先對源代碼進行清洗,再分析獲取內容。
(4)某些網站使用JS來生存網頁內容。當咱們直接查看源代碼的時候,發現是一堆讓人頭疼的JS代碼。可使用mozilla、webkit等能夠解析瀏覽器的工具包解析js、ajax,雖然速度會稍微慢點。
(5)圖片是flash形式存在的。當圖片中的內容是文字或者數字組成的字符,那這個就比較好辦,咱們只要利用ocr技術,就能實現自動識別了,可是若是是flash連接,咱們將整個URL存儲起來了。
(6)一個網頁出現多個網頁結構的狀況,這樣咱們若是隻是一套抓取規則,那確定不行,因此須要配置多套模擬進行協助配合抓取。
(7)應對源網站的監控。抓取別人的東西,畢竟是不太好的事情,因此通常網站都會有針對爬蟲禁止訪問的限制。
一個好的採集系統,應該是,無論咱們的目標數據在何處,只要是用戶可以看到的,咱們都能採集回來。所見即所得的無阻攔式採集,不管是否須要登陸的數據都可以順利採集。大部分有價值的信息,通常都須要登陸才能看到,好比社交網站,爲了應對登陸的網站要有模擬用戶登陸的爬蟲系統,才能正常獲取數據。不過社會化網站都但願本身造成一個閉環,不肯意把數據放到站外,這種系統也不會像新聞等內容那麼開放的讓人獲取。這些社會化網站大部分會採起一些限制防止機器人爬蟲系統爬取數據,通常一個帳號爬取不了多久就會被檢測出來被禁止訪問了。那是否是咱們就不能爬取這些網站的數據呢?確定不是這樣的,只要社會化網站不關閉網頁訪問,正常人可以訪問的數據,咱們也能訪問。說到底就是模擬人的正常行爲操做,專業一點叫「反監控」。
源網站通常會有下面幾種限制:
一、必定時間內單個IP訪問次數,一個正經常使用戶訪問網站,除非是隨意的點着玩,不然不會在一段持續時間內過快訪問一個網站,持續時間也不會太長。這個問題好辦,咱們能夠採用大量不規則代理IP造成一個代理池,隨機從代理池中選擇代理,模擬訪問。代理IP有兩種,透明代理和匿名代理。
二、必定時間內單個帳號訪問次數,若是一我的一天24小時都在訪問一個數據接口,並且速度很是快,那就有多是機器人了。咱們能夠採用大量行爲正常的帳號,行爲正常就是普通人怎麼在社交網站上操做,而且單位時間內,訪問URL數目儘可能減小,能夠在每次訪問中間間隔一段時間,這個時間間隔能夠是一個隨機值,即每次訪問完一個URL,隨機隨眠一段時間,再接着訪問下一個URL。
若是能把帳號和IP的訪問策略控制好了,基本就沒什麼問題了。固然對方網站也會有運維會調整策略,敵我雙方的一場較量,爬蟲必需要能感知到對方的反監控將會對咱們有影響,通知管理員及時處理。其實最理想的是可以經過機器學習,智能的實現反監控對抗,實現不間斷地抓取。ajax
下面是本人近期正在設計的一個分佈式爬蟲架構圖,如圖1所示:數據庫
圖1瀏覽器
純屬拙做,初步思路正在實現,正在搭建服務器和客戶端之間的通訊,主要使用了Python的Socket模塊實現服務器端和客戶端的通訊。若是有興趣,能夠單獨和我聯繫,共同探討完成更優的方案。服務器