我是靠谱客的博主 爱笑自行车,最近开发中收集的这篇文章主要介绍多线程 queue爬虫问题,循环下载,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

爬虫笔记:

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爬虫问题,循环下载所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部