概述
爬虫笔记:
import threading
import re
import requests
from urllib import request
import queue
from bs4 import BeautifulSoup
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66",
'Referer': 'http://yys.163.com/media/picture.html',
'Cookie': 'topbarnewsshow=1; __gads=ID=0780f1d238d9a811:T=1555032654:S=ALNI_MYuDUenL9zC5w2_pJ5Cp-VRhMH3Eg; vjuids=de05280e7.16a254536d7.0.c9258836cdcd4; __utma=187553192.574913776.1555392799.1555392799.1555392799.1; mail_psc_fingerprint=cc4f4236b1f73147b1b64e4d9978451d; _ntes_nuid=bb73ca2e1a72bc2b6a047b3dbccbb471; vjlast=1555403454.1555403454.30; _ntes_nnid=bb73ca2e1a72bc2b6a047b3dbccbb471,1604720068861; UM_distinctid=175a0c50cec6fd-0ce2d072ebf6f2-7f677c65-144000-175a0c50ced776; vinfo_n_f_l_n3=1052cc792afa343d.1.0.1604720091360.0.1604720324923; _nietop_foot=%u9634%u9633%u5E08%7Cyys.163.com; ctoken_id=cabfb0cb100247a5aa1e430f63ee45bb'
}
class UrlGet(threading.Thread):
def __init__(self,base_url,image_queue,*args,**kwargs):
super(UrlGet, self).__init__(*args,**kwargs)
self.image_queue = image_queue
self.base_url = base_url
def run(self) -> None:
resp = requests.get(self.base_url, headers=headers)
result = resp.text
soup = BeautifulSoup(result, 'lxml')
divs = soup.find_all('div', class_="mask")
image_urls = re.findall((r'<a.*?href="(.*?)".*?</a>'), str(divs), re.DOTALL | re.S)
path = r'C:UserstaokuDesktoptest_4%s.jpg'
for index,image_url in enumerate(image_urls):
self.image_queue.put({"image_url":image_url,"path":path % index})
class ImageDownload(threading.Thread):
def __init__(self,image_queue,*args,**kwargs):
super(ImageDownload, self).__init__(*args,**kwargs)
self.image_queue = image_queue
def run(self) -> None:
while True:
try:
single_image_urls = self.image_queue.get(timeout=20)
single_image_url=single_image_urls['image_url']
path = single_image_urls['path']
try:
request.urlretrieve(single_image_url, filename=path)
print(path,"下载完成")
except:
continue
except:
break
def main():
base_url = 'http://yys.163.com/media/picture.html'
image_quene = queue.Queue()
for x in range(3):
th1=UrlGet(base_url,image_quene)
th1.start()
for y in range(3):
th2 = ImageDownload(image_quene)
th2.start()
if __name__ == '__main__':
main()
不喜欢类,不喜欢多线程,不喜欢queue。
这段代码会循环重复运行,就是所有的数据下载完成后,会重新开始重头下载,没明白哪里出问题,有大神指导下么?
如果把下面代码:image_quene = queue.Queue()
修改成image_quene = queue.Queue(1000)
,那么就会在1000 之后开始重复下载。
可能的原因:
base_url = 'http://yys.163.com/media/picture.html'
base_url是一个固定的值,在执行线程的时候,不能像queue.get()方法那样,用过即弃,它是一直存在的。
for x in range(3):
th1=UrlGet(base_url,image_quene)
th1.start()`
所以设置了3个线程,每个线程都会得到base_url的值执行程序,导致所有下载都要重复3次,直接把线程数改成1,如下:
for x in range(1):
th1=UrlGet(base_url,image_quene)
th1.start()
下载不会重复。
single_image_urls = self.image_queue.get(timeout=20)
timeout=20 , 在下载完成后,应该可以防止程序继续运行。
最后
以上就是爱笑自行车为你收集整理的多线程 queue爬虫问题,循环下载的全部内容,希望文章能够帮你解决多线程 queue爬虫问题,循环下载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复