zoukankan      html  css  js  c++  java
  • python爬虫防止IP被封的一些措施

    在编写爬虫爬取数据的时候,因为很多网站都有反爬虫措施,所以很容易被封IP,就不能继续爬了。在爬取大数据量的数据时更是瑟瑟发抖,时刻担心着下一秒IP可能就被封了。

    本文就如何解决这个问题总结出一些应对措施,这些措施可以单独使用,也可以同时使用,效果更好。

    伪造User-Agent

    在请求头中把User-Agent设置成浏览器中的User-Agent,来伪造浏览器访问。比如:

    1.  
      headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
    2.  
      resp = requests.get(url,headers = headers)

    还可以先收集多种浏览器的User-Agent,每次发起请求时随机从中选一个使用,可以进一步提高安全性:

    1.  
      In [7]: import requests,random
    2.  
       
    3.  
      In [8]: user_agents = ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11']
    4.  
       
    5.  
      In [9]: def get_html(url):
    6.  
         ...:     headers = {'User-Agent':random.choice(user_agents)}
    7.  
         ...:     resp = requests.get(url,headers = headers)
    8.  
         ...:     return resp.text

    把上面随机选择一个User-Agent的代码封装成一个函数:

    1.  
      import random
    2.  
      def get_headers():
    3.  
          '''
    4.  
          随机获取一个headers
    5.  
          '''
    6.  
          user_agents =  ['Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50','Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11']
    7.  
          headers = {'User-Agent':random.choice(user_agents)}
    8.  
          return headers

    注:一些常见浏览器的User-Agent可参见:https://blog.csdn.net/qianxing111/article/details/79415857

    在每次重复爬取之间设置一个随机时间间隔

    1.  
      比如:
    2.  
      time.sleep(random.randint(0,3))  # 暂停0~3秒的整数秒,时间区间:[0,3]
    3.  
      或:
    4.  
      time.sleep(random.random())  # 暂停0~1秒,时间区间:[0,1)

    伪造cookies

    若从浏览器中可以正常访问一个页面,则可以将浏览器中的cookies复制过来使用,比如:

    1.  
      cookies = dict(uuid='b18f0e70-8705-470d-bc4b-09a8da617e15',UM_distinctid='15d188be71d50-013c49b12ec14a-3f73035d-100200-15d188be71ffd')
    2.  
      resp = requests.get(url,cookies = cookies)
    3.  
      # 把浏览器的cookies字符串转成字典
    4.  
      def cookies2dict(cookies):
    5.  
          items = cookies.split(';')
    6.  
          d = {}
    7.  
          for item in items:
    8.  
              kv = item.split('=',1)
    9.  
              k = kv[0]
    10.  
              v = kv[1]
    11.  
              d[k] = v
    12.  
          return d

    注:用浏览器cookies发起请求后,如果请求频率过于频繁仍会被封IP,这时可以在浏览器上进行相应的手工验证(比如点击验证图片等),然后就可以继续正常使用该cookies发起请求。

    使用代理

    可以换着用多个代理IP来进行访问,防止同一个IP发起过多请求而被封IP,比如:

    1.  
      proxies = {'http':'http://10.10.10.10:8765','https':'https://10.10.10.10:8765'}
    2.  
      resp = requests.get(url,proxies = proxies)
    3.  
      # 注:免费的代理IP可以在这个网站上获取:http://www.xicidaili.com/nn/

    附:GitHub上的一个"反反爬虫"项目

    道高一尺魔高一丈,你有反爬虫措施,那我也有各种"反反爬虫"的措施,GitHub上就有一位大神专门整理了一个这样的项目:Anti-Anti-Spider,链接地址为:
    https://github.com/luyishisi/Anti-Anti-Spider
    可以研究一下。

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/jessicor/p/11890567.html
Copyright © 2011-2022 走看看