zoukankan      html  css  js  c++  java
  • 爬虫_python3_requests_2

    pip install requests
    

     

    进行简单的操作

    发送一个get请求

    # 发送请求
    import requests
    response = requests.get('http://httpbin.org/get')
    # 获取返回的html信息
    print(response.text)
    

    这样就发送了一个get请求,并且还打印了返回的内容,这个不再需要知道网页是哪个编码的,不过有时会出现编码问题,但是你也可以指定编码类型,如:

    response.encoding = 'utf-8'
    

     

     指定完成后就可以正常编码了,前提你得知道网页的编码类型。

    出了上面这些,我们还可以获取下面的信息

    print(response.headers)#获取头部信息
    # 请求状态码
    print(response.status_code)
    # 获取网页的二进制内容
    print(response.content)
    print(response.url) # 获取请求的url
    print(response.cookies) # 获取cookie
    

    是不是觉得很容易,一行代码就可以了。不再需要几步代码什么的了。

     

    接下来被反爬的话带上个请求头来进行请求

    # 还可以添加请求头进行请求
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
    response = requests.get('http://httpbin.org/get', headers=headers )
    print(response.headers)
    print(response.text)
    

     

     加个请求头也就是加个关键字参数而已

    还可以进行带参数的get请求

    # 进行带参数的get请求
    data = {'name': 'june', 'password': 123456}
    response = requests.get('http://httpbin.org/get', params=data)
    print(response.text)
    

     那如果需要登陆呢?post请求怎样发?告诉你,照样很简单

    # 进行post请求
    data = {'name': 'june', 'password': 123456}
    response = requests.post('http://httpbin.org/post', data=data, headers=headers)
    print(response.text)
    

    是不是很简单,也是加个data关键字参数,把要提交的登陆参数进行post上去。

     

    那除了上面的两个请求,还能进行别的请求吗?我可以非常开心地告诉你,可以的。比如,你要发个put请求,如这样

    requests.put()
    requests.delete()
    

    这个就是发送put请求和delete请求的,其他的请求也是这样发送,就不一 一说了。

    进行复杂点的请求

    在登陆的时候我们有时候需要输入验证码,那怎样输呢?爬虫的看不了网页,最简单的做法就是把这个验证码的图片下载下来然后手动输入,那么我们怎样下载呢?我们可以向这个图片的url发送请求,然后把返回内容以二进制方法存入文件里面就可以了。

    代码如下:

    # 从网上读取二进制数据,比如图片
    response = requests.get('https://www.baidu.com/img/bd_logo1.png', headers=headers)
    # 这个是直接获取字节码,这个是要保存的文件
    print(response.content)
    # 这个是获取解码后的返回内容,这个是乱码
    print(response.text)
    # 用文件来把图片下载下来
    with open('baidu.png', 'wb') as f: # 注意写的方式是以二进制方式写入
     f.write(response.content)
     print('下载完毕')
    

     

    还是很简单,不得不说,这个库太好用了。

    当我们需要上传文件的时候,比如图片,我们还可以用post方法把他发送出去 

    # 上传文件
    files = {'picture': open('baidu.png', 'rb')}
    response = requests.post('http://httpbin.org/post', files=files)
    print(response.text)
    

     获取cookie并简单处理一下

    # 获取cookie
    response = requests.get('https://www.baidu.com')
    for k, v in response.cookies.items():
     print(k, '=', v)
    

     当网页返回内容是json格式是,我们不需要用json库来解析,我们可以直接利用requests的方法进行解析,两者的效果是一样的

    # 解析json
    j = response.json() # 可以用json库来解析,结果一样
    

     在urllib库时保存登陆信息需要把cookie保存下来,但是在requests库里面,我们只需要用requests.session()来保存信息就可以了。

    # 用会话来保持登陆信息
    session = requests.session()
    response = session.get('http://httpbin.org/cookies/set/number/123456')
    print(response.text)
    

     这样就可以保存登陆了,不需要为cookie操心了,但是每次获取一个session就可以了,然后用来请求或者其他操作。不需要每次请求或者操作都创建一个sesion出来,这样是保存不了登陆信息的

    当一个网站不安全,需要你用证书验证的,比如这个网站

    这时要访问里面的网站内容,我们就需要进行验证,代码如下

    # 证书验证
    response = requests.get('https://www.12306.cn', verify=False) # 不加这个关键字参数的话会出现验证错误问题,因为这个网站的协议不被信任
    

     这样就可以进行访问了,但是会有一条警告

    E:anacondalibsite-packagesurllib3connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
     InsecureRequestWarning)
    

    觉得不美观的,我们还可以在请求时加个cert关键字参数,值为可信任的证书,为一个元组,写上账号和密码之类的,这里就不演示了

     

    遇到需要认证的网站,我们也可以这样

    from requests.auth import HTTPBasicAuth
    # 设置认证
    # requests.get('需要认证的网址', auth=HTTPBasicAuth('user', 'passwd')) # 由于找不到需要认证的网址,所以先写个主体
    # 还可以这样认证
    # requests.get('需要认证的网址', auth=('user', 'passwd')) # 这样就简单点
    

    由于我找不到需要认证的网站,所以就不演示了。

     

    requests还可以用代理ip来进行请求网站来防止ip被封以至于自己爬不了的尴尬。使用代理ip也比urllib库简单得多,代码如下:

    # 设置代理
    proxies = {'http': 'http://122.114.31.177:808',
     'https': 'https://119.28.223.103:8088'}
    # 在请求时添加上列代理
    response = requests.get('http://httpbin.org/get', proxies=proxies)
    print(response.text)
    

    上面的字典格式需要一 一对应,然后在请求时加上个关键字参数proxies就可以了。

     

     请求异常处理

     

    在程序运行时,遇到错误时程序就会被强行停止,如果想要继续运行,就需要进行捕捉异常来让程序继续运行。

     在requests库中有个处理异常的库requests.exceptions

     这里简单地处理下请求超时的处理情况

     

    import requests
    from requests.exceptions import ReadTimeout, ConnectTimeout, HTTPError, ConnectionError, RequestException
    # 捕捉异常
    try:
     response = requests.get('http://httpbin.org/get', timeout=0.1) # 规定时间内未响应就抛出异常
     print(response.text)
    except ReadTimeout as e:
     print('请求超时')
    except ConnectionError as e:
     print('连接失败')
    except RequestException as e:
     print('请求失败')
    

     

    这里捕捉了三个异常,因为ReadTimeout是ConnectionError的子类,所以先捕捉ReadTimeout,再捕捉父类的。而ConnectionError 和 RequestException 同理

     

    更多的异常处理可以查看文档哈 

     

     

     

     

     

     

     

     

  • 相关阅读:
    关于checkbox的一篇博客
    如何快速学习
    for循环下的取值问题
    vue的自动更新原理
    关于word-wrap的用法;
    2016年百度面试题
    编写代码的原则
    null和defined的区别
    js的模块化加载
    springmvc注解
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/8903979.html
Copyright © 2011-2022 走看看