学了python不知干啥?爬爬虫!(7)代理的使用
合理爬取,不恶意扩大站点压力
本文章仅作示例,请勿用作非法用途
该系列的其他篇目:
系列文章合集目录
在Python爬虫过程中,常常会遇见因为各种原因被服务器拒绝访问的情况。有时候设置User-Agent能够解决问题,但如果遇到服务器校验ip访问次数来判断爬虫的情况,这样简单的做法就无能为力了。往往这种时候,采用代理ip间接访问能取得不错的成效。
那么,什么是代理呢?
本篇目录
- 代理
- 基本概念
- 分类
- 代理的选择
- 使用
- 获取代理ip
- 使用
- 验证
- 代码
- 参考资料
- 其他
代理
基本概念
让我们假想这样一个场景,你是一个广告员,负责给一个老奶奶打广告并获拿到她的反馈留言。老奶奶每天见到你很心烦,看见你多次来就不见你了。这时候你想到了另一个办法,你找到老奶奶的儿子孙子外甥侄子……把将自己的广告内容告诉他们,让他们跟老奶奶复述,然后由他们将得到的反馈结果告诉你,从而间接完成自己的目的。当这样的过程中发生在爬虫时,那些爬取过程中的“中间人”,就是代理。
分类
常见的HTTP代理分为三个类型,即透明代理IP、匿名代理IP、高匿名代理IP,它们的具体区别见下:
1)透明代理(Transparent Proxy):透明代理虽然可以直接“隐藏”客户端的 IP 地址,但是还是可以从来查到客户端的 IP 地址。
2)匿名代理(Anonymous Proxy):匿名代理能提供隐藏客户端 IP 地址的功能。使用匿名代理,服务器能知道客户端使用用了代理,当无法知道客户端真实 IP 地址。
3)高匿代理(Elite Proxy 或 High Anonymity Proxy):高匿代理既能让服务器不清楚客户端是否在使用代理,也能保证服务器获取不到客户端的真实 IP 地址。
代理的选择
普通匿名代理能隐藏客户机的真实 IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理。不过使用此种代理时,虽然被访问的网站不能知道客户端的 IP 地址,但仍然可以知道你在使用代理,当然某些能够侦测 IP 的网页仍然可以查到客户端的 IP。
而高度匿名代理不改变客户机的请求,这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理。
因此,爬虫程序需要使用到代理 IP 时,尽量选择普通匿名代理和高匿名代理。另外,如果要保证数据不被代理服务器知道,推荐使用 HTTPS 协议的代理。
上面的描述未免有些理论化,我们实际使用试一下吧~
使用
获取代理ip
在互联网搜索,有大量的服务商提供了代理服务。对于专业性较强、访问要求率较高的场景,建议选择收费服务;在这里只做演示,我们随意选择一家代理提供商的免费代理
打开页面,能看到如下代理ip列表
由于不是本篇重点,爬取此页面的代理列表对应过程省略,如果不太明白如何爬取,可以我参考之前的文章。
编写代码如下:
import requests
import redef get_html(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.57"}html = requests.get(url,headers=headers).textreturn htmldef get_ip_list(url):'''url 代理IP页面'''# 通用正则匹配的格式是 (IP,端口,地区) 地区有可能包含换行和空格ip_proxy_re = re.compile(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*</td>\s*<td>\s*(\d{1,})\s*</td>\s*<[^\u4E00-\u9FA5]+>([\u4E00-\u9FA5]*\s*[\u4E00-\u9FA5]*\s*[\u4E00-\u9FA5]*)\s*<')try:data = get_html(url)except:return []# 返回的IP 就是 正则匹配的结果(IP,端口,地区) 地区有可能包含换行和空格ip_list = ip_proxy_re.findall(data)return ip_list
上述代码运行的结果为:
输出的每一项结果包含 ip地址、端口、地区
使用
有了代理ip,接下来就是使用了。requests库提供了很方便的办法:仅需要在对应请求中加入 proxies 参数即可:
def get_with_ip(url:str,ip:str):"""带ip访问,其中ip形如 127.0.0.1:8080"""headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.57"}proxies = {"http":ip}return requests.get(url,headers=headers,proxies=proxies)
验证
如何才能知道是不是真的在用代理ip访问而不是自己的ip在访问呢?我们可以采取如下办法:
访问一个查看ip的网址,然后获取网址得到的访问ip,进行验证即可
编写代码如下。
代码
将上述过程结合起来,我们写出了下面的代码。代码首先获取ip列表,并在之后尝试使用这些ip访问网址。值得注意的是,因为获取到的免费代理不一定稳定,代码中添加了超时和错误处理
"""代理ip使用文章列表见 https://blog.csdn.net/qq_43596067/article/details/117003258请注意,由于代理ip质量和时效不稳定,此份代码不一定保证能够运行,请酌情修改@copyright : FunnySaltyFish@date : 2021/05/20 23:22:11
"""
import requests
import re
import pprintdef get_html(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.57"}html = requests.get(url,headers=headers).textreturn htmldef get_ip_list(url):'''url 代理IP页面'''# 通用正则匹配的格式是 (IP,端口,地区) 地区有可能包含换行和空格ip_proxy_re = re.compile(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s*</td>\s*<td>\s*(\d{1,})\s*</td>\s*<[^\u4E00-\u9FA5]+>([\u4E00-\u9FA5]*\s*[\u4E00-\u9FA5]*\s*[\u4E00-\u9FA5]*)\s*<')try:data = get_html(url)except Exception as e:print(f"获取ip列表时发生错误,原因是:{e}")return []# 返回的IP 就是 正则匹配的结果(IP,端口,地区) 地区有可能包含换行和空格ip_list = ip_proxy_re.findall(data)return ip_listdef get_with_ip(url:str,ip:str):"""带ip访问,其中ip形如 127.0.0.1:8080访问错误时返回"""""headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.57"}proxies = {"http":ip,"https":ip,}html = ""try:html = requests.get(url,headers=headers,proxies=proxies,timeout=10).textexcept Exception as e:print(f"访问错误!原因是:{e}")return htmldef validate(ip):html = get_with_ip("https://ip.tool.chinaz.com/",ip)if html == "": #访问错误return ""pattern = re.compile("域名(.+)的信息")match = pattern.search(html)if match is not None:return match.group(1)else:return ""if __name__ == "__main__":ip_list = get_ip_list("https://www.89ip.cn/1")print("获取到的ip列表为:")pprint.pprint(ip_list)for each in ip_list:ip = f"{each[0]}:{each[1]}" # 拼接ip和端口print(f"尝试使用ip[{ip}]访问……")shown_ip = validate(ip)if shown_ip != "":print(f"采用的ip地址是:{ip} 爬取后网站显示的ip地址是:{shown_ip}")
【请注意,由于代理ip质量和时效不稳定,此份代码不一定保证能够运行,请酌情修改】
下面是笔者测试时的运行情况:
–部分访问错误:
–部分访问成功
参考资料
- 爬虫所使用的的HTTP代理是什么?https://blog.csdn.net/yingpu618/article/details/107820814
其他
-我的github
学了python不知干啥?爬爬虫!(7)代理的使用相关推荐
- 学了python不知干啥?爬爬虫! (1)保存网络图片
生活就像淋浴:方向转错,水深火热 --意林 引言 各位玩python的,相比对"爬虫"这个字眼并不陌生.啥?你不知道?对啦,就是需要一个不知道的-- 那么,咱们的第一件事就是-- ...
- 学了python可以干嘛-学 Python 都用来干嘛的?
一.Python语言 /> Python是一种广泛使用的高级编程语言,属于通用型编程语言,是完全面向对象的语言.函数.模块.数字.字符串都是对象.经常被用于Web开发.GUI开发.操作系统.科学 ...
- 爬虫python可以干嘛_python爬虫可以用来做什么?
1.收集数据 python爬虫程序可用于收集数据.这也是最直接和最常用的方法.由于爬虫程序是一个程序,程序运行得非常快,不会因为重复的事情而感到疲倦,因此使用爬虫程序获取大量数据变得非常简单和快速. ...
- 学了python可以干嘛-学Python后到底能干什么?网友:我太难了
感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越老牌霸主Java,过去几年间Python一直都被寄予厚望.但是事实 ...
- 宁波学python_宁波多久能学会python(学了Python)
宁波多久能学会python,今日分享干货,宁波python培训是小编的优先推荐,详细解说关于在校学Python,Python发展历史,学了Python. 在校学Python 如果你是一名在校大学生,不 ...
- 爬虫python可以干嘛_学了Python可以用来干什么呢?
很多家长朋友可能会问,孩子学Python 可以用来干什么呢? 一般学Python可以往很多方面发展: 01 web应用开发 在国内,豆瓣一开始就使用Python作为web开发基础语言,知乎的整个架构也 ...
- 哪里可以接到python的活干-学了Python以后,我干了很多不是人干的活
在我们老家,有句老话是这么说的--"60岁学打拳".它描绘了这样一类人群的生活状态:退休后与其闲在家,不如多学点技能,一来可打发时间,二来可提高晚年的生活质量.于是,有些老人开始学 ...
- 学python可以干嘛-学完Python可以做什么?
原标题:学完Python可以做什么? 自动化运维几乎是Python应用的自留地,作为运维工程师首选的编程语言,Python在自动化运维方面已经深入人心,比如Saltstack和Ansible都是大名鼎 ...
- 路飞学城—Python爬虫实战密训班 第三章
路飞学城-Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫:- 定义调度器- 定 ...
最新文章
- mysql配置日志老化配置_mysql中日志的配置与分析
- c++ mysql 取出数据,c++从数据库的表中读取数据
- GitHub因“纳粹”评论遭解雇的犹太员工被复职,CEO公开致歉,开除他的HR走人...
- php video标签使用方法,HTML_HTML5 video标签(播放器)学习笔记(一):使用入门,近有在学习html5中video标签(播 - phpStudy...
- 递归--整数划分问题
- pycharm的中自定义库和关键字_Python“库”在树莓派中的应用解析
- [发布] 多选控件和时钟控件
- android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava
- 【数据库】SQL查询强化篇
- To install 64-bit ODBC drivers
- JS 继承各种方法的优劣比较 ----JS 学习笔记(五)
- 秋凉了,大家别加班了,早回吧:)
- matlab中的pzmap的意思,Matlab 学习
- 51单片机秒表设计c语言版,51单片机秒表系统的设计
- html仿excel冻结 css,如果做类似Excel 冻结首列的效果_html/css_WEB-ITnose
- 不是技术牛人,如何拿到国内IT巨头的Offer(未整理版本)
- 关闭Cortana小娜的几种方法(win10的搜索功能无法使用、黑屏/Cortana占用内存过高)
- 搜搜移动业务大厅项目类的结构_2020年SEM小搜投放指南:竞价小渠道如何把效果做到极致...
- NFS配置(RHCE考试题)
- 深入理解光电二极管恒流特性与电压电流检测电路原理