Python 爬虫的代理 IP 设置方法汇总
目录
Requests
▌不使用代理
首先,先来看一下不使用代理 IP 的情况:
运行上面的程序,会返回我们电脑本机的 IP,可以通过百度查询 IP 地址对比一下就知道了。
▌使用代理
然后,我们测试一下使用代理后的情况。
常见的代理包括 HTTP 代理和 SOCKS5 代理,前者可以找一些免费代理 IP 进行测试,由于我电脑上使用的是 Shadowsocks,所以就介绍一下 SOCKS5 代理的设置。
首先,电脑上要安装有 Shadowsocks
启动该软件后默认会在 1080 端口下创建 SOCKS5 代理服务,代理为:127.0.0.1:1080,然后我们在 Requests 中使用该代理,方法很简单只需要添加一项 proxies 参数即可:
这里,proxies 参数是字典类型,键名http表示协议类型,键值socks5://127.0.0.1:1080表示代理,这里添加了 http 和 https 两个代理,这样写是因为有些网页采用 http 协议,有的则是采用 https 协议,为了在这两类网页上都能顺利使用代理,所以一般都同时写上,当然,如果确定了某网页的请求类型,可以只写一种,比如这里我们请求的 url 使用的是 http 协议,那么使用 http 代理就可以,random 函数用来随机选择一个代理,我们来看一下结果:
可以看到,这里随机选择了 http 协议的代理后,返回的 IP 就是我真实的 IP 代理地址,成功代理后就可以爬一些墙外的网页了。
延伸一下,假如随机选择的是 https 代理,那么返回的 IP 结果还一样么?我们尝试重复运行一下上面的程序:
可以看到这次使用了 https 代理,返回的 IP 却是本机的真实 IP,也就是说代理没有起作用。
进一步地,我们将 url 改为 https 协议 ,然后再尝试分别用 http 和 https 代理请求,查看一下结果:
可以看到,两种请求的结果和之前的刚好相反了,由于 url 采用了 https 协议,则起作用的是 https 代理,而 http 代理则不起作用了,所以显示的是本机 IP。
因此,可以得到这样的一个结论:
HTTP 代理,只代理 HTTP 网站,对于 HTTPS 的网站不起作用,也就是说,用的是本机 IP。
HTTPS 代理则同理。
▌使用付费代理
上面,我们只使用了一个代理,而在爬虫中往往需要使用多个代理,那有如何构造呢,这里主要两种方法,一种是使用免费的多个 IP,一种是使用付费的 IP 代理,免费的 IP 往往效果不好,那么可以搭建 IP 代理池,但对新手来说搞一个 IP 代理池成本太高,如果只是个人平时玩玩爬虫,完全可以考虑付费 IP,几块钱买个几小时动态 IP,多数情况下都足够爬一个网站了。
这里推荐一款适合爬虫的代理IP——代理云,遍及全国200多个城市,千万级IP池,24小时自动去重,IP可用率超越95%,稳定、高效、高匿,具有强大的技术团队,7*24处理运用中的问题,现在注册还能免费领取一万代理IP
代理云 - 可视化用户控制台console.v4.dailiyun.com/user/?channel=wyh-zhScrapy
▌middlewares.py 中设置
这种方法需要先在 middlewares.py 中设置代理 IP 中间件:
然后,我们仍然以 “http://icanhazip.com"为目标网页,运行 Scrapy 项目重复请求 5 次,查看一下每次返回的 IP 情况:
▌使用 scrapy-proxies 库代理
除了上述两种方法,我们还可以使用 GitHub 上的一个 IP 代理库:scrapy-proxies,库的使用方法很简单, 三个步骤就可以开启代理 IP。
首先,运行下面命令安装好这个库:
然后,在 Scrapy 项目中的 settings.py 文件中,添加下面一段代码:
最后,需要提供多个代理 IP,我们在西刺上随便找几个 IP,然后存放在 PROXY_LIST 指定的 txt 文件中即可,格式如下:
然后重复之前的操作,查看代理 IP 的设置效果。
我在使用该库的过程中,发现有一些问题,不知道是配置不对还是怎么回事,效果不是太好,所以推荐使用前两种方法。
好,以上就是在 Requests 和 Scrapy 中使用代理 IP 的方法总结,如果爬虫项目不大、追求稳定且不差钱的话,建议直接上付费代理。