合理爬取,不恶意扩大站点压力
本文章仅作示例,请勿用作非法用途

该系列的其他篇目:

系列文章合集目录


在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)代理的使用相关推荐

  1. 学了python不知干啥?爬爬虫! (1)保存网络图片

    生活就像淋浴:方向转错,水深火热 --意林 引言 各位玩python的,相比对"爬虫"这个字眼并不陌生.啥?你不知道?对啦,就是需要一个不知道的-- 那么,咱们的第一件事就是-- ...

  2. 学了python可以干嘛-学 Python 都用来干嘛的?

    一.Python语言 /> Python是一种广泛使用的高级编程语言,属于通用型编程语言,是完全面向对象的语言.函数.模块.数字.字符串都是对象.经常被用于Web开发.GUI开发.操作系统.科学 ...

  3. 爬虫python可以干嘛_python爬虫可以用来做什么?

    1.收集数据 python爬虫程序可用于收集数据.这也是最直接和最常用的方法.由于爬虫程序是一个程序,程序运行得非常快,不会因为重复的事情而感到疲倦,因此使用爬虫程序获取大量数据变得非常简单和快速. ...

  4. 学了python可以干嘛-学Python后到底能干什么?网友:我太难了

    感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越老牌霸主Java,过去几年间Python一直都被寄予厚望.但是事实 ...

  5. 宁波学python_宁波多久能学会python(学了Python)

    宁波多久能学会python,今日分享干货,宁波python培训是小编的优先推荐,详细解说关于在校学Python,Python发展历史,学了Python. 在校学Python 如果你是一名在校大学生,不 ...

  6. 爬虫python可以干嘛_学了Python可以用来干什么呢?

    很多家长朋友可能会问,孩子学Python 可以用来干什么呢? 一般学Python可以往很多方面发展: 01 web应用开发 在国内,豆瓣一开始就使用Python作为web开发基础语言,知乎的整个架构也 ...

  7. 哪里可以接到python的活干-学了Python以后,我干了很多不是人干的活

    在我们老家,有句老话是这么说的--"60岁学打拳".它描绘了这样一类人群的生活状态:退休后与其闲在家,不如多学点技能,一来可打发时间,二来可提高晚年的生活质量.于是,有些老人开始学 ...

  8. 学python可以干嘛-学完Python可以做什么?

    原标题:学完Python可以做什么? 自动化运维几乎是Python应用的自留地,作为运维工程师首选的编程语言,Python在自动化运维方面已经深入人心,比如Saltstack和Ansible都是大名鼎 ...

  9. 路飞学城—Python爬虫实战密训班 第三章

    路飞学城-Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫:- 定义调度器- 定 ...

最新文章

  1. mysql配置日志老化配置_mysql中日志的配置与分析
  2. c++ mysql 取出数据,c++从数据库的表中读取数据
  3. GitHub因“纳粹”评论遭解雇的犹太员工被复职,CEO公开致歉,开除他的HR走人...
  4. php video标签使用方法,HTML_HTML5 video标签(播放器)学习笔记(一):使用入门,近有在学习html5中video标签(播 - phpStudy...
  5. 递归--整数划分问题
  6. pycharm的中自定义库和关键字_Python“库”在树莓派中的应用解析
  7. [发布] 多选控件和时钟控件
  8. android retrofit2.0 rxjava2,Android - 网络请求之 Retrofit2 + RxJava
  9. 【数据库】SQL查询强化篇
  10. To install 64-bit ODBC drivers
  11. JS 继承各种方法的优劣比较 ----JS 学习笔记(五)
  12. 秋凉了,大家别加班了,早回吧:)
  13. matlab中的pzmap的意思,Matlab 学习
  14. 51单片机秒表设计c语言版,51单片机秒表系统的设计
  15. html仿excel冻结 css,如果做类似Excel 冻结首列的效果_html/css_WEB-ITnose
  16. 不是技术牛人,如何拿到国内IT巨头的Offer(未整理版本)
  17. 关闭Cortana小娜的几种方法(win10的搜索功能无法使用、黑屏/Cortana占用内存过高)
  18. 搜搜移动业务大厅项目类的结构_2020年SEM小搜投放指南:竞价小渠道如何把效果做到极致...
  19. NFS配置(RHCE考试题)
  20. 深入理解光电二极管恒流特性与电压电流检测电路原理

热门文章

  1. 如何利用ArcGIS绘制国界线/省界线
  2. 点赞黄文仔董事长,为偏远地区教育助力
  3. 护眼灯到底有没有用?盘点护眼灯的用处
  4. Android解锁黑屏问题完美解决!
  5. 通用计算机指令,单一指令计算机
  6. mysql的 深度使用 - 游标 , 定时器, 触发器 的使用 ?
  7. mg常用的语句 增删改查
  8. ArcGis空间分析学习:土地利用动态变化分析
  9. 利用MATLAB中 MuPADNotebook组件将程序语言表达式转为数学表达式
  10. (给自己看)51单片机DS1302时钟芯片