爬虫系列_8、Python爬虫中的代理与代理池

首先要知道什么情况下需要使用代理

正如第一节讲到了一些反爬策略,有些网站不希望被频繁爬取。如果咱们的爬虫程序被监测到(访问频率或者访问次数过大),那么爬虫程序相应的IP就会被网站封掉。一旦IP被封那就意味着一段时间内无法运行爬虫程序了。

该如何解决这一问题呢?

这个时候就需要用代理IP了,它能够帮助我们隐藏自己真实IP的同时也可以连续不断的运行爬虫程序,不用担心IP被封。

什么是代理IP:代理服务器可以理解成一个中转站。介于浏览器和服务器中间的一台服务器,Requests会将请求先发送到代理服务器中,然后代理服务器获取Web服务器返回的数据再传递给浏览器

提供代理IP的网站有哪些?

代理IP有免费的和收费的。相比之前收费的更加稳定和可靠,当然也有一些免费的代理,不过总体上来讲质量就比较低,如果只是个人学习使用,直接白嫖免费的就可以了。

常用的代理网站有

快代理()goubanjia()

代理的匿名度区别:

透明:目标服务器知道该请求使用了代理,同时也知道使用代理的真实IP匿名:目标服务器知道使用了代理,但是不知道真实IP高匿:目标服务器不知道使用了代理,更不知道真实IP如何使用代理

我们在百度中搜索ip,就是现实我们电脑的ip并且显示对应的地址

所以我们可以通过爬虫获取这个页面,来判断代理是否生效

在requests中加入代理的方式也很简单,只需要设置proxies参数即可。

免费的ip,高匿的试了好多没有能用的。最后斥巨资5元买了6个小时的代理。

import requests# 代理IPproxies = {    https: 117.69.99.20:20138,    http: 125.116.31.85:45002}headers = {    User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36}url = ?wd=ipresponse = requests.get(url, headers=headers, proxies=proxies)with open(proxy.html, w, encoding=utf-8) as f:    f.write(response.text)

执行之后,打开生成的HTML文件。发现此时检测到的IP就是我们代码中用的代理IP

代理池

为了方便爬虫代理IP的频繁切换,我们需要维护一批代理功我们使用,也就是代理池。

我们可以选择自己维护一个免费的代理池

采集网络上发布的免费代理。对代理定时进行验证,保证可用性持久化存储

付费购买的代理,每次或者间隔一小段时间之后,重新获取代理进行爬取即可。一般付费购买的都有相应的开发文档供大家进行参考

在GitHub上有这样一个开源项目ProxyPool,为我们提供了一个简易高效的代理池。

简易高效的代理池,提供如下功能:

定时抓取免费代理网站,简易可扩展。使用 Redis 对代理进行存储并对代理可用性进行排序。定时测试和筛选,剔除不可用代理,留下可用代理。提供代理 API,随机取用测试通过的可用代理。

关于如何运行和启动项目,大家直接看readme文档即可

在执行爬虫程序时,可以通过以下方法从代理池中获取代理IP

import requestsproxypool_url = :5555/randomtarget_url = http://httpbin.org/getdef get_random_proxy():    """    get random proxy from proxypool    :return: proxy    """    return requests.get(proxypool_url).text.strip()def crawl(url, proxy):    """    use proxy to crawl page    :param url: page url    :param proxy: proxy, such as 8.8.8.8:8888    :return: html    """    proxies = {http: http:// + proxy}    return requests.get(url, proxies=proxies).textdef main():    """    main method, entry point    :return: none    """    proxy = get_random_proxy()    print(get random proxy, proxy)    html = crawl(target_url, proxy)    print(html)if __name__ == __main__:    main()

历史爬虫系列:

爬虫系列 | 1、什么是爬虫,玩爬虫的正确姿势有哪些爬虫系列 | 2、Http请求和响应,写爬虫这些内容必须掌握爬虫系列 | 3、谷歌浏览器的基本使用爬虫系列 | 4、详解Requests的用法爬虫系列 | 5、详解爬虫中正则的用法爬虫系列 | 6、详解爬虫中BeautifulSoup4的用法

爬虫系列 | 7、详解爬虫中Xpath的用法