账号注册找回密码
  微信登录

奇瑰网社区

IP代理在网络爬虫中的应用

[复制链接]

44

主题

68

帖子

454

积分

中级会员

Rank: 3Rank: 3

G币
2
信用
2
体力
20
发表于 2020-11-19 16:55:34 | 显示全部楼层 |阅读模式
通过用户代理我们可以将普通的爬虫程序伪装成浏览器,而IP代理的作用则是用于突破目标服务器对同一IP访问频率的限制。
在网站的反爬虫策略中,限制IP访问频率是比较常见的措施。具体体现为,当我们的爬虫程序短时间内对服务器发起大量请求时,会出现访问限制或者IP被封禁的现象,此时无论是爬虫程序,还是通过浏览器访问,都无法访问到目标服务器。
为了突破这一限制,可以使用IP代理。IP是互联网中的门牌号,IP代理的作用就是将我们的爬虫程序伪装成不同的用户,这样就避免了对同一个用户访问频率的限制。在python中,通过urllib和requests这两个模块都实现IP代理。
1. urllib
代码如下
>>> proxy="http://119.8.44.244:8080">>> proxy_support=urllib.request.ProxyHandler({'http':proxy})>>> opener = urllib.request.build_opener(proxy_support)>>> urllib.request.install_opener(opener)>>> r = urllib.request.urlopen('http://icanhazip.com')>>> r.read()b'119.8.44.244\n'
2. requests
代码如下
>>> import requests>>> proxies = {'http': 'http://119.8.44.244:8080'}>>> r=requests.get("http://icanhazip.com", proxies=proxies)>>> r.text'119.8.44.244\n'
上述代码中的目标网站是一个检测IP的网站,当我们成功访问后,会显示对应的IP地址,从而帮助我们判断代理IP是否生效。
可以看到,相对于urllib,requests模块的代理IP使用起来更加简单。
在实际应用中,既有免费的代理IP,也有收费的代理IP。免费的代理IP需要我们从对应的网站上爬取IP列表,然后还需要自己检测代理IP的有效性,而通常情况下,免费的代理IP有效性都很低,所以更推荐使用收费的代理IP。
收费的代理IP会提供一个API借口,可以方便的嵌入程序中,通过API调用直接返回一系列可用的代理IP。
通过一个例子来看下代理IP的使用,代码如下
import requestsimport randomimport threading# 获取代理IPdef get_proxy():    ip_list = [        'http://197.231.196.44:42461',        'http://190.124.164.78:8080',        'http://87.117.169.23:48705',    ]    return random.choice(ip_list)# 下载单个网页def getHtml(url, proxy):    retry_count = 5    while retry_count > 0:        try:            html = requests.get(url, proxies= {'http':proxy})            return html        except Exception:            retry_count -= 1    return None# 每个线程的处理逻辑def download_html(ko, semaphore, proxy):    semaphore.acquire()    url = 'https://www.genome.jp/dbget-bin/www_bget?ko:{}'.format(ko)    out = './{}.kgml'.format(ko)    r = getHtml(url, proxy)    if r:        print('{} download success!'.format(ko))        with open(out, 'w') as fp:            fp.write(r.text)    else:      print('{} download failed!'.format(ko))    semaphore.release()if __name__ == '__main__':    ko_list = ['K{:05d}'.format(i) for i in range(1, 201)]    thread_list = []    semaphore = threading.BoundedSemaphore(100)    for cnt, ko in enumerate(ko_list):        if cnt % 10 == 0:            proxy = get_proxy()        p = threading.Thread(target = download_html, args = (ko, semaphore, proxy ))        p.start()        thread_list.append(p)            for thread in thread_list:        thread.join()
程序的作用是抓取KEGG Orthology的各个网页,通过多线程实现抓取,通过代理IP的使用,可以突破IP频率的限制。
需要注意,代理IP是有时效性的,代码中的IP是我在网上找到的免费代理IP, 当前测试是没问题的,但是过段时间代理IP失效之后,就没法成功运行了。
上述的代码只是用于启发式的思考,在实际使用中,用收费代理的API来实现get_proxy函数即可。番茄加速https://www.fanqieip.net/就是一款高匿稳定的代理IP工具。





上一篇:如何快速找出代理IP中的问题?
使用高级回帖 (可批量传图、插入视频等)

发表回复

您需要登录后才可以回帖 登录 | 账号注册   微信登录

本版积分规则   Ctrl + Enter 快速发布  

发帖时请遵守我国法律,网站会将有关你发帖内容、时间以及发帖IP地址等记录保留,只要接到合法请求,即会将信息提供给有关政府机构。
Powered by Discuz! X3.4 ( 粤ICP备20013252号-1  
Copyright © 2014-2020 奇瑰网 All Rights Reserved.
快速回复 返回顶部 返回列表