zoukankan      html  css  js  c++  java
  • Python爬虫requests请求库

    requests:pip install  request 安装

    实例:

    import requests
    url = 'http://www.baidu.com'
    response = requests.get(url=url)
    print(type(response)) #请求类型
    print(response.status_code) #网站响应状态码
    print(type(response.text)) #网站内容类型
    print(response.text) #网站内容
    print(response.cookies) #网站cookies


    requests.post()
    requests.get()
    requests.put()
    requests.delete()
    requests.head()
    requests.options() #requests可以直接实现各种请求,比urllib方便很多




    基本实例
    构建一个最简单的get请求,链接为 http://httpbin.org/get
    import requests
    r = requests.get('http://httpbin.org/get')
    print(r.text)
    传参
    import requests
    data = {
      'name':'germey',
      'age':'18'

    r = requests.get('http://httpbin.org/get',dat=data)
    print(r.text)

    转换数据类型
    import requests
    r = requests.get('http://httpbin.org/get')
    print(type(r.text)) #打印出类型是json格式的字符串
    pritn(r.json) #将返回结果是json格式的字符串转化为字典,如果返回结果不是json,便会出现解析错误,抛出json.decoder.JSONDecodeError异常
    print(type(r.json())) #打印出类型是字典

    抓取网页
    import requests

    headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    }


    r.requests.get(url='www.zhihu.come/explpre',headers=headers)
    #这里加入headers请求头,其中包括user-agent字段信息,也就是浏览器标识信息,如果不加,知乎会禁止抓取

    抓取二进制数据
    #图片、视频、音频这些文件本质是由二进制码组成,犹豫有特定的保存格式和对应的解析方式,我们才可以看到这些 形形色色的媒体,如果抓取他们,就要拿到他们的二进制码
    import requests
    r = requests.get(url='https://github.com/favicon.ico')
    print(r.text) #text结果出现乱码
    print(r.content) #结果前带个B,代表是bytes类型数据,由于图片是二进制数据,打印时候转化为str类型,图片直接存为字符串,当然会出现乱码

    #将提取的图片保存下来
    with open('favicon.ico','wb') as f:
      f.write(r.content)
    #这里用了open方法,第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件写入二进制数据



    POST请求
    import requests
    data = {'name':'germey','age':'22'}
    r = requests.post(url='http://httpbin.org/post',data=data)
    print(r.text) #可以发现获得返回结果,其中form部分就是提交的数据

    响应
    import requests

    r = requests.get(url='http://www.jianshu.com')
    print(type(r.status_code),r.status_code) #响应状态码类型以及状态码
    print(type(r.headers),r.headers)       #请求头的类型以及打印请求头
    print(type(r.cookies),r.cookies)       #cookies的类型以及打印cookies
    print(type(r.url),r.url) #url类型以及打印url
    print(type(r.history),r.history)       #history


    文件上传

    requests 可以模拟提交一些数据,如果一些网站需要上传文件
    import requests
    files = {'file':open('favicon.ico','rb')} #文件需要与当前脚本在同一目录下
    r = requests.get('http://httpbin.org/post',files=fiels)



    Cookies
    import requests
    r = requests.get('http://www.baidu.com')
    pritn(r.cookies) #调用cookies属性得到cookies,可以发现是RequestCookieJar类型
    for key.value in r.cookies.items(): #使用items()方将其转化为远足组成的列表,遍历输出每个cookies的名称和值
      print(key + '=' + vlaue)


    会话维持

    在requests中,直接利用get和post等方法可以做到模拟网页的请求,但是这实际是相当于不相同的会话,也就是说相当于你用两个浏览器打开不同的页面
    设想这样一个场景,第一个请求用post方法登录的某个网站,第二次想获取登录后的个人信息,你又用了一次get方法请求个人信息页面,这相当于打开两个
    浏览器,两个不相干的会话,不能获取到个人信息,如果两个请求设置同样的cookies可以获取到,但是有些繁琐,可以有更简单的方法

    import requests
    s = requests.Session()
    s.get('http://httpbin.org/cookies/set/number/123456789') #请求测试网址时设置一个cookies,名字叫做number,内容是123456789
    r = s.get('http://httpbin.org/cookies/') #随后请求这个网址,可以网址可以获取当前的cookies
    print(r.text)



    SSL证书验证
    requests提供了证书验证功能,当发送HTTP请求时,会检查SSL证书,我们可以使用verify参数控制是否检查此证书,如果不加verify参数的话
    默认是True,会自动验证


    import requests
    response = requests.get('http://www.12306.cn')
    pritn(response.status_code) #这样会提示一个错误SLLError表示证书验证错误
    --------------------------------
    response = requests.get('http://www.12306.cn',verify=False)
    pritn(response.status_code) #这样就会打印一个请求成功的状态码

    不过我们发现了一个警告,简易我们给它指定证书,我们可以通过设置忽略警告的方式来屏蔽这个警告
    import requests
    from requests.packages import urllib3
    urllib3.disable_warnings()
    response = requests.get('https://www.12306.cn',verify=Falsh)
    print(response.status_code)

    或者通过捕获警告到日志的方式忽略警告:

    import logging
    import requests
    logging.CaptureWarnings(True)
    response = requests.get('https://www.12306.cn',verify=False)
    pritn(response.status_code)

    我们也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或者一个包含两个文件路径的元祖
    import requests
    response = requests.get('https://www.12306.cn',cert=('/path/server.crt',/path/key)) #我们需要有crt和key文件,并且指定他们的路径
                                                      #本地私有证书key必须是解密状态
    pritn(response.status_code)


     
    代理设置
    某些网站,请求频繁的时候,网站会弹出验证码,跳转到登录认证页面,或者封禁IP,导致一定时间内无法访问
    为了防止这样的情况,我们可以设置代理IP ,使用proxies

    import requests
    proxies = {
        'http':'http://10.10.1.10:3128', #这个代理是无效的
        'https':'http://10.10.1.10:3128'         #需要换成我们有效的代理IP
      }
    requests.get('https://www.taobao.com',proxies=proxies)

    若代理需要使用 HTTP Basic Auth,可以使用类似 http://user:password@host:post 这样的语法来设置代理
    import requests
    proxies = {
      'http':'http://user:password@10.10.1.10:3128'
    }
    requests.get('https://www.taobao.com',proxies=proxies)

    除了最基本的HTTP代理之外,requests还支持socks协议的代理
    import requests
    proxies = {
       'http':'socks5://user:password@host:port',
       'https':'socks5://user:password@host:port'
    }
    requests.get('https://www.taobao.com',proxies=proxies)

    超时设置
    在本机网络状况不好或者服务器网络响应太慢甚至无响应时,我们可能会等特别久的时间才能收到响应,甚至到最后收不到响应而报错。
    为了防止服务器不能及时响应,应该设置一个超时设置,即超过这个时间还没收到响应,就报错,需要用到timeout参数

    import requests
    response = requests.get('https://www.taobao.com',timeout=1) #超时时间设置为1秒,如果1秒没有响应,那就抛出异常


    实际上,请求分为两个阶段,即连接(connect)和读取(read),上面设置的timeout将作用于这二者的timeout总和
    如果要分别指定,就可以传入一个元组
    r= requests.get('https://www.taobao.com',timeout(5,30)) #如果想永久等待,就设置为None或者直接留空,默认是None

    身份验证
    访问网站时没如果遇到认证页面, 需要进行身份验证(用户名和密码),此时就可以使用requests自带的身份认证功能
    import requests
    from requests.auth import HTTPBasicAuth
    r = requests.get('http://localhost:5000',auth=HttpBasicAuth('username','password'))
    pritn(r.status.code)

    #如果用户名和密码正确,请求时就会认证成功,返回200状态码,如果认证失败,则返回401状态码
    #如果每个参数都传一个HTTPBasicAuth类,显得有些繁琐,所以requests可以直接传递远足,它会默认使用HTTPBasicAuth方法

    import requests
    r= r.requests.get('http://localhost:5000',auth('username','password'))
    pritn(r.status_code)















    just do it .
  • 相关阅读:
    SVN的具体使用方法介绍(安装以及操作)
    谈谈敏捷开发
    008.MVC与数据库的交互
    001.MVC基本概述
    WebApi接口测试工具
    014.存储过程(sql实例)
    我们为什么需要DTO(数据传输对象)
    ASP.NET使用WebApi接口实现与Android客户端的交互(图片或字符串的接收与回传)
    面试题库[2]
    关于单例模式getInstance()的使用
  • 原文地址:https://www.cnblogs.com/Mickey-7/p/10289690.html
Copyright © 2011-2022 走看看