Python多线程批量采集图片的代码实现

 更新时间:2024年05月08日 09:23:25   作者:爱吃饼干的小白鼠  
这篇文章主要给大家介绍了Python多线程批量采集图片的代码实现,文中通过代码示例讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下

前言

本文来介绍如何多线程采集图片,多线程效率更快,但是,我们单一IP请求过于频繁,可能会被反爬,被封IP,所以,我们就要用到IP代理池,大家可以自己去网上找。

环境使用

  • 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。它有如下的行为特征:

  • 池子里的ip是有生命周期的,它们将被定期验证,其中失效的将被从池子里面剔除。
  • 池子里的ip是有补充渠道的,会有新的代理ip不断被加入池子中。
  • 池子中的代理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代理池,本文就到这里了。

到此这篇关于Python多线程批量采集图片的代码实现的文章就介绍到这了,更多相关Python多线程采集图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django实现组合搜索的方法示例

    Django实现组合搜索的方法示例

    本篇文章主要介绍了Django实现组合搜索的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • python安装TA-Lib库报错问题的解决方法

    python安装TA-Lib库报错问题的解决方法

    TaLib是一个Python金融指数处理库,包含了很多技术分析里的常用参数指标,例如MA、SMA、WMA、MACD、ATR等,这篇文章主要给大家介绍了关于python安装TA-Lib库报错问题的解决方法,需要的朋友可以参考下
    2024-01-01
  • 使用plt.bar柱状图减小柱子之间的间隔问题

    使用plt.bar柱状图减小柱子之间的间隔问题

    这篇文章主要介绍了使用plt.bar柱状图减小柱子之间的间隔问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python3 assert断言实现原理解析

    Python3 assert断言实现原理解析

    这篇文章主要介绍了Python3 assert断言实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 关于Python中空格字符串处理的技巧总结

    关于Python中空格字符串处理的技巧总结

    在我们日常工作中经常会遇到字符串处理,大家应该都不陌生,但空格字符串呢?会不会就不太熟悉了呢?所以下面这篇文章就来给大家总结了关于Python中空格字符串处理的技巧,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • windows环境下tensorflow安装过程详解

    windows环境下tensorflow安装过程详解

    这篇文章主要为大家详细介绍了windows环境下tensorflow安装过程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Python百度指数获取脚本下载并保存

    Python百度指数获取脚本下载并保存

    这篇文章主要介绍了Python百度指数获取脚本下载并保存,基于原有的可以对百度指数进行爬虫的脚本做一个可直接返回pd.DataFrame的数据框的类加上可视化代码完成,需要的朋友可以参考一下
    2022-06-06
  • Django中自定义查询对象的具体使用

    Django中自定义查询对象的具体使用

    这篇文章主要介绍了Django中自定义查询对象的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python时间序列缺失值的处理方法(日期缺失填充)

    Python时间序列缺失值的处理方法(日期缺失填充)

    这篇文章主要给大家介绍了关于Python时间序列缺失值(日期缺失填充)的处理方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Python 如何引入同级包和模块

    Python 如何引入同级包和模块

    这篇文章主要介绍了Python 如何引入同级包和模块,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论