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

欢迎关注”生信修炼手册”!

通过用户代理我们可以将普通的爬虫程序伪装成浏览器,而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 requests
import random
import threading


# 获取代理IP
def 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函数即可。

·end·

—如果喜欢,快分享给你的朋友们吧—

原创不易,欢迎收藏,点赞,转发!生信知识浩瀚如海,在生信学习的道路上,让我们一起并肩作战!

本公众号深耕耘生信领域多年,具有丰富的数据分析经验,致力于提供真正有价值的数据分析服务,擅长个性化分析,欢迎有需要的老师和同学前来咨询。

  更多精彩

  写在最后

转发本文至朋友圈,后台私信截图即可加入生信交流群,和小伙伴一起学习交流。

扫描下方二维码,关注我们,解锁更多精彩内容!

一个只分享干货的

生信公众号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值