首先要知道什么情况下需要使用代理
正如第一节讲到了一些反爬策略,有些网站不希望被频繁爬取。如果咱们的爬虫程序被监测到(访问频率或者访问次数过大),那么爬虫程序相应的IP就会被网站封掉。一旦IP被封那就意味着一段时间内无法运行爬虫程序了。
该如何解决这一问题呢?
这个时候就需要用代理IP了,它能够帮助我们隐藏自己真实IP的同时也可以连续不断的运行爬虫程序,不用担心IP被封。
什么是代理IP:代理服务器可以理解成一个中转站。介于浏览器和服务器中间的一台服务器,Requests会将请求先发送到代理服务器中,然后代理服务器获取Web服务器返回的数据再传递给浏览器
提供代理IP的网站有哪些?
代理IP有免费的和收费的。相比之前收费的更加稳定和可靠,当然也有一些免费的代理,不过总体上来讲质量就比较低,如果只是个人学习使用,直接白嫖免费的就可以了。
常用的代理网站有
-
快代理(https://www.kuaidaili.com/free/inha/) -
goubanjia(http://www.goubanjia.com/)
代理的匿名度区别:
-
透明:目标服务器知道该请求使用了代理,同时也知道使用代理的真实IP -
匿名:目标服务器知道使用了代理,但是不知道真实IP -
高匿:目标服务器不知道使用了代理,更不知道真实IP
如何使用代理
我们在百度中搜索ip
,就是现实我们电脑的ip并且显示对应的地址
所以我们可以通过爬虫获取这个页面,来判断代理是否生效
在requests中加入代理的方式也很简单,只需要设置proxies参数即可。
免费的ip,高匿的试了好多没有能用的。最后斥巨资5元买了6个小时的代理。
requests
# 代理IP
proxies = {
'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 = 'https://www.baidu.com/s?wd=ip'
response = 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文档即可
https://github.com/Python3WebSpider/ProxyPool
在执行爬虫程序时,可以通过以下方法从代理池中获取代理IP
requests
proxypool_url = 'http://127.0.0.1:5555/random'
target_url = 'http://httpbin.org/get'
def 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).text
def 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()
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
内容反馈