首页 > 编程语言 >python爬虫实现简单的代理ip池

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

时间:2024-07-19 18:01:10浏览次数:12  
标签:__ python ip 22% 爬虫 item params url

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网站的话,也可以在下面评论,先谢谢了。

最后这里免费分享给大家一份Python全台学习资料,包含视频、源码。课件,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
编程资料、学习路线图、源代码、软件安装包等!【文末】领取!

① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习
⑤ 历年互联网企业Python面试真题,复习时非常方便

在这里插入图片描述
这份完整版的Python安装包已经上传至CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费获取【保证100%免费】。

在这里插入图片描述

标签:__,python,ip,22%,爬虫,item,params,url
From: https://blog.csdn.net/m0_62283350/article/details/140556402

相关文章

  • JavaScript 基础知识 Day01
    一、计算机基础知识1、计算机数据存储单位位(Bit):1bit可以保存一个0或者1(最小的存储单位)字节(Byte):1B=8b千字节(KB):1KB=1024B兆字节(MB):1MB=1024KB吉字节(GB):1GB=1024MB太字节(TB):1TB=1024GB2、关于JavaScript 它是在1952年2月由网景开......
  • 高速接口自用笔记:GT基础(三):IP配置
    参考:https://mp.weixin.qq.com/s/vsWvH7DS9b0ZBE3NM-e88A配置GTSelection界面首先进入GTSelection配置界面,这个界面主要关注红框部分。从前文对GT的时钟介绍可知,一个GTbank只有一个QPLL,红框部分表示把QPLL的代码放在IP外面实现,这样做的好处在于后续方便扩展收发器通道,便于......
  • macOS Sequoia 15 beta 3 (24A5289h) ISO、IPSW、PKG 下载 (首个公共测试版)
    macOSSequoia15beta3(24A5289h)ISO、IPSW、PKG下载(首个公共测试版)iPhone镜像、Safari浏览器重大更新、备受瞩目的游戏和AppleIntelligence等众多全新功能令Mac使用体验再升级请访问原文链接:https://sysin.org/blog/macOS-Sequoia/,查看最新版。原创作品,转载请保......
  • 基于Python星载气溶胶数据处理与反演分析
    在当前全球气候变化和环境污染问题日益突出的背景下,气溶胶研究显得尤为重要。气溶胶在大气中由直径范围在0.01微米至10微米固体和液体颗粒构成,直接或间接影响地球辐射平衡、气候变化和空气质量。尤其在“碳中和”目标的驱动下,研究气溶胶对“碳中和”的气候影响及其环境效应,不仅......
  • hcip学习 STP的缺点、RSTP针对STP的改进
    一、STP的定时器1、MessageAge:表示了这个BPDU经过了多少台交换机,没经过一台交换机该值就会+1,如果如果该值打印MacAge则该BPDU会被丢弃。2、MaxAge:可以控制BPDU可以传递多少台交换机(假如该值是20则可以传递20台交换机)端口缓存的BPDU的老化时间(加入说根端口在......
  • JavaScript复习记录(6)— 对闭包的理解,闭包使用场景
    闭包(Closure)指的是一个函数可以访问其外部作用域(即使这个函数是在外部作用域之外执行的)。换句话说,闭包是函数和声明该函数的词法环境的组合。闭包的形成闭包在以下情况下形成:当一个内部函数被保存到外部后,即使外部函数已经执行完毕,内部函数仍然可以访问外部函数中的变量。......
  • [附开题]flask框架的基于web的线上考试管理系统的设计与实现n1qn5(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,教育领域正经历着深刻的变革。传统的线下考试模式逐渐显露出其局限性,如组织成本高、效率低下、资源分配不均等问......
  • [附开题]flask框架的基于web的小区疫情防控信息管理系统ca4gz(python+源码)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,全球公共卫生事件频发,特别是新冠疫情的爆发,对社区管理提出了前所未有的挑战。小区作为城市的基本单元,其疫情防控的效率和效果直接关......
  • Python-按空格分割,多个空格当一个空格
    1.概述在Python中,我们可以使用split()函数来按照指定的分隔符对字符串进行分割。默认情况下,split()函数以空格作为分隔符,将字符串分割成一个列表。然而,如果字符串中有多个连续的空格,split()函数会将它们都当作分隔符,导致分割后的列表中会有空白项。本文将教会你如何按照空格分割字......
  • boss直聘自动投递(python+selenium)
    fromseleniumimportwebdriverimporttimefromselenium.webdriver.common.byimportByfromselenium.webdriver.common.serviceimportServicefromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditions......