软件和网站开发,wordpress微官网主题下载,CP网站建设搭建需要多少钱,店面设计装修网前言 本文来介绍如何多线程采集图片#xff0c;多线程效率更快#xff0c;但是#xff0c;我们单一IP请求过于频繁#xff0c;可能会被反爬#xff0c;被封IP#xff0c;所以#xff0c;我们就要用到IP代理池#xff0c;这里#xff0c;我给大家推荐一个#xff0c;可…前言 本文来介绍如何多线程采集图片多线程效率更快但是我们单一IP请求过于频繁可能会被反爬被封IP所以我们就要用到IP代理池这里我给大家推荐一个可以免费使用7天。足够我们使用了。 环境使用
python 3.9pycharm
模块使用
requests
模块介绍 requests requests是一个很实用的Python HTTP客户端库爬虫和测试服务器响应数据时经常会用到requests是Python语言的第三方的库专门用于发送HTTP请求使用起来比urllib简洁很多。 parsel parsel是一个python的第三方库相当于css选择器xpathre。 parsel由scrapy团队开发是将scrapy中的parsel独立抽取出来的可以轻松解析htmlxml内容获取需要的数据。 相比于BeautifulSoupxpathparsel效率更高使用更简单。 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 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(urlurl,headersheaders,proxiesproxies)
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(urlurl).contentwith open(img\\ name.jpeg, modewb) as f:f.write(img_content)for i in range(1,80):url fhttp://**********/student/{i}.jpgurls.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(urlurl).contentwith open(img\\ name.jpeg, modewb) as f:f.write(img_content)for i in range(1,80):url fhttp://**********/student/{i}.jpgurls.append(url)
with ThreadPoolExecutor(max_workers10) as executor:for url in urls:executor.submit(download,url)endtime datetime.datetime.now()
print((endtime-startime).seconds)
我们这里开了10个线程下载完80张图片只要3s提升了很快当我们的图片很多的时候我们多线程的优势越来越明显。 总结
有的网站回限制IP所以我们就要用到IP代理池本文就到这里了。