爬蟲用執行緒提速吧,用斗圖網來做個對比。
普通爬蟲,沒用執行緒的例子:
import re,os,requests,time
from urllib import request
from lxml import etree
from fake_useragent import useragent
def get_url(url):
ua = useragent().random
headers =
r = requests.get(url,headers=headers)
if r.status_code == 200:
print('請求成功')
return r.text
def parse(html):
html_data = etree.html(html)
# 這裡獲取的不包括 gif **的形式,注意這種寫法
imgs = html_data.xpath('//div[@class="page-content text-center"]//img[@class!="gif"]')
for img in imgs:
image_url = img.get('data-backup')
# 獲取鏈結的字尾 單詞是字尾的意思
# 獲取標題及剔除標題特殊字元
img_title = img.get('alt')
img_title = re.sub('[?\?。,\.!!]','',img_title)
filenamre = img_title + suffix
request.urlretrieve(image_url,'images/'+filenamre) # 儲存到資料夾 images 下
print('儲存成功')
def main():
for i in range(1,2):
print('第 %d 頁' % i)
url = ''.format(i)
html = get_url(url)
parse(html)
if __name__ == '__main__':
start = time.time()
main()
end = time.time()
print('共執行了%s秒' % (end - start))
執行速度
def main():
image_queue = queue(1000) # 建立獲取具體表情 url 的佇列
for i in range(1,10):
print('第 %d 頁' % i)
url = ''.format(i)
page_queue.put(url)
建立生產者模型:
# 建立生產者佇列
class procuder(threading.thread):
# 重寫父類建構函式,繼承父類所有方法,同時新增兩個引數
def __init__(self,page_queue,image_queue,*args,**kwargs):
super(procuder,self).__init__(*args,**kwargs)
self.page_queue = page_queue
self.image_queue = image_queue
def run(self):
while true:
break
url = self.page_queue.get() # 獲取頁面url,交由解析url的方法解析url
self.parse(url)
def parse(self,url):
ua = useragent().random
headers =
r = requests.get(url,headers=headers)
html_data = etree.html(r.text)
# 這裡獲取的不包括 gif **的形式,注意這種寫法
imgs = html_data.xpath('//div[@class="page-content text-center"]//img[@class!="gif"]')
for img in imgs:
image_url = img.get('data-backup')
# 獲取鏈結的字尾 單詞是字尾的意思
# 獲取標題及剔除標題特殊字元
img_title = img.get('alt')
img_title = re.sub('[?\?。,\.!!\*]','',img_title)
filenamre = img_title + suffix
self.image_queue.put((image_url,filenamre)) # 把的url傳遞給獲取的佇列
建立消費者模型
class consumer(threading.thread):
# 重寫父類建構函式,繼承父類所有方法,同時新增兩個引數
def __init__(self,page_queue,image_queue,*args,**kwargs):
super(consumer,self).__init__(*args,**kwargs)
self.page_queue = page_queue
self.image_queue = image_queue
def run(self):
while true:
# 判斷兩個佇列是否都為空,是就結束迴圈,不要讓佇列一直在等待操作
if self.page_queue.empty() and self.image_queue.empty():
break
image_url,filename = self.image_queue.get() # 獲取具體表情的url佇列中的url和檔名
request.urlretrieve(image_url,'images/'+ filename) # 儲存到資料夾 images 下
print(filename + '儲存成功')
主程式
def main():
image_queue = queue(1000) # 建立獲取具體表情 url 的佇列
for i in range(1,10):
print('第 %d 頁' % i)
url = ''.format(i)
page_queue.put(url)
# 分別建立五個生產者,五個消費者,開啟執行緒
for i in range(5):
t = procuder(page_queue,image_queue)
t.start()
for i in range(5):
t = consumer(page_queue,image_queue)
t.start()
if __name__ == '__main__':
main()
免費線上課 明天花2小時,給你的工作加提提速!
你今天上班很累?不要緊!因為明天還會更累 馬上過年了,加了一年班,和你的目標是不是更遠了?鄭重宣告 以上不是針對誰,而是說的大多數。2017,你還打算繼續嗎?心裡說著不要,身體卻依然日復一日的重複著昨天的低效?現在有兩個選擇擺在你面前 一是繼續等待如 戈多 般永遠不會來的改變 二是明天下午騰出兩個小...
多執行緒 多執行緒原理
我們首先要知道什麼是多執行緒,說白了就是多個執行緒,執行緒是什麼呢,其實就是程序執行的途徑,那麼說道這裡我們又引入了乙個新的名字,就是程序,那麼我們來看看什麼是程序,其實我們自己也能看到,啟動電腦的任務管理器,我們就可以看到程序選項,裡面是我們電腦所有的程序,我們會發現有很多的程序.簡單地說就是程序...
執行緒關聯記憶體池再提速
5 執行緒關聯記憶體池再提速 上一節已經提到問題,解決辦法是這樣的 struct tm bufunit static void tm malloc size t size,size t osize null returnnull 看上面的 應該很容易明白,就是將由該池 malloc 的記憶體塊也打上...