多執行緒提提速吧

2021-09-20 00:01:26 字數 3955 閱讀 8851

爬蟲用執行緒提速吧,用斗圖網來做個對比。

普通爬蟲,沒用執行緒的例子:

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 的記憶體塊也打上...