鱼C论坛

 找回密码
 立即注册
查看: 1667|回复: 18

[已解决]线程池如何使用

[复制链接]
发表于 2020-7-23 06:49:34 | 显示全部楼层 |阅读模式

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

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

x
最近在着手写一只爬虫 但是速度慢的感人 所以我决定
用多线程写 写到一半发现这样写我的for循环就没用了
所以 请在座的各位大佬指点一下线程池的食用方法
写完后我会把结果放到论坛的
最佳答案
2020-7-23 09:15:29
本帖最后由 nahongyan1997 于 2020-7-23 09:20 编辑

@风尘岁月 我修改了你的代码以实现你提出的问题的解决:
  1. #导包
  2. import requests
  3. # 这里要这样导入最好
  4. from time import sleep
  5. import os
  6. import threading
  7. import parsel


  8. if not os.path.exists('image'):
  9.     os.mkdir('image')


  10. #base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'

  11. headers = {
  12.     'User-Agent':
  13.         'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
  14. }


  15. def get(url,headers):
  16.     '''请求数据'''
  17.     response = requests.get(url,headers)
  18.     html_data = response.text
  19.     return html_data


  20. def parsel_data(html_data):
  21.     '''筛选数据'''
  22.     selector = parsel.Selector(html_data)
  23.     result_list = selector.xpath('//span[@class="img_block_big"]')

  24.     for result in result_list:
  25.         image_url = result.xpath('./a/picture/source/img/@src').extract_first()
  26.         image_id = result.xpath('./a/picture/source/img/@id').extract_first()

  27.         img_url = 'https:' + image_url #手动拼url

  28.         all_title = img_url

  29.         img_data = requests.get(url = all_title,headers = headers).content


  30.         yield all_title,image_id,img_data


  31. def save(all_title,image_id,img_data):
  32.     '''保存数据'''
  33.     try:
  34.         with open('image\\' + image_id, mode='wb') as f:
  35.             print('保存成功:', image_id)
  36.             f.write(img_data)

  37.     except:
  38.         pass
  39.         print('保存失败:', image_id,'(•́へ•́╬)')

  40. # 这段代码不能用
  41. # def sleep(time):
  42. #     '''休眠'''
  43. #     time.sleep(time)

  44. # 使用多线程需要把你重复执行的部分单独写成一个函数
  45. def start_save(base_url):
  46.     lock.acquire()
  47.     html_data = get(url=base_url,headers=headers)
  48.     for image_data in parsel_data(html_data):
  49.         all_title = image_data[0] #url https://xxxxxxxxxx...
  50.         img_id = image_data[1] # ID
  51.         img_data = image_data[2] #数据
  52.         save(all_title=all_title, image_id = img_id, img_data = img_data)
  53.     lock.release()
  54. def main(page):
  55.     for page in range(0,page + 1):
  56.         print('###############正在下载第{}页数据###############'.format(page))
  57.         if page > 0:
  58.             print('休息一下')
  59.             sleep(10)
  60.         base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'.format(page)
  61.         print(base_url)
  62.         # 这里是多线程的开启方式,修改后速度有明显提升
  63.         my_thread = threading.Thread(target=start_save,args=(base_url,))
  64.         my_thread.setDaemon(True)
  65.         my_thread.start()


  66. if __name__ == '__main__':
  67.     lock = threading.RLock()
  68.    
  69.     main(6300)



复制代码

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

使用道具 举报

发表于 2020-7-23 06:54:52 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 06:58:45 | 显示全部楼层
zltzlt 发表于 2020-7-23 06:54
可以参考:

https://blog.csdn.net/m0_38011218/article/details/81938261

我就是因为这样写才导致for循环不起作用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 06:59:55 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-23 07:06:15 | 显示全部楼层
把你的代码发上来看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 07:15:37 | 显示全部楼层
zltzlt 发表于 2020-7-23 07:06
把你的代码发上来看看
  1. #导包
  2. import requests
  3. import time
  4. import os
  5. import threading
  6. import parsel


  7. if not os.path.exists('image'):
  8.     os.mkdir('image')


  9. #base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'

  10. headers = {
  11.     'User-Agent':
  12.         'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
  13. }


  14. def get(url,headers):
  15.     '''请求数据'''
  16.     response = requests.get(url,headers)
  17.     html_data = response.text
  18.     return html_data


  19. def parsel_data(html_data):
  20.     '''筛选数据'''
  21.     selector = parsel.Selector(html_data)
  22.     result_list = selector.xpath('//span[@class="img_block_big"]')

  23.     for result in result_list:
  24.         image_url = result.xpath('./a/picture/source/img/@src').extract_first()
  25.         image_id = result.xpath('./a/picture/source/img/@id').extract_first()

  26.         img_url = 'https:' + image_url #手动拼url

  27.         all_title = img_url

  28.         img_data = requests.get(url = all_title,headers = headers).content


  29.         yield all_title,image_id,img_data


  30. def save(all_title,image_id,img_data):
  31.     '''保存数据'''
  32.     try:
  33.         with open('image\\' + image_id, mode='wb') as f:
  34.             print('保存成功:', image_id)
  35.             f.write(img_data)

  36.     except:
  37.         pass
  38.         print('保存失败:', image_id,'(•́へ•́╬)')


  39. def sleep(time):
  40.     '''休眠'''
  41.     time.sleep(time)


  42. def main(page):
  43.     for page in range(0,page + 1):
  44.         print('###############正在下载第{}页数据###############'.format(page))
  45.         if page > 0:
  46.             print('休息一下')
  47.             sleep(10)
  48.         base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'.format(page)
  49.         html_data = get(url=base_url,headers=headers)
  50.         for image_data in parsel_data(html_data):
  51.             all_title = image_data[0] #url https://xxxxxxxxxx...
  52.             img_id = image_data[1] # ID
  53.             img_data = image_data[2] #数据
  54.             save(all_title=all_title, image_id = img_id, img_data = img_data)



  55. if __name__ == '__main__':
  56.     main(6300)





复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 07:24:15 | 显示全部楼层
还没审过呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-23 09:15:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 nahongyan1997 于 2020-7-23 09:20 编辑

@风尘岁月 我修改了你的代码以实现你提出的问题的解决:
  1. #导包
  2. import requests
  3. # 这里要这样导入最好
  4. from time import sleep
  5. import os
  6. import threading
  7. import parsel


  8. if not os.path.exists('image'):
  9.     os.mkdir('image')


  10. #base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'

  11. headers = {
  12.     'User-Agent':
  13.         'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
  14. }


  15. def get(url,headers):
  16.     '''请求数据'''
  17.     response = requests.get(url,headers)
  18.     html_data = response.text
  19.     return html_data


  20. def parsel_data(html_data):
  21.     '''筛选数据'''
  22.     selector = parsel.Selector(html_data)
  23.     result_list = selector.xpath('//span[@class="img_block_big"]')

  24.     for result in result_list:
  25.         image_url = result.xpath('./a/picture/source/img/@src').extract_first()
  26.         image_id = result.xpath('./a/picture/source/img/@id').extract_first()

  27.         img_url = 'https:' + image_url #手动拼url

  28.         all_title = img_url

  29.         img_data = requests.get(url = all_title,headers = headers).content


  30.         yield all_title,image_id,img_data


  31. def save(all_title,image_id,img_data):
  32.     '''保存数据'''
  33.     try:
  34.         with open('image\\' + image_id, mode='wb') as f:
  35.             print('保存成功:', image_id)
  36.             f.write(img_data)

  37.     except:
  38.         pass
  39.         print('保存失败:', image_id,'(•́へ•́╬)')

  40. # 这段代码不能用
  41. # def sleep(time):
  42. #     '''休眠'''
  43. #     time.sleep(time)

  44. # 使用多线程需要把你重复执行的部分单独写成一个函数
  45. def start_save(base_url):
  46.     lock.acquire()
  47.     html_data = get(url=base_url,headers=headers)
  48.     for image_data in parsel_data(html_data):
  49.         all_title = image_data[0] #url https://xxxxxxxxxx...
  50.         img_id = image_data[1] # ID
  51.         img_data = image_data[2] #数据
  52.         save(all_title=all_title, image_id = img_id, img_data = img_data)
  53.     lock.release()
  54. def main(page):
  55.     for page in range(0,page + 1):
  56.         print('###############正在下载第{}页数据###############'.format(page))
  57.         if page > 0:
  58.             print('休息一下')
  59.             sleep(10)
  60.         base_url = 'https://anime-pictures.net/pictures/view_posts/0?lang=en'.format(page)
  61.         print(base_url)
  62.         # 这里是多线程的开启方式,修改后速度有明显提升
  63.         my_thread = threading.Thread(target=start_save,args=(base_url,))
  64.         my_thread.setDaemon(True)
  65.         my_thread.start()


  66. if __name__ == '__main__':
  67.     lock = threading.RLock()
  68.    
  69.     main(6300)



复制代码

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

使用道具 举报

 楼主| 发表于 2020-7-23 09:27:50 | 显示全部楼层
nahongyan1997 发表于 2020-7-23 09:15
@风尘岁月 我修改了你的代码以实现你提出的问题的解决:

感谢大佬的帮助 速度已经飞起了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-23 10:00:18 | 显示全部楼层
风尘岁月 发表于 2020-7-23 09:27
感谢大佬的帮助 速度已经飞起了

一秒八张不是开玩笑的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 10:04:49 | 显示全部楼层
而且图片很适合宅男
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 10:11:15 | 显示全部楼层
nahongyan1997 发表于 2020-7-23 09:15
@风尘岁月 我修改了你的代码以实现你提出的问题的解决:

唯一的缺点就是:保存快到连文件管理都没了(可能有一些图片未保存进去)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-23 10:27:24 | 显示全部楼层
for循环里加点延迟
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 14:29:15 | 显示全部楼层
nahongyan1997 发表于 2020-7-23 10:00
一秒八张不是开玩笑的

加了还是没有用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-23 14:32:43 | 显示全部楼层

难道你没发现你下载的图片都没有后缀吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 14:33:15 | 显示全部楼层
这个我早就发现了 已经改好了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 14:34:13 | 显示全部楼层
nahongyan1997 发表于 2020-7-23 14:32
难道你没发现你下载的图片都没有后缀吗

这个我早就发现了 在上传后我才发现的 现在的问题是有写保存成功 但是却没有(有几张)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 14:35:38 | 显示全部楼层
nahongyan1997 发表于 2020-7-23 14:32
难道你没发现你下载的图片都没有后缀吗

我Q:732434975  在论坛讨论这个我没法给你看实例
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-23 14:47:17 | 显示全部楼层
nahongyan1997 发表于 2020-7-23 14:32
难道你没发现你下载的图片都没有后缀吗

录个视频给你看 大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 04:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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