python多线程爬取图片实例
今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题。网址还是那个网址https://www.quanjing.com/category/1286521/1.html,
下面是代码,难点直接在后面注释了。
- # 多线程爬取,每个线程爬取一个页面
- import requests
- import threading
- import queue
- from bs4 import BeautifulSoup
- import re
- import time
- string = "https://www.quanjing.com/category/1286521/"
- pipei = re.compile('<img.*?lowsrc="(.*?)"')
- class spiders(threading.Thread):
- name = 1 # 累加变量,用来给每张图片命名
- def __init__(self, queue, page):
- threading.Thread.__init__(self)
- self.queue = queue
- self.page = page
- def run(self): # 定义线程开始函数
- while not self.queue.empty():
- url = self.queue.get_nowait()
- # print(url)
- self.request_url(url)
- def request_url(self, url): # 爬取并存储每一页的图片
- html = requests.get(url=url).text
- soup = BeautifulSoup(html, 'lxml')
- li = str(soup.find_all(attrs={'class': "gallery_list"})) # 根据class标签属性找出所有的图片链接
- lianjies = re.findall(pipei, li) # 正则匹配出一页中每一个图片的链接
- for lianjie in lianjies:
- result = requests.get(url=lianjie).content # 获取图片的二进制数据
- # 以二进制的方式存储图片
- with open('E:\py project\quanjingwang\image{0}\{1}.jpg'.format(self.page, self.name), 'ab+') as f:
- f.write(result)
- print("第{0}张存储完成".format(self.name))
- self.name += 1 # 命名
- # 创建多线程函数
- def main():
- url_queue = queue.Queue()
- for i in range(1, 11):
- url = string + str(i) + ".html"
- url_queue.put(url)
- thread_list = [] # 线程列表
- thread_counter = 5 # 线程数量,根据线程数量在相同目录下创建image0-4五个文件夹,用于存储对应线程的爬取结果,image0对应线程1
- for i in range(thread_counter):
- t = spiders(url_queue, i)
- thread_list.append(t)
- for t in thread_list:
- t.start()
- # for t in thread_list:
- # print("线程id:%d" % t.ident) # 获取线程id
- # print("线程name:%s" % t.getName()) # 获取线程名
- for t in thread_list:
- t.join()
- if __name__ == '__main__':
- start_time = time.time()
- main()
- print("五线程用时:%f" % (time.time() - start_time))
刚开始,我想把爬取的所有图片都放在一个文件夹了,但却由于命名的问题,总是被覆盖,每次都只有一页的图片,最后用类中的静态变量解决(name)。不过就在刚在突然想到完全可以换一种命名方式解决,比如每张图片都有一个自己的标题,用标题命名不但解决的这个问题,还更加直观、利用查找。(自己tcl。。。若文章有错误,欢迎大家随之指正。。。)
python多线程爬取图片实例的更多相关文章
- python多线程爬取图片二
上一篇的多线程是使用类创建的,这一次使用函数创建多线程,还是同一个网站https://www.quanjing.com/category/1286521/1.html, 代码如下: # 多线程,自动创 ...
- python多线程爬取斗图啦数据
python多线程爬取斗图啦网的表情数据 使用到的技术点 requests请求库 re 正则表达式 pyquery解析库,python实现的jquery threading 线程 queue 队列 ' ...
- [python爬虫] 爬取图片无法打开或已损坏的简单探讨
本文主要针对python使用urlretrieve或urlopen下载百度.搜狗.googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨.同时 ...
- python多线程爬取世纪佳缘女生资料并简单数据分析
一. 目标 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...
- Python多线程爬图&Scrapy框架爬图
一.背景 对于日常Python爬虫由于效率问题,本次测试使用多线程和Scrapy框架来实现抓取斗图啦表情.由于IO操作不使用CPU,对于IO密集(磁盘IO/网络IO/人机交互IO)型适合用多线程,对于 ...
- python多线程知识-实用实例
python多线程使用场景:IO操作,不适合CPU密集操作型任务 1.多个线程内存共享 2.线程同时修改同一份数据需要加锁,mutex互斥锁 3.递归锁:多把锁,锁中有锁 4.python多线程, ...
- Python 爬虫 爬取图片入门
爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 用户看到的网页实质是由 HTML 代码构成的,爬 ...
- Python 多线程爬取站酷(zcool.com.cn)图片
极速爬取下载站酷(https://www.zcool.com.cn/)设计师/用户上传的全部照片/插画等图片. 项目地址:https://github.com/lonsty/scraper 特点: 极 ...
- Spider-Python实战之通过Python爬虫爬取图片制作Win7跑车主题
1. 前期准备 1.1 开发工具 Python 3.6 Pycharm Pro 2017.3.2 Text文本 1.2 Python库 requests re urllib 如果没有这些Python库 ...
随机推荐
- centos6.5安装apache2.x并更改默认80port
因为现在nginx它已成为反向代理软件的主流.因此,linuxserver在系统.我们几乎总是安装nginx东方的,这使在同一时间使用apache带来了麻烦.因为apache它用于通过缺省80port ...
- uva 11346 - Probability(可能性)
题目链接:uva 11346 - Probability 题目大意:给定x,y的范围.以及s,问说在该范围内选取一点,和x,y轴形成图形的面积大于s的概率. 解题思路:首先达到方程xy ≥ s.即y ...
- uboot初体验-----趣谈nand设备发起的浅显理解
1 选择Uboot版本号 2 移植uboot至console正常work 3 制造uImage和使用uboot指南 4 写NFC驱动器 5 uboot从nand启动引导系统 1 选择Uboot版本号 ...
- STM32 模拟I2C (STM32F051)
/** ****************************************************************************** * @file i2c simu. ...
- POJ 1986 Distance Queries LCA两点距离树
标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...
- WCF的几个注意事项
wcf托管服务注意的问题 加上项目分为客户端-WCF服务-逻辑层-数据库三层wcf一直出现异常,说没有初始化啊之类的,如果你的逻辑代码确定没有问题的话,思考是不是wcf的配置文件(app.config ...
- SICP 1.17-1.19
1.16 -------------> 不考虑0的情况 <------------ (define (fe b n) (define (fet m c) (cond ((= m n) c) ...
- WPF 数据模板使用值转换器
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- Selenium-等待
分为3种 (1)就是通过线程强制等待 Thread.sleep(1000); (2)隐示等待.就是所有的命令都等待.分为3种 // 这个方法表示全局的等待.意思是针对所有的findElement方法都 ...
- delphi备份恢复剪切板(使用了GlobalLock API函数和CopyMemory)
看了季世平老兄的C++代码后翻译过来的 unit clipbak; interface uses SysUtils, Classes, Clipbrd, Windows, Contnrs; type ...