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

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

python中爬蟲函數(shù) python爬蟲方法

如何用Python做爬蟲

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

成都創(chuàng)新互聯(lián)公司擁有十多年成都網(wǎng)站建設(shè)工作經(jīng)驗(yàn),為各大企業(yè)提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)服務(wù),對(duì)于網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、app軟件開發(fā)、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、主機(jī)域名等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營(yíng)銷、管理等網(wǎng)站化運(yùn)作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設(shè)項(xiàng)目的能力。

想象你是一只蜘蛛,現(xiàn)在你被放到了互聯(lián)“網(wǎng)”上。那么,你需要把所有的網(wǎng)頁(yè)都看一遍。怎么辦呢?沒(méi)問(wèn)題呀,你就隨便從某個(gè)地方開始,比如說(shuō)人民日?qǐng)?bào)的首頁(yè),這個(gè)叫initial pages,用$表示吧。

在人民日?qǐng)?bào)的首頁(yè),你看到那個(gè)頁(yè)面引向的各種鏈接。于是你很開心地從爬到了“國(guó)內(nèi)新聞”那個(gè)頁(yè)面。太好了,這樣你就已經(jīng)爬完了倆頁(yè)面(首頁(yè)和國(guó)內(nèi)新聞)!暫且不用管爬下來(lái)的頁(yè)面怎么處理的,你就想象你把這個(gè)頁(yè)面完完整整抄成了個(gè)html放到了你身上。

突然你發(fā)現(xiàn), 在國(guó)內(nèi)新聞這個(gè)頁(yè)面上,有一個(gè)鏈接鏈回“首頁(yè)”。作為一只聰明的蜘蛛,你肯定知道你不用爬回去的吧,因?yàn)槟阋呀?jīng)看過(guò)了啊。所以,你需要用你的腦子,存下你已經(jīng)看過(guò)的頁(yè)面地址。這樣,每次看到一個(gè)可能需要爬的新鏈接,你就先查查你腦子里是不是已經(jīng)去過(guò)這個(gè)頁(yè)面地址。如果去過(guò),那就別去了。

好的,理論上如果所有的頁(yè)面可以從initial page達(dá)到的話,那么可以證明你一定可以爬完所有的網(wǎng)頁(yè)。

那么在python里怎么實(shí)現(xiàn)呢?

很簡(jiǎn)單

import Queue

initial_page = "初始化頁(yè)"

url_queue = Queue.Queue()

seen = set()

seen.insert(initial_page)

url_queue.put(initial_page)

while(True): #一直進(jìn)行直到??菔癄€

if url_queue.size()0:

current_url = url_queue.get() #拿出隊(duì)例中第一個(gè)的url

store(current_url) #把這個(gè)url代表的網(wǎng)頁(yè)存儲(chǔ)好

for next_url in extract_urls(current_url): #提取把這個(gè)url里鏈向的url

if next_url not in seen:

seen.put(next_url)

url_queue.put(next_url)

else:

break

寫得已經(jīng)很偽代碼了。

所有的爬蟲的backbone都在這里,下面分析一下為什么爬蟲事實(shí)上是個(gè)非常復(fù)雜的東西——搜索引擎公司通常有一整個(gè)團(tuán)隊(duì)來(lái)維護(hù)和開發(fā)。

2)效率

如果你直接加工一下上面的代碼直接運(yùn)行的話,你需要一整年才能爬下整個(gè)豆瓣的內(nèi)容。更別說(shuō)Google這樣的搜索引擎需要爬下全網(wǎng)的內(nèi)容了。

問(wèn)題出在哪呢?需要爬的網(wǎng)頁(yè)實(shí)在太多太多了,而上面的代碼太慢太慢了。設(shè)想全網(wǎng)有N個(gè)網(wǎng)站,那么分析一下判重的復(fù)雜度就是N*log(N),因?yàn)樗芯W(wǎng)頁(yè)要遍歷一次,而每次判重用set的話需要log(N)的復(fù)雜度。OK,OK,我知道python的set實(shí)現(xiàn)是hash——不過(guò)這樣還是太慢了,至少內(nèi)存使用效率不高。

通常的判重做法是怎樣呢?Bloom Filter. 簡(jiǎn)單講它仍然是一種hash的方法,但是它的特點(diǎn)是,它可以使用固定的內(nèi)存(不隨url的數(shù)量而增長(zhǎng))以O(shè)(1)的效率判定url是否已經(jīng)在set中??上煜聸](méi)有白吃的午餐,它的唯一問(wèn)題在于,如果這個(gè)url不在set中,BF可以100%確定這個(gè)url沒(méi)有看過(guò)。但是如果這個(gè)url在set中,它會(huì)告訴你:這個(gè)url應(yīng)該已經(jīng)出現(xiàn)過(guò),不過(guò)我有2%的不確定性。注意這里的不確定性在你分配的內(nèi)存足夠大的時(shí)候,可以變得很小很少。一個(gè)簡(jiǎn)單的教程:Bloom Filters by Example

注意到這個(gè)特點(diǎn),url如果被看過(guò),那么可能以小概率重復(fù)看一看(沒(méi)關(guān)系,多看看不會(huì)累死)。但是如果沒(méi)被看過(guò),一定會(huì)被看一下(這個(gè)很重要,不然我們就要漏掉一些網(wǎng)頁(yè)了?。?。 [IMPORTANT: 此段有問(wèn)題,請(qǐng)暫時(shí)略過(guò)]

好,現(xiàn)在已經(jīng)接近處理判重最快的方法了。另外一個(gè)瓶頸——你只有一臺(tái)機(jī)器。不管你的帶寬有多大,只要你的機(jī)器下載網(wǎng)頁(yè)的速度是瓶頸的話,那么你只有加快這個(gè)速度。用一臺(tái)機(jī)子不夠的話——用很多臺(tái)吧!當(dāng)然,我們假設(shè)每臺(tái)機(jī)子都已經(jīng)進(jìn)了最大的效率——使用多線程(python的話,多進(jìn)程吧)。

3)集群化抓取

爬取豆瓣的時(shí)候,我總共用了100多臺(tái)機(jī)器晝夜不停地運(yùn)行了一個(gè)月。想象如果只用一臺(tái)機(jī)子你就得運(yùn)行100個(gè)月了...

那么,假設(shè)你現(xiàn)在有100臺(tái)機(jī)器可以用,怎么用python實(shí)現(xiàn)一個(gè)分布式的爬取算法呢?

我們把這100臺(tái)中的99臺(tái)運(yùn)算能力較小的機(jī)器叫作slave,另外一臺(tái)較大的機(jī)器叫作master,那么回顧上面代碼中的url_queue,如果我們能把這個(gè)queue放到這臺(tái)master機(jī)器上,所有的slave都可以通過(guò)網(wǎng)絡(luò)跟master聯(lián)通,每當(dāng)一個(gè)slave完成下載一個(gè)網(wǎng)頁(yè),就向master請(qǐng)求一個(gè)新的網(wǎng)頁(yè)來(lái)抓取。而每次slave新抓到一個(gè)網(wǎng)頁(yè),就把這個(gè)網(wǎng)頁(yè)上所有的鏈接送到master的queue里去。同樣,bloom filter也放到master上,但是現(xiàn)在master只發(fā)送確定沒(méi)有被訪問(wèn)過(guò)的url給slave。Bloom Filter放到master的內(nèi)存里,而被訪問(wèn)過(guò)的url放到運(yùn)行在master上的Redis里,這樣保證所有操作都是O(1)。(至少平攤是O(1),Redis的訪問(wèn)效率見(jiàn):LINSERT – Redis)

考慮如何用python實(shí)現(xiàn):

在各臺(tái)slave上裝好scrapy,那么各臺(tái)機(jī)子就變成了一臺(tái)有抓取能力的slave,在master上裝好Redis和rq用作分布式隊(duì)列。

代碼于是寫成

#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)

好的,其實(shí)你能想到,有人已經(jīng)給你寫好了你需要的:darkrho/scrapy-redis · GitHub

4)展望及后處理

雖然上面用很多“簡(jiǎn)單”,但是真正要實(shí)現(xiàn)一個(gè)商業(yè)規(guī)??捎玫呐老x并不是一件容易的事。上面的代碼用來(lái)爬一個(gè)整體的網(wǎng)站幾乎沒(méi)有太大的問(wèn)題。

但是如果附加上你需要這些后續(xù)處理,比如

有效地存儲(chǔ)(數(shù)據(jù)庫(kù)應(yīng)該怎樣安排)

有效地判重(這里指網(wǎng)頁(yè)判重,咱可不想把人民日?qǐng)?bào)和抄襲它的大民日?qǐng)?bào)都爬一遍)

有效地信息抽取(比如怎么樣抽取出網(wǎng)頁(yè)上所有的地址抽取出來(lái),“朝陽(yáng)區(qū)奮進(jìn)路中華道”),搜索引擎通常不需要存儲(chǔ)所有的信息,比如圖片我存來(lái)干嘛...

及時(shí)更新(預(yù)測(cè)這個(gè)網(wǎng)頁(yè)多久會(huì)更新一次)

如你所想,這里每一個(gè)點(diǎn)都可以供很多研究者十?dāng)?shù)年的研究。雖然如此,

“路漫漫其修遠(yuǎn)兮,吾將上下而求索”。

所以,不要問(wèn)怎么入門,直接上路就好了:)

python爬蟲是干嘛的

爬蟲技術(shù)是一種自動(dòng)化程序。

爬蟲就是一種可以從網(wǎng)頁(yè)上抓取數(shù)據(jù)信息并保存的自動(dòng)化程序,它的原理就是模擬瀏覽器發(fā)送網(wǎng)絡(luò)請(qǐng)求,接受請(qǐng)求響應(yīng),然后按照一定的規(guī)則自動(dòng)抓取互聯(lián)網(wǎng)數(shù)據(jù)。

搜索引擎通過(guò)這些爬蟲從一個(gè)網(wǎng)站爬到另一個(gè)網(wǎng)站,跟蹤網(wǎng)頁(yè)中的鏈接,訪問(wèn)更多的網(wǎng)頁(yè),這個(gè)過(guò)程稱為爬行,這些新的網(wǎng)址會(huì)被存入數(shù)據(jù)庫(kù)等待搜索。簡(jiǎn)而言之,爬蟲就是通過(guò)不間斷地訪問(wèn)互聯(lián)網(wǎng),然后從中獲取你指定的信息并返回給你。而我們的互聯(lián)網(wǎng)上,隨時(shí)都有無(wú)數(shù)的爬蟲在爬取數(shù)據(jù),并返回給使用者。

爬蟲技術(shù)的功能

1、獲取網(wǎng)頁(yè)

獲取網(wǎng)頁(yè)可以簡(jiǎn)單理解為向網(wǎng)頁(yè)的服務(wù)器發(fā)送網(wǎng)絡(luò)請(qǐng)求,然后服務(wù)器返回給我們網(wǎng)頁(yè)的源代碼,其中通信的底層原理較為復(fù)雜,而Python給我們封裝好了urllib庫(kù)和requests庫(kù)等,這些庫(kù)可以讓我們非常簡(jiǎn)單的發(fā)送各種形式的請(qǐng)求。

2、提取信息

獲取到的網(wǎng)頁(yè)源碼內(nèi)包含了很多信息,想要進(jìn)提取到我們需要的信息,則需要對(duì)源碼還要做進(jìn)一步篩選??梢赃x用python中的re庫(kù)即通過(guò)正則匹配的形式去提取信息,也可以采用BeautifulSoup庫(kù)(bs4)等解析源代碼,除了有自動(dòng)編碼的優(yōu)勢(shì)之外,bs4庫(kù)還可以結(jié)構(gòu)化輸出源代碼信息,更易于理解與使用。

3、保存數(shù)據(jù)

提取到我們需要的有用信息后,需要在Python中把它們保存下來(lái)??梢允褂猛ㄟ^(guò)內(nèi)置函數(shù)open保存為文本數(shù)據(jù),也可以用第三方庫(kù)保存為其它形式的數(shù)據(jù),例如可以通過(guò)pandas庫(kù)保存為常見(jiàn)的xlsx數(shù)據(jù),如果有圖片等非結(jié)構(gòu)化數(shù)據(jù)還可以通過(guò)pymongo庫(kù)保存至非結(jié)構(gòu)化數(shù)據(jù)庫(kù)中。

Python編程基礎(chǔ)之(五)Scrapy爬蟲框架

經(jīng)過(guò)前面四章的學(xué)習(xí),我們已經(jīng)可以使用Requests庫(kù)、Beautiful Soup庫(kù)和Re庫(kù),編寫基本的Python爬蟲程序了。那么這一章就來(lái)學(xué)習(xí)一個(gè)專業(yè)的網(wǎng)絡(luò)爬蟲框架--Scrapy。沒(méi)錯(cuò),是框架,而不是像前面介紹的函數(shù)功能庫(kù)。

Scrapy是一個(gè)快速、功能強(qiáng)大的網(wǎng)絡(luò)爬蟲框架。

可能大家還不太了解什么是框架,爬蟲框架其實(shí)是實(shí)現(xiàn)爬蟲功能的一個(gè)軟件結(jié)構(gòu)和功能組件的集合。

簡(jiǎn)而言之, Scrapy就是一個(gè)爬蟲程序的半成品,可以幫助用戶實(shí)現(xiàn)專業(yè)的網(wǎng)絡(luò)爬蟲。

使用Scrapy框架,不需要你編寫大量的代碼,Scrapy已經(jīng)把大部分工作都做好了,允許你調(diào)用幾句代碼便自動(dòng)生成爬蟲程序,可以節(jié)省大量的時(shí)間。

當(dāng)然,框架所生成的代碼基本是一致的,如果遇到一些特定的爬蟲任務(wù)時(shí),就不如自己使用Requests庫(kù)搭建來(lái)的方便了。

PyCharm安裝

測(cè)試安裝:

出現(xiàn)框架版本說(shuō)明安裝成功。

掌握Scrapy爬蟲框架的結(jié)構(gòu)是使用好Scrapy的重中之重!

先上圖:

整個(gè)結(jié)構(gòu)可以簡(jiǎn)單地概括為: “5+2”結(jié)構(gòu)和3條數(shù)據(jù)流

5個(gè)主要模塊(及功能):

(1)控制所有模塊之間的數(shù)據(jù)流。

(2)可以根據(jù)條件觸發(fā)事件。

(1)根據(jù)請(qǐng)求下載網(wǎng)頁(yè)。

(1)對(duì)所有爬取請(qǐng)求進(jìn)行調(diào)度管理。

(1)解析DOWNLOADER返回的響應(yīng)--response。

(2)產(chǎn)生爬取項(xiàng)--scraped item。

(3)產(chǎn)生額外的爬取請(qǐng)求--request。

(1)以流水線方式處理SPIDER產(chǎn)生的爬取項(xiàng)。

(2)由一組操作順序組成,類似流水線,每個(gè)操作是一個(gè)ITEM PIPELINES類型。

(3)清理、檢查和查重爬取項(xiàng)中的HTML數(shù)據(jù)并將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中。

2個(gè)中間鍵:

(1)對(duì)Engine、Scheduler、Downloader之間進(jìn)行用戶可配置的控制。

(2)修改、丟棄、新增請(qǐng)求或響應(yīng)。

(1)對(duì)請(qǐng)求和爬取項(xiàng)進(jìn)行再處理。

(2)修改、丟棄、新增請(qǐng)求或爬取項(xiàng)。

3條數(shù)據(jù)流:

(1):圖中數(shù)字 1-2

1:Engine從Spider處獲得爬取請(qǐng)求--request。

2:Engine將爬取請(qǐng)求轉(zhuǎn)發(fā)給Scheduler,用于調(diào)度。

(2):圖中數(shù)字 3-4-5-6

3:Engine從Scheduler處獲得下一個(gè)要爬取的請(qǐng)求。

4:Engine將爬取請(qǐng)求通過(guò)中間件發(fā)送給Downloader。

5:爬取網(wǎng)頁(yè)后,Downloader形成響應(yīng)--response,通過(guò)中間件發(fā)送給Engine。

6:Engine將收到的響應(yīng)通過(guò)中間件發(fā)送給Spider處理。

(3):圖中數(shù)字 7-8-9

7:Spider處理響應(yīng)后產(chǎn)生爬取項(xiàng)--scraped item。

8:Engine將爬取項(xiàng)發(fā)送給Item Pipelines。

9:Engine將爬取請(qǐng)求發(fā)送給Scheduler。

任務(wù)處理流程:從Spider的初始爬取請(qǐng)求開始爬取,Engine控制各模塊數(shù)據(jù)流,不間斷從Scheduler處獲得爬取請(qǐng)求,直至請(qǐng)求為空,最后到Item Pipelines存儲(chǔ)數(shù)據(jù)結(jié)束。

作為用戶,只需配置好Scrapy框架的Spider和Item Pipelines,也就是數(shù)據(jù)流的入口與出口,便可完成一個(gè)爬蟲程序的搭建。Scrapy提供了簡(jiǎn)單的爬蟲命令語(yǔ)句,幫助用戶一鍵配置剩余文件,那我們便來(lái)看看有哪些好用的命令吧。

Scrapy采用命令行創(chuàng)建和運(yùn)行爬蟲

PyCharm打開Terminal,啟動(dòng)Scrapy:

Scrapy基本命令行格式:

具體常用命令如下:

下面用一個(gè)例子來(lái)學(xué)習(xí)一下命令的使用:

1.建立一個(gè)Scrapy爬蟲工程,在已啟動(dòng)的Scrapy中繼續(xù)輸入:

執(zhí)行該命令,系統(tǒng)會(huì)在PyCharm的工程文件中自動(dòng)創(chuàng)建一個(gè)工程,命名為pythonDemo。

2.產(chǎn)生一個(gè)Scrapy爬蟲,以教育部網(wǎng)站為例:

命令生成了一個(gè)名為demo的spider,并在Spiders目錄下生成文件demo.py。

命令僅用于生成demo.py文件,該文件也可以手動(dòng)生成。

觀察一下demo.py文件:

3.配置產(chǎn)生的spider爬蟲,也就是demo.py文件:

4.運(yùn)行爬蟲,爬取網(wǎng)頁(yè):

如果爬取成功,會(huì)發(fā)現(xiàn)在pythonDemo下多了一個(gè)t20210816_551472.html的文件,我們所爬取的網(wǎng)頁(yè)內(nèi)容都已經(jīng)寫入該文件了。

以上就是Scrapy框架的簡(jiǎn)單使用了。

Request對(duì)象表示一個(gè)HTTP請(qǐng)求,由Spider生成,由Downloader執(zhí)行。

Response對(duì)象表示一個(gè)HTTP響應(yīng),由Downloader生成,有Spider處理。

Item對(duì)象表示一個(gè)從HTML頁(yè)面中提取的信息內(nèi)容,由Spider生成,由Item Pipelines處理。Item類似于字典類型,可以按照字典類型來(lái)操作。

python爬蟲 函數(shù)返回值如何調(diào)用?

在if 里只需要yield "" + item_url.attrs['href']

然后Lsit(最好改可名,在python規(guī)范里,函數(shù)命名是全小寫,而list又是保留字,比如改為display_hrefs)只需要循環(huán)輸出getUrl的結(jié)果就好:

def getUrl(url: str):

....html = urlopen(url)

....for item_url in BeautifulSoup((html.read()).find ('div' , class_='AAA').findAll ("a"):

........if 'href' in item_url.attrs:

............yield "" + item_url.attrs['href']

def display_hrefs(url: str):

....for href in getUrl(url):

........print(href)

if __name__ == '__main__':

....display_hrefs("")


文章標(biāo)題:python中爬蟲函數(shù) python爬蟲方法
URL分享:http://weahome.cn/article/hpoohj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部