python多线程爬取图片二
上一篇的多线程是使用类创建的,这一次使用函数创建多线程,还是同一个网站https://www.quanjing.com/category/1286521/1.html,
代码如下:
# 多线程,自动创建文件夹,每个页面单独存储一个文件夹 import requests
import threading
import re
import time
import queue
import os
from bs4 import BeautifulSoup string = 'https://www.quanjing.com/category/1286521/'
url_queue = queue.Queue()
pipei = re.compile('lowsrc="(.*?)" m=') # 定义正则表达式,匹配出每一张图片的链接 def get_url(page): # 根据传入的页面数,创建1-page每个页面的url
for i in range(1, page+1):
url = string + str(i) + '.html' # 拼接url
url_queue.put(url) # 把每个url放入队列中
# print(url_queue.queue) def spider(url_queue): # 爬取函数
url = url_queue.get() # 从队列中取出最前面的url
floder_count = url[-7:-5] # 判断当前爬取的为第几页,用于后面的创建文件夹,如果页数为两位数,则会截取当前页数,如果为一位数字,则会截取当前页数和前面的‘/’符号
if floder_count[0] == '/':
floder_name = floder_count[1]
else:
floder_name = floder_count
os.mkdir('第{0}页'.format(floder_name)) # mkdir创建文件夹
html = requests.get(url=url).text
soup = BeautifulSoup(html, 'lxml') # 对源码进行解析
ul = soup.find_all(attrs={"class": "gallery_list"}) # 提取出图片链接的部分
# print(ul)
lianjies = re.findall(pipei, str(ul)) # 匹配出每一张图片的链接,正则匹配必须是字符串类型
i = 1
for lianjie in lianjies:
# print(lianjie)
result = requests.get(url=lianjie).content # 二进制方式请求每张图片,并存储。
with open('第{0}页\{1}.jpg'.format(floder_name, i), 'ab') as f:
f.write(result)
print('第{0}页第{1}张存储完成'.format(floder_name, i))
i += 1 if not url_queue.empty(): # 如果队列未空,则该线程继续工作,从队列中取出url
spider(url_queue) def main(): # main函数,用于线程的创建,线程的启动
queue_list = [] # 线程列表
queue_count = 3 # 线程数量
for i in range(queue_count):
t = threading.Thread(target=spider, args=(url_queue, )) # 创建线程,第一个参数为线程要调用的函数,第二个参数为函数的参数
queue_list.append(t) # 把线程加入队列
for t in queue_list: # 线程开始
t.start()
for t in queue_list: # 等待所有线程结束
t.join() if __name__ == '__main__':
page = int(input("请输入需要爬取的页数:"))
get_url(page)
start_time = time.time()
main()
print("test3用时:%f" % (time.time() - start_time)) # 计算爬取用时
在写代码时,遇到了两点困难:一是队列未空时,怎么让线程继续工作。刚开始是在if判断后调用main函数,但这样做等于又重新定义了新的线程,并不是之前的线程在继续工作,且有时候会存在爬取不完的情况,后来尝试调用spider函数,爬取成功
第二个困难是文件夹的创建,刚开始没有对截图的两个字符进行判断,导致创建失败,百度一下后发现可以用makedirs解决,试了后发现这样创建的是多级目录,也不行,(可能是‘/’字符的缘故),后来加了一个判断,才解决这一问题。
写完这两个多线程爬虫,才算是了解了线程的工作机制的程序。(ps:若有错误的地方,欢迎大佬随时指正。。xixix)
python多线程爬取图片二的更多相关文章
- python多线程爬取图片实例
今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题.网址还是那个网址https://www.quanjing.com/category/1286521/1. ...
- python多线程爬取斗图啦数据
python多线程爬取斗图啦网的表情数据 使用到的技术点 requests请求库 re 正则表达式 pyquery解析库,python实现的jquery threading 线程 queue 队列 ' ...
- [python爬虫] 爬取图片无法打开或已损坏的简单探讨
本文主要针对python使用urlretrieve或urlopen下载百度.搜狗.googto(谷歌镜像)等图片时,出现"无法打开图片或已损坏"的问题,作者对它进行简单的探讨.同时 ...
- Python多线程爬图&Scrapy框架爬图
一.背景 对于日常Python爬虫由于效率问题,本次测试使用多线程和Scrapy框架来实现抓取斗图啦表情.由于IO操作不使用CPU,对于IO密集(磁盘IO/网络IO/人机交互IO)型适合用多线程,对于 ...
- python多线程爬取世纪佳缘女生资料并简单数据分析
一. 目标 作为一只万年单身狗,一直很好奇女生找对象的时候都在想啥呢,这事也不好意思直接问身边的女生,不然别人还以为你要跟她表白啥的,况且工科出身的自己本来接触的女生就少,即使是挨个问遍,样本量也 ...
- Python 爬虫 爬取图片入门
爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 用户看到的网页实质是由 HTML 代码构成的,爬 ...
- Python 多线程爬取站酷(zcool.com.cn)图片
极速爬取下载站酷(https://www.zcool.com.cn/)设计师/用户上传的全部照片/插画等图片. 项目地址:https://github.com/lonsty/scraper 特点: 极 ...
- python多线程爬取-今日头条的街拍数据(附源码加思路注释)
这里用的是json+re+requests+beautifulsoup+多线程 1 import json import re from multiprocessing.pool import Poo ...
- Python 多线程 使用线程 (二)
Python中实现多线程需要使用到 threading 库,其中每一个 Thread类 的实例控制一个线程. Thread类 #类签名 def __init__(self, group=None, t ...
随机推荐
- Qt编程中QDiaog的ESC键(按下Esc键会默认调用reject()方法)
最近使用QDialog时,按了下Esc键,导致QDialog被关闭,而后续的数据处理出现了问题.原来在QDialog中按下Esc键会默认调用reject()方法而不是closeEvent(QClose ...
- 【iOS发展-89】UIGestureRecognizer完整的旋转手势识别、缩放和拖拽等效果
(1)效果 (2)代码 http://download.csdn.net/detail/wsb200514/8261001 (3)总结 --先依据所需创建不同类型的手势识别.比方: UITapGest ...
- NSURLSession 网络库 - 原生系统送给我们的礼物
大家在进行iOS开发的时候一定会用到网络操作.但由于早期原生的 NSURLConnection 操作起来有很多不便,使得大家更愿意使用第三方库的解决方案,比如鼎鼎大名的 AFNetworking.正是 ...
- WPF不明内存泄露已解决,白头发也没了
原文:WPF不明内存泄露已解决,白头发也没了 在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,在上一篇中求助了一个内存泄露问题[WPF不明内存泄露原因,头发都白了几根 ...
- 线性渐变、辐射渐变、角度渐变-QLinearGradient,QRadialGradient,QConicalGradient
渐变,是指逐渐的,有规律性的变化,是一种规律性很强的现象.Qt提供了一个与渐变相关的QGradient类,目前支持三种渐变画刷,分别是线性渐变(QLinearGradient).辐射渐变(QRadia ...
- Android指纹识别
原文:Android指纹识别 上一篇讲了通过FingerprintManager验证手机是否支持指纹识别,以及是否录入了指纹,这里进行指纹的验证. //获取FingerprintManager实例 F ...
- C# 开机自动启动
if (ConfigurationManager.AppSettings["IsBoot"].ToString().Trim().ToUpper() == "TRUE&q ...
- LIBCMTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
这个问题是没找到程序入口 在网上查这个问题,一般都是说两条: (若是win32程序) 一是在项目属性\CC++\预处理器\预处理器定义\里添加 _WINDOWS 一是在项目属性\链接\系统 里选择 窗 ...
- PHPstudy + phpstrom +xdebug 断点调试(windows) - CSDN博客
原文:PHPstudy + phpstrom +xdebug 断点调试(windows) - CSDN博客 php.ini 配置 需要添加如下内容 [XDebug]xdebug.profiler_ou ...
- 青云QingCloud黄允松:最高效的研发管理就是没有管理
摘要: 对于底层技术创新而言,没有管理是最好的管理,小规模作战,快速试错,迅速转变方向,迭代周期一定要短. 钛媒体注:钛媒体.商业价值联合主办的第五届“MIIC移动互联网创新大会”如期举行.2015 ...