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

news2024/9/20 22:45:22

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

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

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

使用requests.get爬取数据

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

def requestData():
    # 爬取数据的url
    url: 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():
    # 爬取数据的url
    url: 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():
    # 爬取数据的url
    url: 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.coloradmin.cn/o/1934967.html

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

相关文章

[Maven] 打包编译本地Jar包报错的几种解决办法

目录 方式1:通过scope指定 方式2:通过新建lib 方式3:通过build节点打包依赖​​​​​​​ 方式4:安装Jar包到本地 方式5:发布到远程私有仓库 方式6:删除_remote.repositories 方式7:打包…

Leetcode二分搜索法浅析

文章目录 1.二分搜索法1.1什么是二分搜索法?1.2解法思路 1.二分搜索法 题目原文: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返…

TCP重传机制详解

1.什么是TCP重传机制 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息。 但是如果传输的过程中,数据包丢失了,就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的…

决策树回归(Decision Tree Regression)

理论知识推导 决策树回归是一种非参数监督学习方法,用于回归问题。它通过将数据集划分成较小的子集来建立模型,并在这些子集上构建简单的预测模型(通常是恒定值)。下面是决策树回归的数学推导过程: 实施步骤与参数解读…

紫光展锐5G安卓核心板T760__国产手机芯片方案

展锐T760安卓核心板是具备续航和性能更加均衡的5G移动平台。其主要特点包括主流的6400万像素摄像头和高达120Hz的刷新率。 平台采用多模融合的创新架构和AI智能调节技术,从而在5G数据场景下降低了37%的整体功耗,在5G待机场景下降低了18%的整体功耗。 多…

遇到报错:无法安装 “WebDriverAgentRunner-Runer“ 无法安装此app,因为无法验证其完整性,如何解决

嗨,大家好,我是兰若,相信很多人在做app自动化测试时,都遇到过这种报错:无法安装 “WebDriverAgentRunner-Runer” 无法安装此app,因为无法验证其完整性。 以下是一些解决思路: 这个问题通常是由于 iOS 设…

Linux系统学习日记——vim操作手册

Vim编辑器是linux下的一个命令行编辑器,类似于我们windows下的记事本。 目录 打开文件 编辑 保存退出 打开文件 打开 hello.c不存在也可以打开,保存时vim会自动创建。 效果 Vim打开时,处于命令模式,即执行命令的模式&#x…

Leetcode算法题(移除链表中的元素)

题目如下: 思路1:创建一个新的带头链表 (newhead),遍历头结点对应的值分别于x进行比较,将不等于x的节点尾插到新的带头链表中,返回新的带头链表的下一个节点。 代码如下: typedef …

大数据开发之Hadoop

大数据开发之Hadoop Hadoop的发展Hadoop的三个功能组件一、HDFS 分布式文件系统 1、HDFS的基础架构2、HDFS基础操作命令3、HDFS WEB浏览:4、Big Data Tools插件5、使用NFS网关功能将HDFS挂载到本地系统6、HDFS数据存储7、NameNode 元数据8、SecondaryNameNode的作用…

从人工巡检到智能防控:智慧油气田安全生产的新视角

一、背景需求 随着科技的飞速发展,视频监控技术已成为各行各业保障安全生产、提升管理效率的重要手段。特别是在油气田这一特殊领域,由于其工作环境复杂、安全风险高,传统的监控方式已难以满足实际需求。因此,基于视频监控AI智能…

Gettler‘s Screep World 笔记 Ⅰ

夏促时候刚刚入坑,写个笔记叭~ 环境配置 参考 HoPGoldy 大佬的简书,先配置下开发环境 萌新去看大佬的详细教程,我这里比较简单,有前端基础的可以直接抄 VSCode 跳过 node 我配的是v18.18.2 换源 npm config set registry h…

高性能分布式IO系统BL205 OPC UA耦合器

边缘计算是指在网络的边缘位置进行数据处理和分析,而不是将所有数据都传送到云端或中心服务器,这样可以减少延迟、降低带宽需求、提高响应速度并增强数据安全性。 钡铼BL205耦合器就内置边缘计算功能,它不依赖上位机和云平台,就能…

SpringCloudAlibaba-Seata2.0.0与Nacos2.2.1

一、下载 ## 下载seata wget https://github.com/apache/incubator-seata/releases/download/v2.0.0/seata-server-2.0.0.tar.gz## 解压 tar zxvf seata-server-2.0.0.tar.gz二、执行sql文件 ## 取出sql文件执行 cd /seata/script/server/db/mysql ## 找个mysql数据库执行三、…

gitlab新建仓库

总贴 每个git网站都有不同的创建项目的方式,现在举例gitlab,其他例如gitee,gitcode,都是差不多的,自行百度 1![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dae875d9048940c0aeb292c07d6a4a62.png)1和2是项…

【面试题】数据结构:堆排序的排序思想?

堆排序的排序思想? 堆排序是一种高效的排序算法,其基本思想是利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,通常用数组来表示。堆排序的基本步骤如下: 1. 构建初始堆: 将待排序的数组转换成一个最大堆&a…

《昇思25天学习打卡营第25天|第20天》

今天是第二十天,今天学习的是应用实践的生成式的Pix2Pix实现图像转换。 老传统,从Pix2Pix概述学起(基于条件生成对抗网络实现的一种深度学习图像转换模型),基础原理,准备环节(配置环境文件、准…

科普文:企业级磁盘阵列软件架构与功能概述

科普文:了解RAID独立冗余磁盘阵列-CSDN博客 磁盘阵列软件概叙 从硬件到软件进行了一个比较全面,但又非常浅显的介绍。在硬件方面,我们了解到企业级磁盘阵列通常由两个独立的计算机打包成一台设备提供存储服务;在软件方面&#x…

分布式服务框架zookeeper+消息队列kafaka

一、zookeeper概述 zookeeper是一个分布式服务框架,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:命名服务,状态同步,配置中心,集群管理等。 在分布式环境下,经常需要对应用/服…

linux中list的基本用法

内核链表 1 list_head 结构 为了使用链表机制&#xff0c;驱动程序需要包含<linux/types.h>头文件&#xff0c;该文件定义了如下结构体实现双向链&#xff1a; struct list_head {struct list_head *next, *prev; };2 链表的初始化 2.1 链表宏定义和初始化 可使用以…

C++【OpenCV】图片亮度色度归一化

#include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;int main() {Mat image imread("SrcMF.jpg");// 灰度、Gamma归一化亮度cv::Mat m_gray;cv::cvtColor(image, m_gra…