上篇寫了乙個單程序爬224個頁面需要用450秒的時間,這次用下python的多程序的方式去改寫一下,儘管大家都說python的多程序是雞肋,但存在就是合理,多程序思路也很簡單。
1,建立多個queue佇列,在迴圈links鏈結時將每個link鏈結put進queue列表裡。
2.開啟多個執行緒同時將每個queue join進每個執行緒,當執行緒暫用時會進入阻塞狀態
3.當queue佇列長度為0時,向程序傳送none通知執行緒關閉。
import time
import requests
from lxml import etree
import threading
from queue import queue
start_url =
""download_pages =
0cookies =
link_queue = queue(
)threads_num =
50threads =
deffetch
(url)
:print
("正在請求%s"
% url)
r = requests.get(url, cookies=cookies)
text = r.text
print
("請求結果%s"
% r.reason)
if r.status_code !=
200:
r.raise_for_status(
)global download_pages
download_pages +=
1return text.replace(
'\t',''
)def
parse_university
(url)
: time.sleep(1)
selector = etree.html(fetch(url)
)# print(dir(selector))
data =
data[
'name'
]= selector.xpath(
'//div[@id="wikicontent"]/h1/text()')[
0]table = selector.xpath(
'//div[@id="wikicontent"]/div[@class="infobox"]/table'
)if table:
table = table[0]
keys = table.xpath(
'.//td[1]/p/text()'
) cols = table.xpath(
'.//td[2]'
) values =
[' '
.join(col.xpath(
'.//text()'))
for col in cols]
iflen
(keys)
!=len
(values)
:return
none
data.update(
zip(keys, values)
)return data
defprocess_data
(data)
:if data:
print
(data)
defdownload()
:while
true
:# 阻塞直到從佇列裡獲取一條訊息
link = link_queue.get(
)if link is
none
:break
data = parse_university(link)
process_data(data)
link_queue.task_done(
)print
('還有%s個佇列'
% link_queue.qsize())
if __name__ ==
'__main__'
:# 記錄程式啟動時間
start_time = time.time(
)# 1.請求入口頁面
selector = etree.html(fetch(start_url)
)# 2.提取頁面a標籤鏈結
links = selector.xpath(
'//div[@id="content"]//tr[position()>1]/td[2]/a/@href'
)for link in links:
# 將鏈結放入列表中。
link_queue.put(link)
# 啟動執行緒,並將執行緒物件放入乙個列表儲存
for i in
range
(threads_num)
: t = threading.thread(target=download)
t.start(
)# 阻塞佇列直到佇列被清空
link_queue.join(
)# 向佇列傳送n個none,通知執行緒退出
for i in
range
(threads_num)
: link_queue.put(
none
)# 退出執行緒
for t in threads:
t.join(
) cost_time = time.time(
)- start_time
print
("dowmlooad %d pages, cost %.2f second"
%(download_pages, cost_time)
)
主要修改
和新增download方法
實驗結果:
單程序用了400多秒,開啟50個執行緒90多秒。python多程序還是有點效果。
多程序爬蟲
1.多程序爬貓眼電影 下圖是爬去後的結果 在寫爬蟲的時候,資料量大的時候,所需要的時間就會很長,所以今天就來說多程序爬資料,有興趣的可以執行下面的 coding utf 8 import sys reload sys sys.setdefaultencoding utf 8 import reque...
Python 學習筆記 多程序爬蟲
前段時間學習了多執行緒,但在實際的情況中對於多執行緒的速度實在不滿意,所以今天就來學學多程序分布式爬蟲,在這裡感謝莫煩的python教程。在講述多程序之前,先來回顧一下之前學習的多執行緒。對於多執行緒可以簡單的理解成運輸快遞的貨車,雖然在整個運輸快遞的途中有很多貨車參與運輸,但快遞到你手中的時間並不...
Python爬蟲 非同步爬蟲(多程序和多執行緒)
非同步爬蟲 在爬蟲中使用非同步實現高效能的資料爬取操作 執行緒是程式執行的最小單位,乙個程序可以有多個執行緒。非同步爬蟲的方式 多程序,多執行緒 不建議 好處 可以為相關阻塞的操作單獨開啟程序或者執行緒,阻塞操作就可以非同步執行 繼續執行阻塞的操作之後的 弊端 無法無限制地開啟多程序或者多執行緒 程...