网络爬虫设置代理服务器

      

目录

1.获取代理 IP

2.设置代理 IP

3. 检测代理 IP 的有效性

4. 处理异常


         如果希望在网络爬虫程序中使用代理服务器,就需要为网络爬虫程序设置代理服务器。
设置代理服务器一般分为获取代理 IP 、设置代理 IP 两步。接下来,分别对获取代理 IP 和设
置代理 IP 进行详细介绍。

1.获取代理 IP

        代理 IP 主要有 3 种获取方式,它们分别是获取免费代理 IP 、获取付费代理 IP ADSL
拨号,关于它们的介绍如下。
        (1 )获取免费代理 IP 。免费代理 IP 基本没有成本,可以从免费代理网站(如快代理、全
网代理 IP 等)上找一些免费代理 IP ,测试可用后便可以收集起来备用,但使用这种方式获取
的可用代理 IP 相对较少。
        (2 )获取付费代理 IP 。互联网上存在许多代理商,用户付费后便可以获得一些高质量的
代理 IP
        (3 ADSL 拨号。 ADSL Asymmetric Digital Subscriber Line ,非对称数字用户线路)通
过拨号的方式上网,需要输入 ADSL 账号和密码。每次拨号都会更换一个新的 IP 地址,不过
ADSL 拨号操作起来比较麻烦。每切换一次 IP 地址,都要重新拨号。重拨期间还会处于短暂
断网的状态。
        综上所述,免费代理 IP 是比较容易获取的,不过这类代理 IP 的质量不高,高度匿名代理
IP 比较少,有的代理 IP 很快会失效。如果大家对代理 IP 的质量要求比较高,或者需要大量
稳定的代理 IP ,那么建议选择一些正规的代理商进行购买。

2.设置代理 IP

        在 Requests 中,设置代理 IP 的方式非常简单:只需要在调用请求函数时为 proxies 参数
传入一个字典。该字典包含了所需要的代理 IP ,其中字典的键为代理类型(如 http https ),
字典的值为“代理类型 ://IP 地址 : 端口号”格式的字符串。例如,定义一个包含两个代理 IP
字典,代码如下。
proxies = { 'http': 'http://127.0.0.1:8070', 'https': 'https://10.10.1.10:1080', 
}
        接下来,通过一个例子演示如何从 IP 地址列表中随机选择一个 IP 地址,将该 IP 地址设
置为代理 IP ,之后基于该代理 IP 请求小兔鲜儿网首页,具体代码如下。
import requests 
import random 
# 代理 IP 地址的列表
proxy_list = [ {"http" : "http://101.200.127.149:3129"}, {"http" : "http://59.55.162.4:3256"}, {"http" : "http://180.122.147.76:3000"}, {"http" : "http://114.230.107.102:3256"}, {"http" : "http://121.230.211.163:3256"} 
] 
base_url = 'http://erabbit.itheima.net/#/' 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64' 'AppleWebKit/537.36 (KHTML, like Gecko)' 'Chrome/90.0.4430.212 Safari/537.36'} 
# 发送 GET 请求,将 proxy_list 中任意一个 IP 地址设为代理
response = requests.get(base_url, headers=header, proxies= random.choice(proxy_list)) 
print(response.status_code)

        header请求头字段可以在网页按F12键,上方找到网络标识,然后点击下方有一个名称点进去,右边窗口下面就有User-Agent字段。

 

 

        上述代码中,首先创建了包含 5 IP 地址的列表 proxy_list ,定义了代表小兔鲜儿网首页
URL 的变量 base_url ,定义了表示请求头的变量 header ;然后调用 get() 函数根据 base_url 请求
小兔鲜儿网首页,同时指定该请求的请求头为 header 且代理 IP proxy_list 中的任意一个 IP
地址,以防止服务器识别出网络爬虫的身份而被禁止访问,并将服务器返回的响应赋值给变
response ;最后访问 response status_code 属性获取响应状态码。
运行代码,输出如下结果。
 200
        从输出结果可以看出,程序成功访问了小兔鲜儿网首页。
需要说明的是,上述程序中使用的代理 IP 是免费的。由于使用时间不固定,这些代理 IP
一旦超出使用时间范围就会失效,此时再运行上述程序则会出现 ProxyError 异常,所以我们
在这里建议大家换用自己查找的代理 IP

3. 检测代理 IP 的有效性

        互联网上有很多免费的代理 IP ,但这些 IP 地址并不都是有效的。因此需要对获取的免费
IP 地址进行检测,确定 IP 地址是否有效。检测代理 IP 有效性的过程比较简单,需要先遍历
收集的所有代理 IP ,将获取的每个代理 IP 依次设为代理,再通过该 IP 地址向网站发送请求。
如果请求成功,则说明该 IP 地址是有效的;如果请求失败,则说明该 IP 地址是无效的,需要
被剔除。
        下面以 3.4.2 节的代理 IP 为例,为大家演示如何检测代理 IP 的有效性,具体代码如下

 

import requests 
proxy_list = [ {"http" : "http://101.200.127.149:3129"}, {"http" : "http://59.55.162.4:3256"}, {"http" : "http://180.122.147.76:3000"}, {"http" : "http://114.230.107.102:3256"}, {"http" : "http://121.230.211.163:3256"} 
] 
base_url = 'http://erabbit.itheima.net/#/' 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64' 'AppleWebKit/537.36 (KHTML, like Gecko)' 'Chrome/90.0.4430.212 Safari/537.36'} 
# 遍历代理 IP 
for per_ip in proxy_list.copy(): try: # 发送 GET 请求,将获取的每个 IP 地址设置为代理response = requests.get(base_url, headers=header, proxies=per_ip, timeout=3) except: # 失败则输出 IP 地址无效,并将该 IP 地址从 proxy_list 列表中移除print(f'IP 地址:{per_ip.get("http")}无效') proxy_list.remove(per_ip) else: # 成功则输出 IP 地址有效print(f'IP 地址:{per_ip.get("http")}有效')
        上述加粗部分的代码中,首先从 proxy_list 列表的副本遍历了每个 IP 地址 per_ip ;然后在 try
子句中调用 get() 函数发送了一个 GET 请求,并在发送该请求时将 per_ip 依次设置为代理,由代
理服务器代替程序向服务器转发请求;接着在 except 子句中处理了请求失败的情况,输出“ IP
地址: ××× 无效”,并将该 IP 地址从 proxy_list 列表中移除,确保 proxy_list 列表中只保留有效
IP 地址;最后在 else 子句中处理了请求成功的情况,输出“ IP 地址: ××× 有效”。
运行代码,输出如下结果。
IP 地址:http://101.200.127.149:3129 有效
IP 地址:http://59.55.162.4:3256 无效
IP 地址:http://180.122.147.76:3000 无效
IP 地址:http://114.230.107.102:3256 无效
IP 地址:http://121.230.211.163:3256 有效
        从输出结果可以看出,这 5 个代理 IP 中有两个是有效的,其余 3 个都是无效的。

4. 处理异常

        每个程序在运行过程中可能会遇到各种各样的问题,网络爬虫自然也不例外。
        访问网站离不开网络的支撑。由于网络环境十分复杂,具有一定的不可控性,所以网络爬虫
每次访问网站后不一定能够成功地获得从服务器返回的数据。网络爬虫一旦在访问过程中遇
到一些网络问题(如 DNS 故障、拒绝连接等),就会导致程序引发异常并停止运行。
requests.exceptions 模块中定义了很多异常类型,常见的异常类型如表 3-2 所示。

         表 3-2 中罗列了一些常见的异常类型。其中,Timeout 继承自 RequestExceptionConnect Timeout 和 ReadTimeout 继承自 Timeout。 为保证程序能够正常终止,我们可以使用 try-except 语句捕获相应的异常,并对异常进行 相应的处理。 由于谷歌网站服务器的原因,访问该网站必定会出现连接超时的问题。下面以访问谷歌 网站为例,为大家演示如何使用 try-except 语句捕获 RequestException 异常,具体代码如下。

1 import time 
2 import requests 
3 # 记录请求的发起时间
4 print(time.strftime('开始时间:%Y-%m-%d %H:%M:%S')) 
5 # 捕获 RequestException 异常
6 try: 
7 html_str = requests.get('http://www.google.com').text 
8 print('访问成功') 
9 except requests.exceptions.RequestException as error: 
10 print(error) 
11 # 记录请求的终止时间
12 print(time.strftime('结束时间:%Y-%m-%d %H:%M:%S'))
        上述代码中,第 4 行代码记录了发送请求之后的时间。第 6 10 行代码使用 try-except
句尝试捕获与处理 RequestException 异常。其中,第 6 8 行代码在 try 子句中调用 get() 函数
访问谷歌网站,并在访问成功后输出“访问成功”。第 9 10 行代码在 except 子句中指定了捕
获的异常类型为 RequestException 。程序监测到 try 子句中的代码抛出 RequestException 异常
时,会捕获 RequestException 和所有继承自 RequestException 的异常,并在捕获异常后输出详
细的异常信息。第 12 行代码记录了终止请求之后的时间。
运行代码,输出如下结果。
开始时间:2021-06-16 13:50:53 
HTTPConnectionPool(host='www.google.com', port=80): Max retries exceeded with url: 
/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 
0x00000000034D6790>: Failed to establish a new connection: [WinError 10060] 由于连接方
在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。')) 
结束时间:2021-06-16 13:51:14
        通过对比结束时间与开始时间可知,我们等待了约 20 秒,这个时间相对来说有些长,这
种长时间的等待是没有任何意义的。
        为了减少无意义的等待,我们在发送 HTTP 请求时可以设置超时时长,即调用 get() 函数
时传入 timeout 参数,并给该参数指定代表超时时长的值。如果超过该时长,服务器仍然没有
返回任何响应内容,就让程序立即引发一个超时异常。在以上示例中,为请求设置超时时长
5 秒,具体代码如下。
# 发送 GET 请求,设置超时时长
html_str = requests.get('http://www.google.com', timeout=5).text

        再次运行代码,输出如下结果。 

开始时间:2021-06-16 14:30:01 
HTTPConnectionPool(host='www.google.com', port=80): Max retries exceeded with url: 
/ (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 
0x00000000033E23D0>, 'Connection to www.google.com timed out. (connect timeout=5)')) 
结束时间:2021-06-16 14:30:06
        通过对比结果中的结束时间和开始时间可知,程序执行了 5 秒后便直接结束,并抛出
ConnectTimeoutError 异常及提示信息“ Connection to www.google.com timed out ”。这说明连接
谷歌网站时超过了预设的等待时长而导致访问失败。

 

 

 

 

 

 

 

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

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

相关文章

【数据库备份完整版】物理备份、逻辑备份,mysqldump、mysqlbinlog的备份方法

【数据库备份完整版】物理备份、逻辑备份&#xff0c;mysqldump、mysqlbinlog的备份方法 一、物理备份二、逻辑备份1.mysqldump和binlog备份的方式&#xff1a;2.mysqldump完整备份与恢复数据2.1 mysqldump概念2.2 mysqldump备份2.3 数据恢复2.4 **使用 Cron 自动执行备份**2.5…

机器学习:人工智能的子领域之一

引言 人工智能&#xff08;AI&#xff09;已经成为现代科技的重要组成部分&#xff0c;推动了许多领域的创新与进步。在人工智能的诸多子领域中&#xff0c;机器学习&#xff08;ML&#xff09;无疑是最关键和最具影响力的一个。机器学习通过自动分析和学习数据中的模式&#x…

机器学习算法的电影推荐系统以及票房预测系统

一、实验概述 1. 实验目标 本项目希望基于电影数据集&#xff0c;依据电影的简介、关键词、预算、票房、用户评分等特征来对电影进行分析&#xff0c;并完成以下任务&#xff1a; 对电影特征的可视化分析对电影票房的预测多功能个性化的电影推荐算法 2. 数据集 针对票房预…

湖南科技大学24计算机考研情况,软工学硕考数二,分数线290分,录取均分321分!

湖南科技大学&#xff08;Hunan University of Science and Technology&#xff09;坐落在伟人故里、人文圣地湘潭&#xff0c;处于长株潭核心区域&#xff0c;比邻湘潭九华经济技术开发区&#xff08;国家级&#xff09;&#xff0c;是应急管理部、国家国防科技工业局与湖南省…

自监督分类网络:创新的端到端学习方法

现代人工智能的快速发展中&#xff0c;分类任务的高效解决方案一直备受关注。今天&#xff0c;我们向大家介绍一种名为Self-Classifier的全新自监督端到端分类学习方法。由Elad Amrani、Leonid Karlinsky和Alex Bronstein团队开发&#xff0c;Self-Classifier通过优化同一样本的…

探索C嘎嘎的奇妙世界:第十六关---STL(vector的练习)

1.只出现一次的数字 我们可以使用异或运算来解决这个问题&#xff1a; 异或运算有一个重要的性质&#xff1a;两个相同的数进行异或运算结果为 0&#xff0c;任何数与 0 异或结果为其本身。对于数组中的元素&#xff0c;依次进行异或运算&#xff0c;出现两次的元素异…

智谱API调用

一、智谱API 文心一言api 千帆大模型平台 申请和使用 智谱AI开放平台 登录智谱AI开放平台&#xff0c;点击右上角的开发者工作台&#xff0c;然后查看自己的API glm-4 接口 conda create -n zhipuai python3.10 -y 二、如何使用 这边的介绍是根据官方文档的接口文档来进行介绍…

postman 工具下载安装使用教程_postman安装

本文讲解的是postman工具下载、Postman安装步骤、postman下载、postman安装教程。Postman是一款流行的API测试工具&#xff0c;它提供了一个用户友好的界面&#xff0c;用于发送和测试API请求&#xff0c;并且可以轻松地按需管理和组织请求。 这使得开发人员和测试人员能够更高…

MATLAB神经网络---lstmLayer(LSTM 长短期记忆神经网络)

前言 描述LSTM就要先描述一下循环神经网络 循环神经网络 循环神经网络通过使用带自反馈的神经元&#xff0c;使得网络的输出不仅和当前的输入有关&#xff0c;还和上一时刻的输出相关&#xff0c;于是在处理任意长度的时序数据时&#xff0c;就具有短期记忆能力。 如下是一个…

《沃趣 分手后霸道少爷宠爆我》盛大开机典礼

南京五聚文化传媒有限公司自豪地宣布&#xff0c;引人入胜的2024年度短剧巨作——《沃趣 分手后霸道少爷宠爆我》——今日正式开拍&#xff01;在星辰下的华丽舞台上&#xff0c;我们汇集了业界的精英力量&#xff0c;准备讲述一个关于爱、错位与重生的故事。 典礼精彩亮点 1.…

AttributeError: ‘ImageDraw‘ object has no attribute ‘textsize‘

python项目生成词云图的时候报错&#xff1a;AttributeError: ‘ImageDraw’ object has no attribute ‘textsize’ 解决办法 出现这个问题&#xff0c;可能是因为Pillow版本过高导致的&#xff0c;我们可以尝试通过降低Pillow的版本来解决它。 我通过将Pillow版本降低到9.4.…

微信小程序接入lottie动画

1、注意&#xff1a;canvas渲染出来的层级太高&#xff0c;当有弹窗的情况会暴露在弹窗外 模拟器上会有这个问题&#xff0c;线上版本不会有 2、需求 需要把lottie动画在小程序的环境下进行展示 3、什么是lottie动画 由Airbnb开发并开源。允许设计师将复杂的矢量动画导出为…

【单片机毕业设计选题24019】-基于STM32的安防监测灭火系统

系统功能: 1. 水泵喷水灭火功能&#xff1a;当火焰传感器监测到火焰时&#xff0c;蜂鸣器报警&#xff0c;水泵工作实现灭火。 2. 风扇功能&#xff1a;当烟雾传感器检测到CO或温度传感器检测到温度超过阈值时&#xff0c;蜂鸣器报警&#xff0c; 启动风扇进行驱散烟雾或降温…

Springboot + Mybatis 实现sql打印

参照这个视频&#xff1a;https://www.bilibili.com/video/BV1MS411N7mn/?vd_source90ebeef3261cec486646b6583e9f45f5 实现mybatis对外暴露的接口Interceptor 使用Intercepts接口,这里的写法参照mybatis-plus中的拦截器写法 Intercepts({Signature(type Executor.class, m…

MDK-ARM 编译后 MAP 文件分析

本文配合 STM32 堆栈空间分布 食用更佳&#xff01; 一图胜千言。。。

Java中setLineWrap(true)和setWrapStyleWord(true)优化TextArea

在 Java Swing 开发中&#xff0c;JTextArea 是一个多行的文本区域组件&#xff0c;常用于显示和编辑大量文本。当处理长文本时&#xff0c;默认行为是不换行并且出现水平滚动条&#xff0c;这通常会降低用户体验。幸运的是&#xff0c;JTextArea 提供了两个非常有用的方法&…

哈喽GPT-4o——对GPT-4o 提示词的思考与看法

目录 一、提示词二、常用的提示词案例1、写作助理2、改写为小红书风格3、英语翻译和改写4、论文式回答5、主题解构6、提问助手7、Nature风格润色8、结构总结9、编程助手10、充当终端/解释器 大家好&#xff0c;我是哪吒。 最近&#xff0c;ChatGPT在网络上广受欢迎&#xff0c…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 5G基站光纤连接问题(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

刘亦菲新剧玫瑰的故事

刘亦菲新剧《玫瑰的故事》&#xff1a;开放结局&#xff0c;无限遐想 当刘亦菲再次踏入荧屏&#xff0c;与导演汪俊携手打造的《玫瑰的故事》便引发了无数观众的期待与关注。这部剧不仅汇聚了众多实力派演员&#xff0c;更以其独特的剧情和精致的制作成为了近期热门的话题。《…

Python中文自然语言处理(NLP)中文分词工具库之pkuseg使用详解

概要 在中文自然语言处理(NLP)中,分词是一个基础且关键的任务。pkuseg 是由北京大学开发的一个中文分词工具,专为处理现代汉语而设计。它采用了先进的深度学习技术,能够准确地进行中文分词,同时支持自定义词典和多领域分词。本文将详细介绍 pkuseg 库,包括其安装方法、…