Python爬蟲 非同步爬蟲(多程序和多執行緒)

2021-10-10 17:56:54 字數 3500 閱讀 6021

非同步爬蟲:在爬蟲中使用非同步實現高效能的資料爬取操作

執行緒是程式執行的最小單位,乙個程序可以有多個執行緒。

非同步爬蟲的方式:多程序,多執行緒(不建議)

好處:可以為相關阻塞的操作單獨開啟程序或者執行緒,阻塞操作就可以非同步執行(繼續執行阻塞的操作之後的**)

弊端:無法無限制地開啟多程序或者多執行緒

程序池或者執行緒池(適當地使用)

好處:可以降低系統對程序或者執行緒建立和銷毀的頻率,從而降低系統的開銷

弊端:池中程序或者執行緒的數量有限制

'''

#單執行緒-序列-傳送請求和獲取響應資料

#爬蟲效率低

import requests

headers =

urls =

def get_content

(url)

:print

('正在爬取:'

,url)

#get方法是乙個阻塞的方法

response = requests.

get(url=url,headers=headers)

if response.status_code ==

200:

return response.content

def parse_content

(content)

:print

('響應資料的長度:'

,len

(content)

)for url in urls:

content =

get_content

(url)

parse_content

(content)

''''''

#使用單執行緒序列方式執行

import time

#模擬爬蟲

def get_page

(str)

:print

(,str)

time.

sleep(3

) #模擬傳送請求和獲取響應資料需要的時間

print

(,str)

name_list =

['xiaozi'

,'aa'

,'bb'

,'cc'

] #模擬url

start_time = time.

time()

for i in

range

(len

(name_list)):

get_page

(name_list[i]

)end_time = time.

time()

print

('%d second'

%(end_time-start_time)

) #程式執行完成需要的時間,12秒

''''''

#使用執行緒池方式執行

import time

from multiprocessing.dummy import pool #匯入執行緒池模組對應的類

start_time = time.

time()

#模擬爬蟲

def get_page

(str)

:print

(,str)

time.

sleep(3

) #模擬傳送請求和獲取響應資料需要的時間

print

(,str)

name_list =

['xiaozi'

,'aa'

,'bb'

,'cc'

] #模擬url

#例項化乙個執行緒池物件

pool =

pool(4

) #處理4個請求阻塞

#將列表中每乙個元素傳遞給get_page進行處理

pool.

map(get_page,name_list) #第乙個引數是函式,第二個引數是列表

end_time = time.

time()

print

('%d second'

%(end_time-start_time)

) #程式執行完成需要的時間,3秒

'''#原則:執行緒池處理的是阻塞並且比較耗時的操作

import requests

from lxml import etree

import re

from multiprocessing.dummy import pool

headers =

url =

''page_text = requests.

get(url=url,headers=headers)

.text

tree = etree.

html

(page_text)

li_list = tree.

xpath

('//ul[@id="listvideolistul"]/li'

)urls =

[for li in li_list:

detail_url =

''+li.

xpath

('./div/a/@href')[

0]name = li.

xpath

('./div/a/div[2]/text()')[

0]+'.mp4'

print

(detail_url,name)

detail_page_text = requests.

get(url=detail_url,headers=headers)

.text

ex =

'srcurl="(.*?)",vdourl'

video_url = re.

findall

(ex,detail_page_text)[0

] dic =

urls.

(dic)

def get_video_data

(dic)

: url = dic[

'url'

]print

(dic[

'name'],

) data = requests.

get(url=url,headers=headers)

.content

#持久化儲存操作

with

open

(dic[

'name'],

'wb'

)as fp:

fp.write

(data)

print

(dic[

'name'],

)pool =

pool(4

)pool.

map(get_video_data,urls)

pool.

close()

pool.

join

()

多程序爬蟲

1.多程序爬貓眼電影 下圖是爬去後的結果 在寫爬蟲的時候,資料量大的時候,所需要的時間就會很長,所以今天就來說多程序爬資料,有興趣的可以執行下面的 coding utf 8 import sys reload sys sys.setdefaultencoding utf 8 import reque...

python爬蟲 非同步爬蟲

壞處 無法無限制的開啟多執行緒或者多程序。執行緒池 程序池 適當使用 使用非同步實現高效能的資料爬取操作 人多力量大 環境安裝 pip install aiohttp 使用該模組中的clientsession 2表示同時存在兩個協程 pool pool 2 urls for i in range 1...

Python 學習筆記 多程序爬蟲

前段時間學習了多執行緒,但在實際的情況中對於多執行緒的速度實在不滿意,所以今天就來學學多程序分布式爬蟲,在這裡感謝莫煩的python教程。在講述多程序之前,先來回顧一下之前學習的多執行緒。對於多執行緒可以簡單的理解成運輸快遞的貨車,雖然在整個運輸快遞的途中有很多貨車參與運輸,但快遞到你手中的時間並不...