今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题。网址还是那个网址https://www.quanjing.com/category/1286521/1.html,

下面是代码,难点直接在后面注释了。

  1. # 多线程爬取,每个线程爬取一个页面
  2. import requests
  3. import threading
  4. import queue
  5. from bs4 import BeautifulSoup
  6. import re
  7. import time
  8.  
  9. string = "https://www.quanjing.com/category/1286521/"
  10. pipei = re.compile('<img.*?lowsrc="(.*?)"')
  11.  
  12. class spiders(threading.Thread):
  13. name = 1  # 累加变量,用来给每张图片命名
  14.  
  15. def __init__(self, queue, page):
  16. threading.Thread.__init__(self)
  17. self.queue = queue
  18. self.page = page
  19.  
  20. def run(self): # 定义线程开始函数
  21. while not self.queue.empty():
  22. url = self.queue.get_nowait()
  23. # print(url)
  24. self.request_url(url)
  25.  
  26. def request_url(self, url): # 爬取并存储每一页的图片
  27. html = requests.get(url=url).text
  28. soup = BeautifulSoup(html, 'lxml')
  29. li = str(soup.find_all(attrs={'class': "gallery_list"})) # 根据class标签属性找出所有的图片链接
  30. lianjies = re.findall(pipei, li) # 正则匹配出一页中每一个图片的链接
  31. for lianjie in lianjies:
  32. result = requests.get(url=lianjie).content # 获取图片的二进制数据
  33. # 以二进制的方式存储图片
  34. with open('E:\py project\quanjingwang\image{0}\{1}.jpg'.format(self.page, self.name), 'ab+') as f:
  35. f.write(result)
  36. print("第{0}张存储完成".format(self.name))
  37. self.name += 1 # 命名
  38.  
  39. # 创建多线程函数
  40.  
  41. def main():
  42. url_queue = queue.Queue()
  43. for i in range(1, 11):
  44. url = string + str(i) + ".html"
  45. url_queue.put(url)
  46. thread_list = [] # 线程列表
  47. thread_counter = 5 # 线程数量,根据线程数量在相同目录下创建image0-4五个文件夹,用于存储对应线程的爬取结果,image0对应线程1
  48. for i in range(thread_counter):
  49. t = spiders(url_queue, i)
  50. thread_list.append(t)
  51. for t in thread_list:
  52. t.start()
  53. # for t in thread_list:
  54. # print("线程id:%d" % t.ident) # 获取线程id
  55. # print("线程name:%s" % t.getName()) # 获取线程名
  56. for t in thread_list:
  57. t.join()
  58.  
  59. if __name__ == '__main__':
  60. start_time = time.time()
  61. main()
  62. print("五线程用时:%f" % (time.time() - start_time))

刚开始,我想把爬取的所有图片都放在一个文件夹了,但却由于命名的问题,总是被覆盖,每次都只有一页的图片,最后用类中的静态变量解决(name)。不过就在刚在突然想到完全可以换一种命名方式解决,比如每张图片都有一个自己的标题,用标题命名不但解决的这个问题,还更加直观、利用查找。(自己tcl。。。若文章有错误,欢迎大家随之指正。。。)

python多线程爬取图片实例的更多相关文章

  1. python多线程爬取图片二

    上一篇的多线程是使用类创建的,这一次使用函数创建多线程,还是同一个网站https://www.quanjing.com/category/1286521/1.html, 代码如下: # 多线程,自动创 ...

  2. python多线程爬取斗图啦数据

    python多线程爬取斗图啦网的表情数据 使用到的技术点 requests请求库 re 正则表达式 pyquery解析库,python实现的jquery threading 线程 queue 队列 ' ...

  3. [python爬虫] 爬取图片无法打开或已损坏的简单探讨

    本文主要针对python使用urlretrieve或urlopen下载百度.搜狗.googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨.同时 ...

  4. python多线程爬取世纪佳缘女生资料并简单数据分析

    一. 目标 ​ 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...

  5. Python多线程爬图&Scrapy框架爬图

    一.背景 对于日常Python爬虫由于效率问题,本次测试使用多线程和Scrapy框架来实现抓取斗图啦表情.由于IO操作不使用CPU,对于IO密集(磁盘IO/网络IO/人机交互IO)型适合用多线程,对于 ...

  6. python多线程知识-实用实例

    python多线程使用场景:IO操作,不适合CPU密集操作型任务   1.多个线程内存共享 2.线程同时修改同一份数据需要加锁,mutex互斥锁 3.递归锁:多把锁,锁中有锁 4.python多线程, ...

  7. Python 爬虫 爬取图片入门

    爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 用户看到的网页实质是由 HTML 代码构成的,爬 ...

  8. Python 多线程爬取站酷(zcool.com.cn)图片

    极速爬取下载站酷(https://www.zcool.com.cn/)设计师/用户上传的全部照片/插画等图片. 项目地址:https://github.com/lonsty/scraper 特点: 极 ...

  9. Spider-Python实战之通过Python爬虫爬取图片制作Win7跑车主题

    1. 前期准备 1.1 开发工具 Python 3.6 Pycharm Pro 2017.3.2 Text文本 1.2 Python库 requests re urllib 如果没有这些Python库 ...

随机推荐

  1. centos6.5安装apache2.x并更改默认80port

    因为现在nginx它已成为反向代理软件的主流.因此,linuxserver在系统.我们几乎总是安装nginx东方的,这使在同一时间使用apache带来了麻烦.因为apache它用于通过缺省80port ...

  2. uva 11346 - Probability(可能性)

    题目链接:uva 11346 - Probability 题目大意:给定x,y的范围.以及s,问说在该范围内选取一点,和x,y轴形成图形的面积大于s的概率. 解题思路:首先达到方程xy ≥ s.即y ...

  3. uboot初体验-----趣谈nand设备发起的浅显理解

    1 选择Uboot版本号 2 移植uboot至console正常work 3 制造uImage和使用uboot指南 4 写NFC驱动器 5 uboot从nand启动引导系统 1 选择Uboot版本号 ...

  4. STM32 模拟I2C (STM32F051)

    /** ****************************************************************************** * @file i2c simu. ...

  5. POJ 1986 Distance Queries LCA两点距离树

    标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...

  6. WCF的几个注意事项

    wcf托管服务注意的问题 加上项目分为客户端-WCF服务-逻辑层-数据库三层wcf一直出现异常,说没有初始化啊之类的,如果你的逻辑代码确定没有问题的话,思考是不是wcf的配置文件(app.config ...

  7. SICP 1.17-1.19

    1.16 -------------> 不考虑0的情况 <------------ (define (fe b n) (define (fet m c) (cond ((= m n) c) ...

  8. WPF 数据模板使用值转换器

    <Window x:Class="CollectionBinding.MainWindow"        xmlns="http://schemas.micros ...

  9. Selenium-等待

    分为3种 (1)就是通过线程强制等待 Thread.sleep(1000); (2)隐示等待.就是所有的命令都等待.分为3种 // 这个方法表示全局的等待.意思是针对所有的findElement方法都 ...

  10. delphi备份恢复剪切板(使用了GlobalLock API函数和CopyMemory)

    看了季世平老兄的C++代码后翻译过来的 unit clipbak; interface uses SysUtils, Classes, Clipbrd, Windows, Contnrs; type ...