鱼C论坛

 找回密码
 立即注册
查看: 2808|回复: 6

jupyter和python代码运行多线程爬虫问题

[复制链接]
发表于 2019-10-5 08:54:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在学习python多线程爬取斗图啦热门图片的问题:
        在jupyter和python shell执行queue多线程爬取图片,第一次执行命令没问题,第二次再执行就没有反应了,是因为锁的问题么?
        而且爬取的图片少了很多       下面是代码:
      
  1. <blockquote>import requests
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-5 08:54:57 | 显示全部楼层
代码呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-5 08:56:38 | 显示全部楼层
  1. import requests
  2. from lxml import etree
  3. from urllib import request
  4. import os
  5. import re
  6. from queue import Queue
  7. import threading

  8. class Producer(threading.Thread):
  9.     headers = {
  10.         'UserAgent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
  11.     }
  12.     def __init__(self, page_queue, img_queue, *args, **kwargs):
  13.         super(Producer, self).__init__(*args, **kwargs)
  14.         self.page_queue = page_queue
  15.         self.img_queue = img_queue
  16.         
  17.     def run(self):
  18.         while True:
  19.             if self.page_queue.empty():
  20.                 break
  21.             url = self.page_queue.get()
  22.             self.parse_page(url)
  23.             
  24.     def parse_page(self, url):
  25.         response = requests.get(url, headers=self.headers)
  26.         text = response.text
  27.         html = etree.HTML(text)
  28.         imgs = html.xpath('//div[@class="page-content text-center"]//img[@class!="gif"]')
  29.         for img in imgs:
  30.             img_url = img.get('data-original')
  31.             alt = img.get('alt')
  32.             alt = re.sub('[\??,。!\.\/\*]','',alt)
  33.             suffix = os.path.splitext(img_url)[1]
  34.             filename = alt + suffix
  35.             self.img_queue.put((img_url,filename))
  36.             
  37. class Consumer(threading.Thread):
  38.     def __init__(self, page_queue, img_queue, *args, **kwargs):
  39.         super(Consumer, self).__init__(*args, **kwargs)
  40.         self.page_queue = page_queue
  41.         self.img_queue = img_queue
  42.    
  43.     def run(self):
  44.         while True:
  45.             if self.img_queue.empty() and self.page_queue.empty():
  46.                 break
  47.             img_url,filename = self.img_queue.get()
  48.             request.urlretrieve(img_url, 'D:/爬取内容/图片/斗图啦/'+filename)
  49.             print(filename + '  下载完成!')
  50.             
  51. def main():
  52.     page_queue = Queue(100)
  53.     img_queue = Queue(1000)
  54.     for x in range(1, 101):
  55.         url = 'http://www.doutula.com/photo/list/?page=%d'%x
  56.         page_queue.put(url)
  57.         
  58.     for x in range(5):
  59.         t = Producer(page_queue, img_queue)
  60.         t.start()
  61.         
  62.     for x in range(5):
  63.         t = Consumer(page_queue, img_queue)
  64.         t.start()

  65. if __name__ == '__main__':
  66.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-5 08:57:13 | 显示全部楼层

在下面,第一次放的时候好像没弄好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-5 09:21:48 | 显示全部楼层
有可能是没上锁的问题,一起争抢全局queue
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-5 09:35:04 | 显示全部楼层
塔利班 发表于 2019-10-5 09:21
有可能是没上锁的问题,一起争抢全局queue

感觉很可能,但是我看视频上说用queue是安全的不会发生争抢行为,他也是运行了不止一遍,每一遍都可以执行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-5 09:55:59 | 显示全部楼层
tq1258 发表于 2019-10-5 09:35
感觉很可能,但是我看视频上说用queue是安全的不会发生争抢行为,他也是运行了不止一遍,每一遍都可以执 ...

如果是安全的话可能就是cunsumer的判断if快,判断你的imgqueue还是空的,所以直接停了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-19 18:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表