【Python实战】Python多线程批量采集图片

前言

本文来介绍如何多线程采集图片,多线程效率更快,但是,我们单一IP请求过于频繁,可能会被反爬,被封IP,所以,我们就要用到IP代理池,这里,我给大家推荐一个,可以免费使用7天。足够我们使用了。

环境使用

  • python 3.9
  • pycharm

模块使用

  • requests

模块介绍

  • requests

        requests是一个很实用的Python HTTP客户端库,爬虫和测试服务器响应数据时经常会用到,requests是Python语言的第三方的库,专门用于发送HTTP请求,使用起来比urllib简洁很多。

  • parsel

        parsel是一个python的第三方库,相当于css选择器+xpath+re。

parsel由scrapy团队开发,是将scrapy中的parsel独立抽取出来的,可以轻松解析html,xml内容,获取需要的数据。

相比于BeautifulSoup,xpath,parsel效率更高,使用更简单。

  • re

        re模块是python独有的匹配字符串的模块,该模块中提供的很多功能是基于正则表达式实现的,而正则表达式是对字符串进行模糊匹配,提取自己需要的字符串部分,他对所有的语言都通用。

  • os

        os 就是 “operating system” 的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用 os 模块,一方面可以方便地与操作系统进行交互,另一方面也可以极大增强代码的可移植性。

  • csv

        它是一种文件格式,一般也被叫做逗号分隔值文件,可以使用 Excel 软件或者文本文档打开 。其中数据字段用半角逗号间隔(也可以使用其它字符),使用 Excel 打开时,逗号会被转换为分隔符。csv 文件是以纯文本形式存储了表格数据,并且在兼容各个操作系统。

模块安装问题:

  • 如果安装python第三方模块:

win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

在pycharm中点击Terminal(终端) 输入安装命令

  • 安装失败原因:

  • 失败一: pip 不是内部命令

                解决方法: 设置环境变量

  • 失败二: 出现大量报红 (read time out)

                解决方法: 因为是网络链接超时, 需要切换镜像源

   

    清华:https://pypi.tuna.tsinghua.edu.cn/simple阿里云:https://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/华中理工大学:https://pypi.hustunique.com/山东理工大学:https://pypi.sdutlinux.org/豆瓣:https://pypi.douban.com/simple/例如:pip3 install -i https://pypi.doubanio.com/simple/ 模块名

  • 失败三: cmd里面显示已经安装过了, 或者安装成功了, 但是在pycharm里面还是无法导入

                解决方法: 可能安装了多个python版本 (anaconda 或者 python 安装一个即可) 卸载一个就好,或者你pycharm里面python解释器没有设置好。

代码实现

什么是代理ip池?

        通俗地比喻一下,它就是一个池子,里面装了很多代理ip。它有如下的行为特征:

  1. 池子里的ip是有生命周期的,它们将被定期验证,其中失效的将被从池子里面剔除。
  2. 池子里的ip是有补充渠道的,会有新的代理ip不断被加入池子中。
  3. 池子中的代理ip是可以被随机取出的。

        这样,代理池中始终有多个不断更换的、有效的代理ip,且我们可以随机从池子中取出代理ip,然后让爬虫程序使用代理ip访问目标网站,就可以避免爬虫被ban的情况。

如何使用呢?

import requestsf = open('IP.txt',"r")file = f.readlineitem = []for proxies in file:proxies =eval(proxies.replace('\',''))item.append(proxies)
proxies = random.choice(item)
response = requests.get(url=url,headers=headers,proxies=proxies)
print(response)

我们这里先是把IP保存到了一个文件里面,我们在请求的时候加入proxies参数即可,这里的url就填我们要请求的网址。

批量采集

接下来,我们就进入到我们的正式学习中,我们今天请求的是某大学网站,由于涉及到隐私,网址不发了,这里教一个思路,其他网站也是一样的。

单线程

我们先试试单线程采集80张图片需要多少秒?

import re
import requests
import datetime
urls = []startime = datetime.datetime.now()def download(url):name = re.findall('(\d+).jpg',url)[0]img_content = requests.get(url=url).contentwith open('img\\' +name+'.jpeg', mode='wb') as f:f.write(img_content)for i in range(1,80):url = f"http://**********/student/{i}.jpg"urls.append(url)
for url in urls:download(url)endtime = datetime.datetime.now()
print((endtime-startime).seconds)

我们这里就是把我们所有要下载的地址遍历到urls里面去,然后执行下载图片函数,我这里用时28秒,我们看看多线程多快。

多线程

我们这里加上多线程,多线程的数量取决于你的电脑性能,话不多说,直接上代码。

from concurrent.futures import ThreadPoolExecutor
import re
import requests
import datetime
urls = []startime = datetime.datetime.now()def download(url):name = re.findall('(\d+).jpg',url)[0]img_content = requests.get(url=url).contentwith open('img\\' +name+'.jpeg', mode='wb') as f:f.write(img_content)for i in range(1,80):url = f"http://**********/student/{i}.jpg"urls.append(url)
with ThreadPoolExecutor(max_workers=10) as executor:for url in urls:executor.submit(download,url)endtime = datetime.datetime.now()
print((endtime-startime).seconds)

我们这里开了10个线程,下载完80张图片,只要3s,提升了很快,当我们的图片很多的时候,我们多线程的优势越来越明显。

总结

有的网站回限制IP,所以,我们就要用到IP代理池,本文就到这里了。

6adf31c8c5dd4e6a83314f4805b30bc1.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5.10 动态优先级模式

动态优先级模式与静态优先级模式类似,但动态优先级模式会随着任务运行时条件的改变自动调整任务优先级。调整任务优先级的策略有很多种,最常见的是“最早截止期优先”(Earliest Deadline First),即优先级最高的任务是离截止时间最近的任务。动…

11个技巧让你的Python性能起飞

更多资料获取 📚 个人网站:ipengtao.com Python 是一门非常强大且易于学习的编程语言,但在处理大规模数据或复杂任务时,可能会遇到性能瓶颈。为了让你的 Python 代码运行更快,本文将介绍一些提高 Python 性能的技巧和…

uniapp如何添加多个表单数组?

目录 一、实现思路 二、实现步骤 ①view部分展示 ②JavaScript 内容 ③css中样式展示 三、效果展示 四、小结 注意事项 总结模板: 一、实现思路 1.在 data 中定义一个数组,用于存储表单项的数据 2.在模板中使用 v-for 指令渲染表单项 3.在 methods 中…

如何快速搭建个人博客

说明:本文介绍如何使用Halo框架快速搭建个人博客,我用的是阿里云的云服务器,操作系统是CentOS 7.0。 安装Docker&DockerCompose (1)Docker安装 Docker的安装参考,Docker安装&卸载; …

AI算力专题:算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究

今天分享的是AI算力系列深度研究报告:《AI算力专题:算力系列之四-各省算力规划建设梳理-绿色低碳高质量发展-部署算力建设AI产业研究》。 (报告出品方:中泰证券) 报告共计:40页 数据中心能耗情况 随着越…

【Docker】linux、nginx、容器镜像三者基本概念

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

PCB设计10条重要布线原则(学习笔记)

文章目录 一、连线精简二、避免走直角线三、差分走线四、蛇形走线五、圆滑走线六、数字与模拟分开七、3W原则八、20H原则九、铜箔承载电流十、过孔承载电流 一、连线精简 尽量用最短的路径去布线 1、可以省资源 2、信号差损少 3、线能不拐弯就不拐弯 4、能不换层就不换层 二…

SQL中实现行列转换

目录 方法一:sum case when 方法二:sum if 方法三:pivot 现在有一张表class_gender,内容如下: classgender一年级女一年级女一年级男一年级男二年级女二年级女二年级男 现在我们要根据上表,统计得到下…

初识attention

近年来,attention机制在机器视觉和机器翻译领域受到了广泛的关注,有很多文章都是融合attention来提高性能。attention受启发于人类的视觉系统,最先应用于序列化的机器翻译(NLP)后又推广到计算机视觉中,本篇文章就来简单学习一下at…

JS基础 - 遍历对象方法(6种)

初始值: var obj {a: 1,b: 2,c: 3,d: 4,e: 5,}; 第一种:for in for (let key in obj) {console.log(key ":" obj[key]);} 第二种:Object.keys 获取key Object.keys(obj).forEach((key) > {console.log(key ":" …

AI绘画:PhotoMaker Win11本地安装记录!

昨天介绍一个叫PhotoMaker的AI绘画开源项目。挺不错的! 通过这个项目可以快速制作特定人脸的AI绘画作品,相比传统的技术效果会好很多,效率也高很多。 今天趁热打铁,本地电脑装装看,并且记录,分享一下&#…

js padEnd方法介绍笔记

padEnd() 是 JavaScript 字符串的方法之一,它用于在当前字符串的末尾添加指定数量的字符,直到字符串达到指定的长度。 padEnd() 方法接受两个参数: 目标长度和要添加的填充字符。 如果当前字符串的长度已经等于或超过目标长度,则不…

程序员怎么写简历_写简历软件

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历…

vue预览pdf文件的几种方法

文章目录 vue预览pdf集中方法方法一:方法二:展示效果:需要包依赖:代码: 方法三:展示效果:需要包依赖:代码:自己调参数,选择符合自己的 vue预览pdf集中方法 我…

第 9 章:理解C++内存模型

本章是继[第8章]讨论的延续,我们在那里讨论了一些多进程和多线程技术;本章将增强它们的使用。我们将引导你了解各种技术,同时聚焦于本章的主要内容——C内存模型。但为了讨论这一点,你首先将简要检视通过智能指针和可选对象实现的…

ZK鉴权设计以及相关探讨

文章目录 1. zk的鉴权设计2. zk鉴权应用范围3. zk鉴权的常用方法4. 推荐配置5. 参考文档 鉴权,分别由鉴和权组成 鉴: 表示身份认证,认证相关用户是否存在以及相关的用户名和密码是否一致权: 完成身份的鉴后,还需要判断…

DolphinScheduler + Amazon EMR Serverless 的集成实践

01 背景 Apache DolphinScheduler 是一个分布式的可视化 DAG 工作流任务调度开源系统,具有简单易用、高可靠、高扩展性、⽀持丰富的使用场景、提供多租户模式等特性。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方…

【C++】std::variant

上一篇文章讲到了 union,union union存在很多问题,因此C17设计了一个新的variant替代原来的union。 union的问题 无法知道当前使用的类型是什么。而且union无法自动调用底层数据成员的析构函数。 这些使得一般只对一些“基本类型”使用union&#xf…

Redis 安装 redistimeseries.so(时间序列数据类型)教程

配置步骤 1.下载 redistimeseries.so 文件 2.在 redis.conf 中增加配置 loadmodule /home/chenjian/redis-lib/RedisTimeSeries/redistimeseries.so DUPLICATE_POLICY LAST3.重启 Redis 服务 4.连接客户端,测试 RedisTimeSeries 相关命令,下图表明 R…

Java玩转《啊哈算法》排序之快速排序

心无挂碍,无挂碍故,无有恐怖,远离颠倒梦想,究竟涅槃。 地图 引子代码地址快速排序核心代码优劣完整代码演示 课后习题 引子 搭嘎好!本人最近看的《啊哈算法》这本书写的确实不错,生动形象,在保…