zoukankan      html  css  js  c++  java
  • 爬虫----基础

     request模块:

    更多文档:http://cn.python-requests.org/zh_CN/latest/

    安装

    pip install requests
    

    使用

    import requests
    
    response=requests.get("https://movie.douban.com/cinema/nowplaying/beijing/")
    
    参数
    print(response.content) # 字节数据 print(response.text) # 字符数据 print(type(response)) # <class 'requests.models.Response'> print(response.status_code) # 200 print(response.encoding) # utf-8 print(response.cookies) # <RequestsCookieJar[<Cookie bid=YwWqpRG7Z_E for .douban.com/>]>

     

     GET请求:

    如果想请求JSON文件,可以利用 json() 方法解析

    response=requests.get("https://github.com/timeline.json")
    
    print(response.text)
    print(response.json().get("message"))
    

    原始响应内容

    如果想获取来自服务器的原始套接字响应,可以取得 r.raw 。 不过需要在初始请求中设置 stream=True 。

    >>> r = requests.get('https://github.com/timeline.json', stream=True)
    >>> r.raw
    <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
    >>> r.raw.read(10)
    'x1fx8bx08x00x00x00x00x00x00x03'
    

    但一般情况下,你应该以下面的模式将文本流保存到文件:

    with open(filename, 'wb') as fd:
        for chunk in r.iter_content(chunk_size):
            fd.write(chunk) 

    定制请求头

    headers={"Content-Type":"application/json"}
    data={"username":"yuan"}
    response=requests.get("https://movie.douban.com/cinema/nowplaying/beijing/",params=data,headers=headers)
    
    print(response.url)
    print(response.headers)
    

     

     POST请求:

    payload = {'key1': 'value1', 'key2': 'value2'}
    response = requests.post("http://httpbin.org/post", data=payload)
    print(response.text)
    

    你还可以为 data 参数传入一个元组列表。在表单中多个元素使用同一 个  key 的时候,这种方式尤其有效:

    import requests
    payload = (('key1', 'value1'), ('key1', 'value2'))
    # payload = {"k":"v"}
    r = requests.post('http://httpbin.org/post', data=payload)
    print(r.text)
    

    使用 json 参数直接传递

    方式一:

    import requests
    import json
    url = 'https://api.github.com/some/endpoint'
    payload = {'some': 'data'}
    r = requests.post(url, data=json.dumps(payload))
    

    方式二

    import requests
    url = 'https://api.github.com/some/endpoint'
    payload = {'some': 'data'}
    r = requests.post(url, json=payload)
    

    requests  上传文件

    import requests
    url = 'http://httpbin.org/post'
    files = {'file': open('test', 'rb')}
    r = requests.post(url, files=files)
    print(r.text)
    

     response:

    import requests
    respone=requests.get('http://www.jianshu.com')
    # respone属性
    print(respone.text)
    print(respone.content)
    
    print(respone.status_code)
    print(respone.headers)
    print(respone.cookies)
    print(respone.cookies.get_dict())
    print(respone.cookies.items())
    
    print(respone.url)
    print(respone.history)
    
    print(response.json()) == json.loads(response.text) #解析json数据
    print(respone.encoding) #关闭:response.close() from contextlib import closing with closing(requests.get('xxx',stream=True)) as response: for line in response.iter_content(): #适合数据量特别大的时候,下载 pass

      

    高级用法

    SSL Cert Verification

    #证书验证(大部分网站都是https)
    import requests
    respone=requests.get('https://www.12306.cn') #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端
    
    
    #改进1:去掉报错,但是会报警告
    import requests
    respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
    print(respone.status_code)
    
    
    #改进2:去掉报错,并且去掉警报信息
    import requests
    from requests.packages import urllib3
    urllib3.disable_warnings() #关闭警告
    respone=requests.get('https://www.12306.cn',verify=False)
    print(respone.status_code)
    
    #改进3:加上证书
    #很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
    #知乎百度等都是可带可不带
    #有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
    import requests
    respone=requests.get('https://www.12306.cn',
                         cert=('/path/server.crt',
                               '/path/key'))
    print(respone.status_code)
    

    2、使用代理

    #官网链接: http://docs.python-requests.org/en/master/user/advanced/#proxies
    
    #代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
    import requests
    proxies={
        'http':'http://egon:123@localhost:9743',#带用户名密码的代理,@符号前是用户名与密码
        'http':'http://localhost:9743',
        'https':'https://localhost:9743',
    }
    respone=requests.get('https://www.12306.cn',
                         proxies=proxies)
    
    print(respone.status_code)
    
    
    
    #支持socks代理,安装:pip install requests[socks]
    import requests
    proxies = {
        'http': 'socks5://user:pass@host:port',
        'https': 'socks5://user:pass@host:port'
    }
    respone=requests.get('https://www.12306.cn',
                         proxies=proxies)
    
    print(respone.status_code)
    

      

    3、超时设置

    #超时设置
    #两种超时:float or tuple
    #timeout=0.1         #代表接收数据的超时时间
    #timeout=(0.1,0.2)   #0.1代表链接超时  0.2代表接收数据的超时时间
    
    import requests
    respone=requests.get('https://www.baidu.com',
                         timeout=0.0001)
    

    4、 认证设置

    #官网链接:http://docs.python-requests.org/en/master/user/authentication/
    
    #认证设置:登陆网站是,弹出一个框,要求你输入用户名密码(与alter很类似),此时是无法获取html的
    # 但本质原理是拼接成请求头发送
    #         r.headers['Authorization'] = _basic_auth_str(self.username, self.password)
    # 一般的网站都不用默认的加密方式,都是自己写
    # 那么我们就需要按照网站的加密方式,自己写一个类似于_basic_auth_str的方法
    # 得到加密字符串后添加到请求头
    #         r.headers['Authorization'] =func('.....')
    
    #看一看默认的加密方式吧,通常网站都不会用默认的加密设置
    import requests
    from requests.auth import HTTPBasicAuth
    r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
    print(r.status_code)
    
    #HTTPBasicAuth可以简写为如下格式
    import requests
    r=requests.get('xxx',auth=('user','password'))
    print(r.status_code)
    

    5、异常处理

    #异常处理
    import requests
    from requests.exceptions import * #可以查看requests.exceptions获取异常类型
    
    try:
        r=requests.get('http://www.baidu.com',timeout=0.00001)
    except ReadTimeout:
        print('===:')
    # except ConnectionError: #网络不通
    #     print('-----')
    # except Timeout:
    #     print('aaaaa')
    
    except RequestException:
        print('Error')
    

      

      

  • 相关阅读:
    对象工厂函数与构造函数
    H5案例学习笔记
    对象工厂函数与构造函数
    JS对象的创建与使用
    CSS浏览器兼容性写法小结
    网页布局二三事
    关于URL、Web的一些概念
    什么是单点登录及解决方法
    Django--model-数据库操作
    Vue端增删改查实现
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/10631300.html
Copyright © 2011-2022 走看看