深入理解Python分布式爬蟲原理,深入理解python爬蟲

來源:互聯網
上載者:User

深入理解Python分布式爬蟲原理,深入理解python爬蟲

首先,我們先來看看,如果是人正常的行為,是如何擷取網頁內容的。

(1)開啟瀏覽器,輸入URL,開啟源網頁

(2)選取我們想要的內容,包括標題,作者,摘要,本文等資訊

(3)儲存到硬碟中

上面的三個過程,映射到技術層面上,其實就是:網路請求,抓取結構化資料,資料存放區。

我們使用Python寫一個簡單的程式,實現上面的簡單抓取功能。

#!/usr/bin/python #-*- coding: utf-8 -*- ''''' Created on 2014-03-16  @author: Kris ''' import urllib2, re, cookielib  def httpCrawler(url):   '''''   @summary: 網頁抓取   '''   content = httpRequest(url)   title = parseHtml(content)   saveData(title)  def httpRequest(url):   '''''   @summary: 網路請求   '''    try:     ret = None     SockFile = None     request = urllib2.Request(url)     request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)')     request.add_header('Pragma', 'no-cache')     opener = urllib2.build_opener()     SockFile = opener.open(request)     ret = SockFile.read()   finally:     if SockFile:       SockFile.close()        return ret  def parseHtml(html):   '''''   @summary: 抓取結構化資料   '''   content = None   pattern = '<title>([^<]*?)</title>'   temp = re.findall(pattern, html)   if temp:     content = temp[0]      return content    def saveData(data):   '''''   @summary: 資料存放區   '''   f = open('test', 'wb')   f.write(data)   f.close()    if __name__ == '__main__':   url = 'http://www.baidu.com'   httpCrawler(url) 

看著很簡單,是的,它就是一個爬蟲入門的基礎程式。當然,在實現一個採集過程,無非就是上面的幾個基礎步驟。但是實現一個強大的採集過程,你會遇到下面的問題:

(1)需要帶著cookie資訊訪問,比如大多數的社交化軟體,基本上都是需要使用者登入之後,才能看到有價值的東西,其實很簡單,我們可以使用Python提供的cookielib模組,實現每次訪問都帶著源網站給的cookie資訊去訪問,這樣只要我們成功類比了登入,爬蟲處於登入狀態,那麼我們就可以採集到登入使用者看到的一切資訊了。下面是使用cookie對httpRequest()方法的修改:

ckjar = cookielib.MozillaCookieJar() cookies = urllib2.HTTPCookieProcessor(ckjar)     #定義cookies對象 def httpRequest(url):   '''''   @summary: 網路請求   '''    try:     ret = None     SockFile = None     request = urllib2.Request(url)     request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)')     request.add_header('Pragma', 'no-cache')     opener = urllib2.build_opener(cookies)    #傳遞cookies對象     SockFile = opener.open(request)     ret = SockFile.read()   finally:     if SockFile:       SockFile.close()        return ret 

(2)編碼問題。網站目前最多的兩種編碼:utf-8,或者gbk,當我們採集回來源網站編碼和我們資料庫儲存的編碼不一致時,比如,163.com的編碼使用的是gbk,而我們需要儲存的是utf-8編碼的資料,那麼我們可以使用Python中提供的encode()和decode()方法進行轉換,比如:

content = content.decode('gbk', 'ignore')   #將gbk編碼轉為unicode編碼 content = content.encode('utf-8', 'ignore')  #將unicode編碼轉為utf-8編碼 

中間出現了unicode編碼,我們需要轉為中間編碼unicode,才能向gbk或者utf-8轉換。

(3)網頁中標籤不完整,比如有些原始碼中出現了起始標籤,但沒有結束標籤,HTML標籤不完整,就會影響我們抓取結構化資料,我們可以通過Python的BeautifulSoup模組,先對原始碼進行清洗,再分析擷取內容。

(4)某些網站使用JS來生存網頁內容。當我們直接查看原始碼的時候,發現是一堆讓人頭疼的JS代碼。可以使用mozilla、webkit等可以解析瀏覽器的工具包解析js、ajax,雖然速度會稍微慢點。

(5)圖片是flash形式存在的。當圖片中的內容是文字或者數字組成的字元,那這個就比較好辦,我們只要利用ocr技術,就能實現自動識別了,但是如果是flash連結,我們將整個URL儲存起來了。

(6)一個網頁出現多個網頁結構的情況,這樣我們如果只是一套抓取規則,那肯定不行,所以需要配置多套類比進行協助配合抓取。

(7)應對源網站的監控。抓取別人的東西,畢竟是不太好的事情,所以一般網站都會有針對爬蟲禁止訪問的限制。
一個好的採集系統,應該是,不管我們的目標資料在何處,只要是使用者能夠看到的,我們都能採集回來。所見即所得 (WYSIWYG)的無阻攔式採集,無論是否需要登入的資料都能夠順利採集。大部分有價值的資訊,一般都需要登入才能看到,比如社交網站,為了應對登入的網站要有類比使用者登入的爬蟲系統,才能正常擷取資料。不過社會化網站都希望自己形成一個閉環,不願意把資料放到站外,這種系統也不會像新聞等內容那麼開放的讓人擷取。這些社會化網站大部分會採取一些限制防止機器人爬蟲系統爬取資料,一般一個帳號爬取不了多久就會被檢測出來被禁止訪問了。那是不是我們就不能爬取這些網站的資料呢?肯定不是這樣的,只要社會化網站不關閉網頁訪問,正常人能夠訪問的資料,我們也能訪問。說到底就是類比人的正常行為操作,專業一點叫“反監控”。

源網站一般會有下面幾種限制:

1、一定時間內單個IP訪問次數,一個正常使用者訪問網站,除非是隨意的點著玩,否則不會在一段期間內過快訪問一個網站,期間也不會太長。這個問題好辦,我們可以採用大量不規則代理IP形成一個代理池,隨機從代理池中選擇代理,類比訪問。代理IP有兩種,透明代理和匿名代理。

2、一定時間內單個帳號訪問次數,如果一個人一天24小時都在訪問一個資料介面,而且速度非常快,那就有可能是機器人了。我們可以採用大量行為正常的帳號,行為正常就是普通人怎麼在社交網站上操作,並且單位時間內,訪問URL數目盡量減少,可以在每次訪問中間間隔一段時間,這個時間間隔可以是一個隨機值,即每次訪問完一個URL,隨機隨眠一段時間,再接著訪問下一個URL。

如果能把帳號和IP的存取原則控制好了,基本就沒什麼問題了。當然對方網站也會有營運會調整策略,敵我雙方的一場較量,爬蟲必須要能感知到對方的反監控將會對我們有影響,通知管理員及時處理。其實最理想的是能夠通過機器學習,智能的實現反監控對抗,實現不間斷地抓取。

下面是本人近期正在設計的一個分布式爬蟲架構圖,1所示:

純屬拙作,初步思路正在實現,正在搭建伺服器和用戶端之間的通訊,主要使用了Python的Socket模組實現伺服器端和用戶端的通訊。如果有興趣,可以單獨和我聯絡,共同探討完成更優的方案。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.