【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 requests
 
f = open('IP.txt',"r")
 
file = f.readline
 
item = []
 
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).content
    with 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).content
    with 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL原理(五)事务

一、介绍: 1、介绍: 在计算机术语中,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务是恢复和并发控制的基本单位。 2、事务的4大特性 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性…

一键部署幻兽帕鲁服务器免费一年方案

一、背景介绍 简单讲一下历程,幻兽帕鲁从在1月19日上线,24小时内在线人数峰值便突破200万,作为2024年第一款现象级游戏,《幻兽帕鲁》上线后,由于人数太多,频现服务器过载导致游戏卡顿掉线的情况。为了能够…

概率论中的全概率公式、贝叶斯公式解析

全概率公式 定义 全概率公式是用来计算一个事件的概率,这个事件可以通过几个互斥事件的并集来表示。这几个互斥事件称为“完备事件系”。实质是由原因推结果。 公式 用途 全概率公式通常用于计算一个事件的总概率,特别是当这个事件与几个不同的因素相关…

【Python】gui 程序的启动脚本

说明 在本机运行,打包就真的没啥必要了,bat 运行 写个 bat 创建个快捷方式 就很是 OK gui 程序不需要 cmd ,用 pythonw.exe 这玩意没啥可说的,直接上代码 xyj.bat REM 当前目录是 "10 阅读西游记.py" 所在的目录 star…

C语言指针高频笔试题,必看!

大家好,今天给大家介绍C语言指针高频笔试题,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 在C语言的考试中,指针是经常出现的高频考点,以下是…

【华为】GRE VPN 实验配置

【华为】GRE VPN 实验配置 前言报文格式 实验需求配置思路配置拓扑GRE配置步骤R1基础配置GRE 配置 ISP_R2基础配置 R3基础配置GRE 配置 PCPC1PC2 抓包检查OSPF建立GRE隧道建立 配置文档 前言 VPN :(Virtual Private Network),即“…

word调整论文格式的记录

页眉的分章显示内容 效果: 步骤: 确保“显示/隐藏的标记”符号打开点亮 前提是章节前面有“分节符(下一页)”,没有则添加,在菜单栏“布局”——》“下一页” 添加页眉,双击页眉,选…

[ESP32 IDF]web server

目录 通过web server控制LED 核心原理解析 分区表 web server的使用 错误Header fields are too long的解决 通过web server控制LED 通过网页控制LED灯的亮灭,一般的ESP32开发板都可以实现,下面这篇文章是国外开发者提供的一个通过web server控制…

巧用windows的move命令结合jenkins让npm构建速度上来

一.背景 jenkins构建vue2的项目,每次都很慢,即便非常顺利都要1分多钟。之前的文章想到的私服的方式,windows下利用verdaccio私服让npm构建速度上来-CSDN博客。其实慢的原因不仅仅是依赖下载的问题。 二.还有哪里慢 1.源代码同步慢 从构建…

[SWPUCTF 2021 新生赛]easy_md5

用get给name 用post给password 二个值不相等MD5相等 可以通过php的弱类型绕过 $a!$b md5($a)md5($b)找到不同 a 和 a和 a和b,两者的md5值均为0e开头的形式

计算机二级C语言的注意事项及相应真题-2-程序修改

目录 11.找出n的所有因子,统计因子的个数,并判断n 是否是”完数”12.计算s所指字符串中含有t所指字符串的数目13.将一个由八进制数字组成的字符串转换为与其面值相等的十进制整数14.根据整型形参m的值,计算如下公式的值15.从低位开始依次取长…

澄清TypeScript中的 `satisfies` 操作符

TypeScript 的 satisfies 运算符已经推出一段时间了,但它似乎仍然是一个可以用来澄清的混乱来源。 可以把 satisfies 看作是将类型赋给值的另一种方式。 在我们深入研究之前,让我们回顾一下如何赋值类型。 首先,有一个不起眼的“冒号注解”…

【BUG】golang gorm导入数据库报错 “unexpected type clause.Expr“

帮同事排查一个gorm导入数据报错的问题 事发现场 ck sql CREATE TABLE ods_api.t_sms_jg_msg_callback_dis (app_key String DEFAULT COMMENT 应用标识,callback_type Int32 DEFAULT 0 COMMENT 0送达,1回执,channel Int32 DEFAULT 0 COMMENT uid下发的渠道,mode…

基于FFT + CNN -Transformer时域、频域特征融合的电能质量扰动识别模型

目录 往期精彩内容: ​模型整体结构 1 快速傅里叶变换FFT原理介绍 第一步,导入部分数据,扰动信号可视化 第二步,扰动信号经过FFT可视化 2 电能质量扰动数据的预处理 2.1 导入数据 2.2 制作数据集 3 基于FFTCNN-Transform…

无心剑中译聂鲁达《喜欢你寂静如斯》

I Like for You to Be Still 喜欢你寂静如斯 Pablo Neruda 帕布罗聂鲁达 I like for you to be still: it is as though you were absent, and you hear me from far away and my voice does not touch you. It seems as though your eyes had flown away and it seems that…

专业139总分400+南昌大学811信号与系统考研经验电子信息与通信工程集成电路

今年专业课811信号与系统139分,总分400,顺利上岸南昌大学,回首这一年的复习,有很多经验想和大家分享,希望对大家复习会有一些帮助。专业课:139分,811信号与系统 主要参考书:《信号与…

第二证券:苹果Vision Pro出货在即 固态电池产业化前景渐明

sion Pro即将于2月2日正式在美国商场开始交给,苹果美国官网释出了Vision Pro的详细参数,与发布会介绍根本一致,依靠总计12个摄像头、5种传感器、职业顶尖的单眼4K分辨率Micro-OLED显示屏、M2与R1芯片,完成了当时商场上独一无二的沉…

TCP/IP协议以及TCP/IP邮件详细介绍

目录 1. TCP/IP 协议 2. 协议族 3. TCP - 传输控制协议 4. IP - 网际协议(Internet Protocol) 5. HTTP - 超文本传输协议(Hyper Text Transfer Protocol) 6. HTTPS - 安全的 HTTP(HTTP Secure) 7. SSL - 安全套接字…

Leetcode2856. 删除数对后的最小数组长度

Every day a Leetcode 题目来源:2856. 删除数对后的最小数组长度 解法1:哈希 分类讨论 假设数组 nums 中元素 x 出现次数最多,其出现次数为 maxCount。 分类讨论: 如果 2 * maxCount > n,其余所有 n − maxC…