真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python分布式爬蟲原理是什么-創(chuàng)新互聯(lián)

小編給大家分享一下Python分布式爬蟲原理是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),臨汾企業(yè)網(wǎng)站建設(shè),臨汾品牌網(wǎng)站建設(shè),網(wǎng)站定制,臨汾網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,臨汾網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

首先,我們先來看看,如果是人正常的行為,是如何獲取網(wǎng)頁內(nèi)容的。


(1)打開瀏覽器,輸入URL,打開源網(wǎng)頁


(2)選取我們想要的內(nèi)容,包括標題,作者,摘要,正文等信息


(3)存儲到硬盤中

上面的三個過程,映射到技術(shù)層面上,其實就是:網(wǎng)絡(luò)請求,抓取結(jié)構(gòu)化數(shù)據(jù),數(shù)據(jù)存儲。


我們使用Python寫一個簡單的程序,實現(xiàn)上面的簡單抓取功能。

#!/usr/bin/python 
#-*- coding: utf-8 -*- 
''''' 
Created on 2014-03-16 
 
@author: Kris 
''' 
import urllib2, re, cookielib 
 
def httpCrawler(url): 
  ''''' 
  @summary: 網(wǎng)頁抓取 
  ''' 
  content = httpRequest(url) 
  title = parseHtml(content) 
  saveData(title) 
 
def httpRequest(url): 
  ''''' 
  @summary: 網(wǎng)絡(luò)請求 
  '''  
  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: 抓取結(jié)構(gòu)化數(shù)據(jù) 
  ''' 
  content = None 
  pattern = '([^<]*?)' 
  temp = re.findall(pattern, html) 
  if temp: 
    content = temp[0] 
   
  return content 
   
def saveData(data): 
  ''''' 
  @summary: 數(shù)據(jù)存儲 
  ''' 
  f = open('test', 'wb') 
  f.write(data) 
  f.close() 
   
if __name__ == '__main__': 
  url = 'http://www.baidu.com' 
  httpCrawler(url)

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


(1)需要帶著cookie信息訪問,比如大多數(shù)的社交化軟件,基本上都是需要用戶登錄之后,才能看到有價值的東西,其實很簡單,我們可以使用Python提供的cookielib模塊,實現(xiàn)每次訪問都帶著源網(wǎng)站給的cookie信息去訪問,這樣只要我們成功模擬了登錄,爬蟲處于登錄狀態(tài),那么我們就可以采集到登錄用戶看到的一切信息了。下面是使用cookie對httpRequest()方法的修改:

ckjar = cookielib.MozillaCookieJar() 
cookies = urllib2.HTTPCookieProcessor(ckjar)     #定義cookies對象 
def httpRequest(url): 
  ''''' 
  @summary: 網(wǎng)絡(luò)請求 
  '''  
  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)編碼問題。網(wǎng)站目前最多的兩種編碼:utf-8,或者gbk,當我們采集回來源網(wǎng)站編碼和我們數(shù)據(jù)庫存儲的編碼不一致時,比如,163.com的編碼使用的是gbk,而我們需要存儲的是utf-8編碼的數(shù)據(jù),那么我們可以使用Python中提供的encode()和decode()方法進行轉(zhuǎn)換,比如:

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

中間出現(xiàn)了unicode編碼,我們需要轉(zhuǎn)為中間編碼unicode,才能向gbk或者utf-8轉(zhuǎn)換。

(3)網(wǎng)頁中標簽不完整,比如有些源代碼中出現(xiàn)了起始標簽,但沒有結(jié)束標簽,HTML標簽不完整,就會影響我們抓取結(jié)構(gòu)化數(shù)據(jù),我們可以通過Python的BeautifulSoup模塊,先對源代碼進行清洗,再分析獲取內(nèi)容。

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

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

(6)一個網(wǎng)頁出現(xiàn)多個網(wǎng)頁結(jié)構(gòu)的情況,這樣我們?nèi)绻皇且惶鬃ト∫?guī)則,那肯定不行,所以需要配置多套模擬進行協(xié)助配合抓取。

(7)應(yīng)對源網(wǎng)站的監(jiān)控。抓取別人的東西,畢竟是不太好的事情,所以一般網(wǎng)站都會有針對爬蟲禁止訪問的限制。
一個好的采集系統(tǒng),應(yīng)該是,不管我們的目標數(shù)據(jù)在何處,只要是用戶能夠看到的,我們都能采集回來。所見即所得的無阻攔式采集,無論是否需要登錄的數(shù)據(jù)都能夠順利采集。大部分有價值的信息,一般都需要登錄才能看到,比如社交網(wǎng)站,為了應(yīng)對登錄的網(wǎng)站要有模擬用戶登錄的爬蟲系統(tǒng),才能正常獲取數(shù)據(jù)。不過社會化網(wǎng)站都希望自己形成一個閉環(huán),不愿意把數(shù)據(jù)放到站外,這種系統(tǒng)也不會像新聞等內(nèi)容那么開放的讓人獲取。這些社會化網(wǎng)站大部分會采取一些限制防止機器人爬蟲系統(tǒng)爬取數(shù)據(jù),一般一個賬號爬取不了多久就會被檢測出來被禁止訪問了。那是不是我們就不能爬取這些網(wǎng)站的數(shù)據(jù)呢?肯定不是這樣的,只要社會化網(wǎng)站不關(guān)閉網(wǎng)頁訪問,正常人能夠訪問的數(shù)據(jù),我們也能訪問。說到底就是模擬人的正常行為操作,專業(yè)一點叫“反監(jiān)控”。

源網(wǎng)站一般會有下面幾種限制:


1、一定時間內(nèi)單個IP訪問次數(shù),一個正常用戶訪問網(wǎng)站,除非是隨意的點著玩,否則不會在一段持續(xù)時間內(nèi)過快訪問一個網(wǎng)站,持續(xù)時間也不會太長。這個問題好辦,我們可以采用大量不規(guī)則代理IP形成一個代理池,隨機從代理池中選擇代理,模擬訪問。代理IP有兩種,透明代理和匿名代理。

2、一定時間內(nèi)單個賬號訪問次數(shù),如果一個人一天24小時都在訪問一個數(shù)據(jù)接口,而且速度非???,那就有可能是機器人了。我們可以采用大量行為正常的賬號,行為正常就是普通人怎么在社交網(wǎng)站上操作,并且單位時間內(nèi),訪問URL數(shù)目盡量減少,可以在每次訪問中間間隔一段時間,這個時間間隔可以是一個隨機值,即每次訪問完一個URL,隨機隨眠一段時間,再接著訪問下一個URL。


如果能把賬號和IP的訪問策略控制好了,基本就沒什么問題了。當然對方網(wǎng)站也會有運維會調(diào)整策略,敵我雙方的一場較量,爬蟲必須要能感知到對方的反監(jiān)控將會對我們有影響,通知管理員及時處理。其實最理想的是能夠通過機器學(xué)習(xí),智能的實現(xiàn)反監(jiān)控對抗,實現(xiàn)不間斷地抓取。


下面是本人近期正在設(shè)計的一個分布式爬蟲架構(gòu)圖,如圖1所示:

Python分布式爬蟲原理是什么

看完了這篇文章,相信你對Python分布式爬蟲原理是什么有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


分享名稱:Python分布式爬蟲原理是什么-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://weahome.cn/article/dchced.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部