美文网首页
requests深入

requests深入

作者: 无心文先森 | 来源:发表于2020-04-27 13:12 被阅读0次

    代理

    • 浏览器 --> 服务器
    • 反向代理:浏览器 --> nginx --> 服务器
    • 正向代理:浏览器 --> 代理 --> 服务器

    问题:为什么爬虫需要使用代理?

    • 让服务器以为不是同一个客户端在请求
    • 防止我们的真实地址被泄露,防止被追究

    使用代理IP

    • 准备一堆的ip地址,组成IP池,随机选择一个IP来使用
    • 如何随机选择代理IP,让使用次数较少的IP地址有更大的可能性被用到
    • {'ip':ip,'times':0}
    • [{},{}]对这个IP的列表进行排序,按照使用次数进行排序
    • 选择使用次数较少的10个IP,从中随机选择一个
    • 检查IP的可用性
    • 可以使用requests添加超市参数,判断IP地址的质量
    • 在线代理IP质量检测的网站
    import requests
    # 根据协议类型,选择不同的代理
    proxies = {
     "http": "http://12.34.56.79:9527",
     "https": "http://12.34.56.79:9527",
    }
    response = requests.get("http://www.baidu.com", proxies = proxies)
    print response.text
    
    • 也可以通过本地环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理
      export HTTP_PROXY="http://12.34.56.79:9527"
      export HTTPS_PROXY="https://12.34.56.79:9527"

    cookie和session区别

    • cookie数据存放在客户的浏览器上,session数据放在服务器上。
    • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
    • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
    • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

    爬虫处理cookie和session

    • 带上cookie、session的好处:
      能够请求到登录之后的页面
    • 带上cookie、session的弊端:
      一套cookie和session往往和一个用户对应请求太快,请求次数太多,容易被服务器识别为爬虫
    • 不需要cookie的时候尽量不去使用cookie,但是为了获取登录之后的页面,我们必须发送带有cookies的请求

    处理cookies 、session请求

    requests 提供了一个叫做session类,来实现客户端和服务端的会话保持

    Cookies

    import requests
    response = requests.get("http://www.baidu.com/")
    # 7\. 返回CookieJar对象:
    cookiejar = response.cookies
    # 8\. 将CookieJar转为字典:
    cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
    print (cookiejar)
    print (cookiedict)
    

    session

    请求登陆之后的网站的思路

    • 实例化session
    • 先使用session发送请求,登录网站,把cookie保存在session中
    • 再使用session请求登录之后才能访问网站,session能够自动的携带登录成功时保存在其中的cookie,进行请求

    实现人人网登录

    import requests
    # 1.创建session对象,可以保存Cookie值
    ssion = requests.session()
    # 2.处理 headers
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    # 3.需要登录的用户名和密码
    data = {"email":"mr_mao_hacker@163.com", "password":"alarmchime"}  
    # 4.发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
    ssion.post("http://www.renren.com/PLogin.do", data = data)
    # 5.ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
    response = ssion.get("http://www.renren.com/410043129/profile")
    # 6.打印响应内容
    print (response.text)
    

    Requests小技巧

    • reqeusts.util.dict_from_cookiejar 把cookie对象转化为字典
      requests.get(url,cookies={})
    • 请求 SSL证书验证
      response = requests.get("https://www.12306.cn/mormhweb/ ", verify=False)
    • 设置超时
      response = requests.get(url,timeout=10)
    • 配合状态码判断是否请求成功
      assert response.status_code == 200

    异常重试

    • pip install retrying
      from retrying import retry
      @retry(stop_max_attempt_number=3)
      #只使用@retry,则会一直不停运行
      #stop_max_attempt_number最大运行次数
      #stop_max_delay 设置失败重试的最大时间, 单位毫秒,超出时间,则停止重试
      #wait_fixed 设置失败重试的间隔时间
      #wait_random_min, wait_random_max 设置失败重试随机性间隔时间
      #wait_exponential_multiplier-间隔时间倍数增加,wait_exponential_max-最大间隔时间
      #retry_on_exception:指定异常类型,指定的异常类型会重试,不指定的类型,会直接异常退出
      def index():
          print(1/0)
      

    相关文章

      网友评论

          本文标题:requests深入

          本文链接:https://www.haomeiwen.com/subject/gveywhtx.html