當前位置:首頁 » 打標機器 » 爬蟲時候需要使用多少台機器

爬蟲時候需要使用多少台機器

發布時間: 2021-02-20 20:01:41

Ⅰ 用python寫一個爬蟲有多難

爬蟲是互聯網上最常見的一種東西了吧。
爬蟲這東西每天都在網上爬大量的信息,各大搜索引擎廠商每天都有上百萬的爬蟲在網路上活動,這些爬蟲的作用就是給搜索引擎採集互聯網上最新的內容,採集來的內容經過分類、加工之後,進入搜索引擎的索引。這是爬蟲最常見的應用。
關於搜索引擎的理論非常多,應該已經形成系統的理論和方法了。這里不再多追求搜索引擎的細節,只來看看爬蟲如何爬有效的信息。
ps. 這個博客已經很久沒有更新了。現在時間越來越少,平時鮮有時間來更新博客了。
最近某人發現,python其實是一種很適合寫爬蟲的語言,而且python越用越順手。現在若是有人問我「c++和c#學哪一個?「之類的問題的時候,我一定會說,學python吧,因為生命短暫,你應該學習python。
所謂爬蟲,就是把網頁的html下載下來,然後從裡面提取出來有用的信息,這些有用的信息一般就是正文,圖片,鏈接一類的信息。
針對特定網站的爬蟲就更好寫了,用正則表達式,把網頁里的鏈接信息找到,然後找到需要的信息,保存在本地,然後進入下一個鏈接重復上一次的過程。
下面的腳本演示如何從加菲貓的官網上把從1978年至今的所有漫畫全部下載下來

import os,urllib,urllib2,re

hosts = "http://**********"
#initpos = "/mobile/garfield/1978/06/19"
initpos ="/mobile/garfield/1979/08/08"
pname = re.compile('''<span class="authorText">.+?<em>(.*?)</em></span>''')
pcomic = re.compile('''<div id="comic".+?src="(.*?)".+?</div>''')
pnext = re.compile('''<a href="(.*?)" class="next">''')

def getpage(url):
print url
req = urllib2.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0")
req.add_header("If-None-Match","")
u = urllib2.urlopen(req).read()
return u

def getnextpos(content,patten):
r = patten.findall(content)
for x in r:
print 'find next: ',x
return x

def savecomic(content,patten):
r = patten.findall(content)
print 'find commic:',r
r2 = pname.findall(content)
print 'find name:',r2
urlcomic = r[0]
u = urllib.urlopen(urlcomic).read()
name = r2[0].replace(' ','').split(',')
year = name[-1]
day = name[-2]
filename = 'test.jpg'
if not os.path.exists(year):
os.makedirs(year)
# is gif file ,the name the file as gif
if ((u[0] is 'G') and (u[1] is 'I') and (u[2] is 'F')):
filename = year+day+'.gif'
else:
filename = year+day+'.jpg'
f = file(year+"/"+filename,"wb+")
f.write(u)
f.close()

def main():
url = hosts+initpos
while(True):
c = getpage(url)
savecomic(c,pcomic)
u = getnextpos(c,pnext)
if u is None:
break
else:
url = hosts+u

if __name__ == '__main__':
main()

Ⅱ 怎樣的爬蟲架構能把一台機器的配置發揮到極限

1)首先你要明白爬蟲怎樣工作。

想像你是一隻蜘蛛,現在你被放到了互聯逗網地上。那麼,你需要把所有的網頁都看一遍。怎麼辦呢看沒問題呀,你就隨便從某個地方開始,比如說人民日報的首頁,這個叫initial pages,用$表示吧。

在人民日報的首頁,你看到那個頁面引向的各種鏈接。於是你很開心地從爬到了逗國內新聞地那個頁面。太好了,這樣你就已經爬完了倆頁面(首頁和國內新聞)!暫且不用管爬下來的頁面怎麼處理的,你就想像你把這個頁面完完整整抄成了個html放到了你身上。

突然你發現, 在國內新聞這個頁面上,有一個鏈接鏈回逗首頁地。作為一隻聰明的蜘蛛,你肯定知道你不用爬回去的吧,因為你已經看過了啊。所以,你需要用你的腦子,存下你已經看過的頁面地址。這樣,每次看到一個可能需要爬的新鏈接,你就先查查你腦子里是不是已經去過這個頁面地址。如果去過,那就別去了。

好的,理論上如果所有的頁面可以從initial page達到的話,那麼可以證明你一定可以爬完所有的網頁。

那麼在python里怎麼實現呢看
很簡單

import Queue

initial_page = "初始化頁"

url_queue = Queue.Queue()
seen = set()

seen.insert(initial_page)
url_queue.put(initial_page)

while(True): #一直進行直到海枯石爛
if url_queue.size()>0:
current_url = url_queue.get() #拿出隊例中第一個的url
store(current_url) #把這個url代表的網頁存儲好
for next_url in extract_urls(current_url): #提取把這個url里鏈向的url
if next_url not in seen:
seen.put(next_url)
url_queue.put(next_url)
else:
break

寫得已經很偽代碼了。

所有的爬蟲的backbone都在這里,下面分析一下為什麼爬蟲事實上是個非常復雜的東西——搜索引擎公司通常有一整個團隊來維護和開發。

2)效率
如果你直接加工一下上面的代碼直接運行的話,你需要一整年才能爬下整個豆瓣的內容。更別說Google這樣的搜索引擎需要爬下全網的內容了。

問題出在哪呢看需要爬的網頁實在太多太多了,而上面的代碼太慢太慢了。設想全網有N個網站,那麼分析一下判重的復雜度就是N*log(N),因為所有網頁要遍歷一次,而每次判重用set的話需要log(N)的復雜度。OK,OK,我知道python的set實現是hash——不過這樣還是太慢了,至少內存使用效率不高。

通常的判重做法是怎樣呢看Bloom Filter. 簡單講它仍然是一種hash的方法,但是它的特點是,它可以使用固定的內存(不隨url的數量而增長)以O(1)的效率判定url是否已經在set中。可惜天下沒有白吃的午餐,它的唯一問題在於,如果這個url不在set中,BF可以100%確定這個url沒有看過。但是如果這個url在set中,它會告訴你:這個url應該已經出現過,不過我有2%的不確定性。注意這里的不確定性在你分配的內存足夠大的時候,可以變得很小很少。一個簡單的教程:Bloom Filters by Example

注意到這個特點,url如果被看過,那麼可能以小概率重復看一看(沒關系,多看看不會累死)。但是如果沒被看過,一定會被看一下(這個很重要,不然我們就要漏掉一些網頁了!)。 [IMPORTANT: 此段有問題,請暫時略過]

好,現在已經接近處理判重最快的方法了。另外一個瓶頸——你只有一台機器。不管你的帶寬有多大,只要你的機器下載網頁的速度是瓶頸的話,那麼你只有加快這個速度。用一台機子不夠的話——用很多台吧!當然,我們假設每台機子都已經進了最大的效率——使用多線程(python的話,多進程吧)。

3)集群化抓取
爬取豆瓣的時候,我總共用了100多台機器晝夜不停地運行了一個月。想像如果只用一台機子你就得運行100個月了...

那麼,假設你現在有100台機器可以用,怎麼用python實現一個分布式的爬取演算法呢看

我們把這100台中的99台運算能力較小的機器叫作slave,另外一台較大的機器叫作master,那麼回顧上面代碼中的url_queue,如果我們能把這個queue放到這台master機器上,所有的slave都可以通過網路跟master聯通,每當一個slave完成下載一個網頁,就向master請求一個新的網頁來抓取。而每次slave新抓到一個網頁,就把這個網頁上所有的鏈接送到master的queue里去。同樣,bloom filter也放到master上,但是現在master只發送確定沒有被訪問過的url給slave。Bloom Filter放到master的內存里,而被訪問過的url放到運行在master上的Redis里,這樣保證所有操作都是O(1)。(至少平攤是O(1),Redis的訪問效率見:LINSERT – Redis)

考慮如何用python實現:
在各台slave上裝好scrapy,那麼各台機子就變成了一台有抓取能力的slave,在master上裝好Redis和rq用作分布式隊列。

代碼於是寫成

#slave.py

current_url = request_from_master()
to_send = []
for next_url in extract_urls(current_url):
to_send.append(next_url)

store(current_url);
send_to_master(to_send)

#master.py
distributed_queue = DistributedQueue()
bf = BloomFilter()

initial_pages = ""

while(True):
if request == 'GET':
if distributed_queue.size()>0:
send(distributed_queue.get())
else:
break
elif request == 'POST':
bf.put(request.url)

好的,其實你能想到,有人已經給你寫好了你需要的:darkrho/scrapy-redis · GitHub

4)展望及後處理
雖然上面用很多逗簡單地,但是真正要實現一個商業規模可用的爬蟲並不是一件容易的事。上面的代碼用來爬一個整體的網站幾乎沒有太大的問題。

但是如果附加上你需要這些後續處理,比如

有效地存儲(資料庫應該怎樣安排)

有效地判重(這里指網頁判重,咱可不想把人民日報和抄襲它的大民日報都爬一遍)

有效地信息抽取(比如怎麼樣抽取出網頁上所有的地址抽取出來,逗朝陽區奮進路中華道地),搜索引擎通常不需要存儲所有的信息,比如圖片我存來幹嘛...

及時更新(預測這個網頁多久會更新一次)

如你所想,這里每一個點都可以供很多研究者十數年的研究。雖然如此,
逗路漫漫其修遠兮,吾將上下而求索地。

所以,不要問怎麼入門,直接上路就好了:)

Ⅲ 爬蟲一般一分鍾應該爬多少鏈接,他的效率要看什麼了

你想達到來每天千萬源級別的速度,建議試試前嗅的ForeSpider數據採集軟體。我之前用火車、八爪魚,開伺服器採集,一個月采100多萬條。用ForeSpider,用筆記本採集的,一天就幾百萬條。
從一個專業C++程序猿的角度說,網上流傳的各種Java爬蟲,Python爬蟲,Java需要運行於C++開發的虛擬機上,Python只是腳本語言,採集效率和性能如何能與強大的C++相提並論?C++直接控制系統的底層,對內存空間的控制和節省都是其他語言無法競爭的。ForeSpider的開發語言是C++,從語言層面來講,火車採集器是不具備這樣的能力的。
forespider在台式機上運行一天可以采400萬,在伺服器上一天可以采8000萬,而且自帶免費的千萬級別資料庫,免安裝,可以直接入庫。還支持MySQL、ODBC資料庫。

Ⅳ 剛開始學習 Python 到可以寫出一個爬蟲大約需要多長時間

學習 Python 的三種境界

前言
王國維在《人間詞話》中將讀書分為了三種境界:「古今之成大事業、大學問者,必經過三種之境界:『昨夜西風凋碧樹,獨上高樓,望盡天涯路』。此第一境也。『衣帶漸寬終不悔,為伊消得人憔悴。』此第二境也。『眾里尋他千網路,驀然回首,那人卻在燈火闌珊處』。此第三境也。我從入門Python到現在也沒有多少時間,所以寫如此大的一個題目必定會引發各種批判,當然我沒有想造一個大新聞,只是想根據自己的學習歷程做一個簡單的總結,同時將這三個階段對應的一些好的書籍簡單介紹介紹。



正文
Python的用途十分廣泛,不同的程序員將其用於不用的領域,不同的程序員將自己的代碼打包成庫,供其他程序員使用,從而少造輪子,各種庫的使用,加之Python本身的靈活性、易讀性,易寫性,使用的人越來越多,tiobe統計編程語言的使用率如下:Python在一年之間使用排行榜中上升了3名,而且各大公司在招聘員工的時候如果能掌握Python,肯定是一個加分項,因為Python在文本處理,小程序的寫作方面具有太強的優勢,前段時間一個朋友讓幫忙改下他們公司logo的顏色,第一個想到的就是用Python,女票讓我幫她預處理大數據,第一個想到的仍然是Python等等,當然並沒有說其他語言不好,也不是為了討論哪種語言更好,只是Python確實是一門會讓人幸福的語言,下面粗淺的說說我對Python學習過程中的境界劃分以及推薦書籍。



  • 第一個階段:初級,掌握Python的語法和一些常用庫的使用

這里首先推薦在騰訊官方課程平台上進行直播學習,有號就能無償一直學,每天晚上都是高清直播(企鵝球球:1129中間是834最後加上這個903連在一起就可以了),除此之外基於python2.7在網上的書籍適合於重頭開始一直讀完,作為一個開發人員,除了基本的語法,這本書裡面提到了一些其他的常用的庫,看了廖老師寫的很多東西,感覺他的思路,以及寫博客寫書的高度,概括性,原理性都十分好,這本書讀完之後,相信就可以動手寫很多東西了,可以盡情的玩轉Python解釋器了。

另外還有一本書《Python參考手冊》,這本書也十分的有用,關於Python的方方面面基本都囊括在內,可以作為一本Python字典來查詢使用方法,十分好用。

掌握一門語言最好的方法就是用它,所以我覺得邊學語法邊刷Leetcode是掌握Python最快的方式之一。

很多隻需要將Python作為腳本或者就是寫一些小程序處理處理文本的話,到這一個階段就足夠了,這個階段已經可以幫我們完成很多很多的事情了。但是如果是一個專業學習Python的,恐怕還需要努力的升級:首先,國內的大多數人都是學習了其他語言(C,C++,Java等)之後來學習Python的,所以Python和這些語言的不同,也就是pythonic的東西需要一些時間去學習了解和掌握;另外,對於自己領域的領域的庫構架的掌握也需要很長的時間去掌握;最後,如果想獨立完成一個Python的項目,項目的布局,發布,開源等都是需要考慮的問題。

  • 第二個階段:中級,掌握自己特定領域的庫,掌握pythonic寫法,非常熟悉Python的特性

推薦的第一本書是《編寫高質量代碼–改善python程序的91個建議》,這本書大概的提了下Python工程的文件布局,更多的總結了如何寫出pythonic的代碼,另外,也介紹了一些常用的庫。

要想深入的了解Python,有的時候看看Python的源碼也是很重要的,自己通過讀懂源碼,來徹底的了解Python的核心機制,這里推薦《Python源碼剖析——深度探索動態語言核心技術》,這本書並沒有看完,只是在需要深入了解Python某個功能或者數據結構的時候看看相關章節,也覺得受益匪淺。

自己領域的書籍和資料也肯定很多,比如web開發的構架都有很多,只有了解熟悉了所有構架,在選擇的時候才能衡量利弊,然後深入掌握某些構架。

這個階段過後,可以寫出pythonic代碼,可以通過PEP8的檢查,可以為開源社區做貢獻了,可以將一個Python文件寫的十分好,但是如果要用Python開發一個大型項目,還是有很多東西需要掌握的,比如項目的文檔,項目的發布,下載,項目性能和案例等等。

  • 第三個階段:高級,從整個工程項目著眼,考慮document,distribution,性能優化等

目前只看了一本書《the hacker guide to python》,看的是英文版的,這本書對項目的布局,文檔,性能,發布等做了很多詳細的介紹,我覺得寫的還是很不錯,只不過本人還需要再讀幾遍。

對於大多數人來說,很難有機會從頭開始一個有意義的大型工程項目,所以自己可以用Python實現一些簡單的功能,簡單的項目,這個靈感可以去知乎或者quora搜索,很多前輩都分享了自己的經驗。

從大局入手,規劃好項目的布局,設定好相應的文檔說明,提供工程下載安裝的方法,帶幾個demo,每個類,每個函數,每行代碼都反復推敲,寫出pythonic的程序,相信這時候Python於我們便是信手拈來了!


總結


本文只是我認為的學習Python的三種境界,以我粗淺之眼光,肯定有太多太多的不足,而且自己也就是一個介於初級和高級Python程序員的水平,寫這個文章,也算是給自己設立的一個目標吧。




Ⅳ 爬蟲之類的腳本一般開多少個線程比較好其實

開發網路爬蟲應該選擇Nutch、Crawler4j、WebMagic、scrapy、WebCollector還是其他的?這里按照我的經驗隨便扯淡一下:上面說的爬蟲,基本可以分3類:1.分布式爬蟲:Nutch
2.JAVA單機爬蟲:Crawler4j、WebMagic、WebCollector
3. 非JAVA單機爬蟲:scrapy
第一類:分布式爬蟲
爬蟲使用分布式,主要是解決兩個問題:
1)海量URL管理
2)網速
現在比較流行的分布式爬蟲,是Apache的Nutch。但是對於大多數用戶來說,Nutch是這幾類爬蟲里,最不好的選擇,理由如下:
1)Nutch是為搜索引擎設計的爬蟲,大多數用戶是需要一個做精準數據爬取(精抽取)的爬蟲。Nutch運行的一套流程里,有三分之二是為了搜索引擎而設計的。對精抽取沒有太大的意義。也就是說,用Nutch做數據抽取,會浪費很多的時間在不必要的計算上。而且如果你試圖通過對Nutch進行二次開發,來使得它適用於精抽取的業務,基本上就要破壞Nutch的框架,把Nutch改的面目全非,有修改Nutch的能力,真的不如自己重新寫一個分布式爬蟲框架了。
2)Nutch依賴hadoop運行,hadoop本身會消耗很多的時間。如果集群機器數量較少,爬取速度反而不如單機爬蟲快。

Ⅵ 爬蟲在爬取過程中怎麼把url分配到多台機器

首先我看到你的問題第一想法就是,把所有url存儲到redis資料庫,然後所有的爬蟲在資料庫中提取url,
你的想法應該是scrapy分布式爬蟲。

Ⅶ 什麼叫爬蟲技術有什麼作用

爬蟲技術

爬蟲主要針對與網路網頁,又稱網路爬蟲、網路蜘蛛,可以自動化瀏覽網路中的信息,或者說是一種網路機器人。它們被廣泛用於互聯網搜索引擎或其他類似網站,以獲取或更新這些網站的內容和檢索方式。它們可以自動採集所有其能夠訪問到的頁面內容,以便程序做下一步的處理。

爬蟲技術步驟

我們絕大多數人每天都使用網路 - 用於新聞,購物,社交以及您可以想像的任何類型的活動。但是,當從網路上獲取數據用於分析或研究目的時,則需要以更技術性的方式查看Web內容 - 將其拆分為由其組成的構建塊,然後將它們重新組合為結構化的,機器可讀數據集。通常文本Web內容轉換為數據分為以下三個基本步驟 :

爬蟲:

Web爬蟲是一種自動訪問網頁的腳本或機器人,其作用是從網頁抓取原始數據 -最終用戶在屏幕上看到的各種元素(字元、圖片)。 其工作就像是在網頁上進行ctrl + a(全選內容),ctrl + c(復制內容),ctrl + v(粘貼內容)按鈕的機器人(當然實質上不是那麼簡單)。

通常情況下,爬蟲不會停留在一個網頁上,而是根據某些預定邏輯在停止之前抓取一系列網址 。 例如,它可能會跟蹤它找到的每個鏈接,然後抓取該網站。當然在這個過程中,需要優先考慮您抓取的網站數量,以及您可以投入到任務中的資源量(存儲,處理,帶寬等)。

解析:

解析意味著從數據集或文本塊中提取相關信息組件,以便以後可以容易地訪問它們並將其用於其他操作。要將網頁轉換為實際上對研究或分析有用的數據,我們需要以一種使數據易於根據定義的參數集進行搜索,分類和服務的方式進行解析。

存儲和檢索:

最後,在獲得所需的數據並將其分解為有用的組件之後,通過可擴展的方法來將所有提取和解析的數據存儲在資料庫或集群中,然後創建一個允許用戶可及時查找相關數據集或提取的功能。

爬蟲技術有什麼用

1、網路數據採集

利用爬蟲自動採集互聯網中的信息(圖片、文字、鏈接等),採集回來後進行相應的儲存與處理。並按照一定的規則和篩選標准進行數據歸類形成資料庫文件的一個過程。但在這個過程中,首先需要明確要採集的信息是什麼,當你將採集的條件收集得足夠精確時,採集的內容就越接近你想要的。

2、大數據分析

大數據時代,要進行數據分析,首先要有數據源,通過爬蟲技術可以獲得等多的數據源。在進行大數據分析或者進行數據挖掘的時候,數據源可以從某些提供數據統計的網站獲得,也可以從某些文獻或內部資料中獲得,但從這些獲得數據的方式,有時很難滿足我們對數據的需求,此時就可以利用爬蟲技術,自動地從互聯網中獲取需要的數據內容,並將這些數據內容作為數據源,從而進行更深層次的數據分析。

3、網頁分析

通過對網頁數據進行爬蟲採集,在獲得網站訪問量、客戶著陸頁、網頁關鍵詞權重等基本數據的情況下,分析網頁數據,從中發現訪客訪問網站的規律和特點,並將這些規律與網路營銷策略等相結合,從而發現目前網路營銷活動和運營中可能存在的問題和機遇,並為進一步修正或重新制定策略提供依據。

熱點內容
線切割怎麼導圖 發布:2021-03-15 14:26:06 瀏覽:709
1台皮秒機器多少錢 發布:2021-03-15 14:25:49 瀏覽:623
焊接法蘭如何根據口徑配螺栓 發布:2021-03-15 14:24:39 瀏覽:883
印章雕刻機小型多少錢 發布:2021-03-15 14:22:33 瀏覽:395
切割機三五零木工貝片多少錢 發布:2021-03-15 14:22:30 瀏覽:432
加工盜磚片什麼櫸好 發布:2021-03-15 14:16:57 瀏覽:320
北洋機器局製造的銀元什麼樣 發布:2021-03-15 14:16:52 瀏覽:662
未來小七機器人怎麼更新 發布:2021-03-15 14:16:33 瀏覽:622
rexroth加工中心亂刀怎麼自動調整 發布:2021-03-15 14:15:05 瀏覽:450
機械鍵盤的鍵帽怎麼選 發布:2021-03-15 14:15:02 瀏覽:506