非同步爬蟲:在爬蟲中使用非同步實現高效能的資料爬取操作
執行緒是程式執行的最小單位,乙個程序可以有多個執行緒。
非同步爬蟲的方式:多程序,多執行緒(不建議)
好處:可以為相關阻塞的操作單獨開啟程序或者執行緒,阻塞操作就可以非同步執行(繼續執行阻塞的操作之後的**)
弊端:無法無限制地開啟多程序或者多執行緒
程序池或者執行緒池(適當地使用)
好處:可以降低系統對程序或者執行緒建立和銷毀的頻率,從而降低系統的開銷
弊端:池中程序或者執行緒的數量有限制
'''
#單執行緒-序列-傳送請求和獲取響應資料
#爬蟲效率低
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教程。在講述多程序之前,先來回顧一下之前學習的多執行緒。對於多執行緒可以簡單的理解成運輸快遞的貨車,雖然在整個運輸快遞的途中有很多貨車參與運輸,但快遞到你手中的時間並不...