python爬虫实现简单的代理ip池

python爬虫实现简单的代理ip池

我们在普通的爬虫过程中经常遇到一些网站对ip进行封锁的

下面演示一下普通的爬虫程序

使用requests.get爬取数据

这段代码是爬取豆瓣排行榜的数据,使用f12来查看请求的url和数据格式
在这里插入图片描述
在这里插入图片描述
代码

def requestData():# 爬取数据的urlurl: str = "https://movie.douban.com/j/chart/top_list";# 拼接url的请求参数,根据查看记录可以看到,start是页码params: dict = {"type": 24,"start": 0,"limit": 20,"interval_id": "100:90","action": ""}# 请求头headers: dict = {"Cookie": 'bid=E_4gLcYLK28; douban-fav-remind=1; _pk_id.100001.4cf6=356001ac7c27c8a7.1721138006.; __yadk_uid=3UpO8BdyzrKbVCb1NOAtbGumsp4WCXwl; __utmz=30149280.1721147606.4.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utmz=223695111.1721147606.3.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); ll="118281"; _vwo_uuid_v2=DD3C30CAFFD881E01CA061E73D9968226|23b8625e4550d2e13d1dacf343f40f5d; __utma=30149280.457246694.1704531990.1721147606.1721223349.5; __utmc=30149280; __utma=223695111.1791837078.1721138006.1721147606.1721223349.4; __utmb=223695111.0.10.1721223349; __utmc=223695111; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1721223349%2C%22https%3A%2F%2Fwww.google.com%2F%22%5D; _pk_ses.100001.4cf6=1; ap_v=0,6.0; __utmt=1; __utmb=30149280.1.10.1721223349',"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}# 循环100次来获取数据for i in range(1000):params["start"] = 20 * i;try:data = requests.get(url, params=params, headers=headers);jsonData = data.json();for item in jsonData:print("标题:{} 评分:{}".format(item["title"], item["score"]))except Exception as e:pass;

请求头中的User-Agent是模仿浏览器,告诉请求的地址,我们也是浏览器的请求,这个是可以针对一些低级的反爬做的一些措施,Cookie就是身份验证,要跟服务器说明我们的身份,也是针对一些低级的反爬做的一些措施

for i in range(1000):params["start"] = 20 * i;try:data = requests.get(url, params=params, headers=headers);jsonData = data.json();for item in jsonData:print("标题:{} 评分:{}".format(item["title"], item["score"]))except Exception as e:pass;

这里加了try except 这个是为了防止爬虫失败导致后面的数据没有进行爬取到

 jsonData = data.json();for item in jsonData:print("标题:{} 评分:{}".format(item["title"], item["score"]))

这一段就是拿出爬取的json格式的数据,进行打印,这里也可以写如excel也可以写进数据库,因为我不需要那些数据,所以就做了简单的打印,查看爬取的数据

以上这段代码就是简单的爬虫,但是这种简单的爬虫,很容易遇到ip反爬,下面就演示简单的ip代理池爬虫

def requestDataIp():# 爬取数据的urlurl: str = "https://movie.douban.com/j/chart/top_list";# 拼接url的请求参数,根据查看记录可以看到,start是页码params: dict = {"type": 24,"start": 0,"limit": 20,"interval_id": "100:90","action": ""}# 请求头headers: dict = {"Cookie": 'bid=E_4gLcYLK28; douban-fav-remind=1; _pk_id.100001.4cf6=356001ac7c27c8a7.1721138006.; __yadk_uid=3UpO8BdyzrKbVCb1NOAtbGumsp4WCXwl; __utmz=30149280.1721147606.4.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utmz=223695111.1721147606.3.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); ll="118281"; _vwo_uuid_v2=DD3C30CAFFD881E01CA061E73D9968226|23b8625e4550d2e13d1dacf343f40f5d; __utma=30149280.457246694.1704531990.1721147606.1721223349.5; __utmc=30149280; __utma=223695111.1791837078.1721138006.1721147606.1721223349.4; __utmb=223695111.0.10.1721223349; __utmc=223695111; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1721223349%2C%22https%3A%2F%2Fwww.google.com%2F%22%5D; _pk_ses.100001.4cf6=1; ap_v=0,6.0; __utmt=1; __utmb=30149280.1.10.1721223349',"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}# 动态ip代理池ipList: List[str] = ["d484.kdltps.com:15818","d484.kdltps.com:15818","117.42.94.126:19634"]ipIndex = 0;# 循环100次来获取数据for i in range(100):proStr = ipList[ipIndex];proxies = {"http": f"http://{proStr}",'https': f"https://{proStr}"}params["start"] = startIdx * 20;try:data = requests.get(url, params=params, headers=headers,proxies=proxies);jsonData = data.json();for item in jsonData:print("标题:{} 评分:{}".format(item["title"], item["score"]))startIdx+=1;except Exception as e:print("请求报错:" + str(e));pass;ipIndex += 1;if ipIndex >= len(ipList):ipIndex = 0;

这里大部分代码没变,只是加了一些东西

 ipList: List[str] = ["d484.kdltps.com:15818","d484.kdltps.com:15818","117.42.94.126:19634"]

这段代码就是默认ip代理池,ip代理池可以是数据库,也可以是excel进行存储

proStr = ipList[ipIndex];proxies = {"http": f"http://{proStr}",'https': f"https://{proStr}"}

这里的http是针对http请求做代理,https是针对https请求做代理
这里就是针对反爬做的措施,因为我每次访问都是用不同的ip代理,有一些反爬措施是根据ip短时间的访问次数进行反爬的,这样就可以逃过一劫,也可以保证我的ip池高可用,一个一个ip被封了

        try:data = requests.get(url, params=params, headers=headers,proxies=proxies);jsonData = data.json();for item in jsonData:print("标题:{} 评分:{}".format(item["title"], item["score"]))except Exception as e:print("请求报错:" + str(e));pass;

这里有一些处理可用优化一下,因为这里遇到错误直接打印然后跳出了,这里可以加一些操作,如果判断ip代理被封了,或者是ip代理失效了就可以删掉这个代理再用其他代理爬一次,比如

def requestDataIp():# 爬取数据的urlurl: str = "https://movie.douban.com/j/chart/top_list";# 拼接url的请求参数,根据查看记录可以看到,start是页码params: dict = {"type": 24,"start": 0,"limit": 20,"interval_id": "100:90","action": ""}# 请求头headers: dict = {"Cookie": 'bid=E_4gLcYLK28; douban-fav-remind=1; _pk_id.100001.4cf6=356001ac7c27c8a7.1721138006.; __yadk_uid=3UpO8BdyzrKbVCb1NOAtbGumsp4WCXwl; __utmz=30149280.1721147606.4.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __utmz=223695111.1721147606.3.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); ll="118281"; _vwo_uuid_v2=DD3C30CAFFD881E01CA061E73D9968226|23b8625e4550d2e13d1dacf343f40f5d; __utma=30149280.457246694.1704531990.1721147606.1721223349.5; __utmc=30149280; __utma=223695111.1791837078.1721138006.1721147606.1721223349.4; __utmb=223695111.0.10.1721223349; __utmc=223695111; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1721223349%2C%22https%3A%2F%2Fwww.google.com%2F%22%5D; _pk_ses.100001.4cf6=1; ap_v=0,6.0; __utmt=1; __utmb=30149280.1.10.1721223349',"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}# 动态ip代理池ipList: List[str] = ["d484.kdltps.com:15818","d484.kdltps.com:15818","117.42.94.126:19634"]ipIndex = 0;startIdx = 0;# 循环100次来获取数据for i in range(100):proStr = ipList[ipIndex];proxies = {"http": f"http://{proStr}",'https': f"https://{proStr}"}params["start"] = startIdx * 20;try:data = requests.get(url, params=params, headers=headers,proxies=proxies);jsonData = data.json();for item in jsonData:print("标题:{} 评分:{}".format(item["title"], item["score"]))startIdx += 1;except requests.exceptions.ConnectionError as e:ipList.pop(ipIndex)print("代理报错")except Exception as e:print("请求报错:" + str(e));pass;ipIndex += 1;if ipIndex >= len(ipList):ipIndex = 0;

也就是加了这段代码

        except requests.exceptions.ConnectionError as e:ipList.pop(ipIndex)print("代理报错")
这里加一个题外话,我在用免费代理ip的时候大部分都不行,现在免费代理ip都不靠谱了,我前几年用免费代理ip的时候都挺可以的,如果想要自己的爬虫服务器够稳定的话,个人建议还是买代理ip比较好,或者大家如果有好用的免费代理ip网站的话,也可以在下面评论,先谢谢了

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

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

相关文章

数学基础【俗说矩阵】:矩阵相乘

矩阵乘法 矩阵乘法推导过程 一、两个线性方程复合代入 二、X1和X2合并同类项 三、复合后方程组结果 四、线性方程组矩阵表示 五、线性方程组矩阵映射表示 复合映射表示 六、矩阵乘法导出 矩阵乘法法则 1、规则一推导过程 左取行,右取列,对应相乘后…

java中double类型1+1.82保留的很多小数如何处理

问题描述: Java处理Double类型数据相加时,出现11.822.8200000000000003并存入数据库的情况 问题原因: 在计算机中,浮点数(如1.82)通常用二进制形式表示,而这种表示方式可能会导致精度丢失&…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.4信息安全

前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…

iOS 左滑返回事件的控制

0x00 视图结构 1-根视图 1.1-控制器A 1.1.1-控制器B 1.1.1.1-控制器C 0x01 控制 通过设置 self.navigationController.interactivePopGestureRecognizer.enabled 为 YES 或 NO 来控制当面界面,是否能左滑返回 在 控制器B 的生命周期方法内,设置属性 s…

「Vue组件化」封装i18n国际化

前言 在Vue应用中实现国际化(i18n),通常需要使用一些专门的库,比如vue-i18n。本文主要介绍自定义封装i18n,支持Vue、uniapp等版本。 设计思路 一、预期效果 二、核心代码 2.1 i18n.xlsx文件准备 2.2 脚本执行 根目录main.js根目录locali18n.xlsxnode main.jsmain.js 文件…

机器学习数据集的一致性表现在哪些方面-九五小庞

数据集的一致性是机器学习和数据分析领域中一个重要的概念,它主要体现在以下几个方面: 特征分布一致性 单变量分布:训练集和测试集中各个特征的分布情况应相似。例如,如果某一个数值特征在训练集中是正态分布,那么在…

【ARM】MDK-解决CMSIS_DAP.DLL missing报错

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录解决CMSIS_DAP.DLL missing的报错情况,对应相关报错信息,供后续客户参考,快速解决客户问题。 2、 问题场景 客户进行硬件调试时,发现Target设置内有CMSIS_DAP.DL…

全时守护,无死角监测:重点海域渔港视频AI智能监管方案

一、方案背景 随着海洋经济的快速发展和海洋资源的日益紧缺,对重点海域渔港进行有效监控和管理显得尤为重要。视频监控作为一种高效、实时的管理手段,已成为渔港管理中不可或缺的一部分。当前,我国海域面积广阔,渔港众多&#xf…

uni-app学习HBuilderX学习-微信开发者工具配置

HBuilderX官网:简介 - HBuilderX 文档 (dcloud.net.cn)https://hx.dcloud.net.cn/ uni-app官网: uni-app官网 (dcloud.net.cn)https://uniapp.dcloud.net.cn/quickstart-hx.htmlHBuilder下载安装:打开官网 uni-app项目的微信开发者工具配置…

力扣LCR184.设计自助结算系统

力扣LCR184.设计自助结算系统 一个队列存所有value 一个数组模拟单调队列存区间最大值 const int N 100010;int a[N];class Checkout {queue<int> q;int hh0,tt-1;public:Checkout() {}int get_max() {if(hh > tt) return -1;return a[hh];}void add(int value) {…

在实际应用中,systemverilog相比vefilog2000有哪些重大的提升

SystemVerilog 相较于 Verilog-2000 有多项重大提升&#xff0c;这些提升使得 SystemVerilog 成为更强大的硬件描述和验证语言。以下是一些关键的改进&#xff1a; 数据类型扩展&#xff1a; SystemVerilog 引入了 logic 数据类型&#xff0c;可以替代 Verilog-2000 中的 wire …

41 QOS技术(服务质量)

1 QOS 产生背景 对于网络业务&#xff0c;影响服务质量的因素包括传输的带宽、传送的时延、数据的丢包率等。网络资源总是有限的&#xff0c;只要存在抢夺网络资源的情况&#xff0c;就会出现服务质量的要求网络总带宽固定的情况下&#xff0c;如果某类业务占用的带宽越多&am…

皮尔逊相关系数

皮尔逊相关系数 一、统计学知识 期望值&#xff1a; E ( X ) E(X) E(X)表示随机变量 X \textit X X的期望值。 E ( X ) X ‾ 1 n ∑ i 1 n X i \mathrm{E(X) \overline{X} \frac{1}{n} \sum_{i1}^{n} X_i} E(X)Xn1​i1∑n​Xi​ 方差&#xff1a;衡量一组数据的离散程度…

【代码随想录|第十一章 图论part01 | 797.所有可能的路径 】

代码随想录|第十一章 图论part01 | 图论理论基础&#xff0c;797.所有可能的路径&#xff0c;广搜理论基础 一、图论理论基础1.图的基本概念2.图的构造1&#xff09;邻接矩阵2&#xff09;邻接表 3.图的遍历方式4.深度优先搜索理论基础 二、797.所有可能的路径1.核心代码2.问题…

Mysql-错误处理: Found option without preceding group in config file

1、问题描述 安装MYSQL时&#xff0c;在cmd中“初始化”数据库时&#xff0c;输入命令&#xff1a; mysqld --initialize --consolecmd报错&#xff1a; D:\mysql-5.7.36-winx64\bin>mysql --initialize --console mysql: [ERROR] Found option without preceding group …

Web开发:ASP.NET CORE的后端小结(基础)

1.后端重定向到指定路由 public IActionResult Index(){return RedirectToAction("Index", "Main");//重定向>Main/Index} 【备注】如果在MainController的Index方法中return View();本质是 return View("Index")&#xff0c;返回和方法同名的…

Mysql中delete数据后磁盘空间浅析

在MySQL中&#xff0c;使用DELETE语句删除数据后&#xff0c;磁盘上的文件不会立即缩小&#xff0c;因为MySQL通常不会重建文件并删除不再使用的空间。这是因为DELETE操作只标记已删除的数据为可重用&#xff0c;并不立即清除物理存储空间。 为了释放磁盘空间&#xff0c;你需要…

windows配置python项目本地定时执行(一)

背景 之前写的一个基金数据爬取的脚本需要部署在windows系统&#xff0c;需要一个启动、关闭脚本 通用bat代码实现&#xff1a; echo offTITLE "启动bat" rem 需要处理的程序名 SET process_name"Snipaste.exe" rem 存放进程id的文件用来判断进程是否已…

部署和运维

目录 1.Git1.1. Git指令中merge和rebase的区别1. Commit 记录2. 合并方式3. 冲突处理4. 使用场景选择建议 1.2. cherry-pick的使用如何使用 git cherry-pick例子处理冲突撤销 cherry-pick其他选项 结论 2. 部署1. Nginx的使用场景 编译打包1. webpack2. webpack打包优化1. 代码…

vscode通过ssh链接远程服务器上的docker

目录 1 编译docker image1.1 编译镜像1.2 启动镜像 2 在docker container中启动ssh服务2.1 确认是否安装ssh server2.2 修改配置文件2.3 启动ssh服务 3 生成ssh key4 添加ssh公钥到docker container中5 vscode安装插件Remote - SSH6 在vscode中配置 1 编译docker image 一般来…