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
    可以研究一下。

  • 相关阅读:
    Rebots协议是什么?
    Requests库入门
    jieba库的使用及实例
    第六周 python组合数据类型
    python 有基础入门程序
    字符与字符串操作归纳[持续更新]
    C++调用bat并实现传值
    Python如何运行程序
    Execl数据上传到数据库
    xml 文件操作
  • 原文地址:https://www.cnblogs.com/jessicor/p/11890567.html
Copyright © 2011-2022 走看看