zoukankan      html  css  js  c++  java
  • 爬虫(二)—— 爬虫常见操作

    爬虫中常见操作

    一、requests的用法

    1、常见方法

    (1)params

    直接将参数放在 params中 会自动进行url编码

    response =  requests.get(url,headers=headers,params={"wd":kwd})
    
    # 添加数据到请求头中
     response =  requests.get(url,headers={
         # 把数据加在这里
     },params={"wd":kwd})
    

    (2)post方法

    其他参数与get一致,请求体放在data中

     # 返回值的处理
     response =  requests.get(url,headers=headers,params={"wd":kwd})
     print(response.status_code) # 状态码
     print(response.text) # 将结果以文本的形式返回
     response.content # 将结果以二进制的方式返回
     response.json() # 将数据直接反序列化得到字典或是列表
    
    

    2、session方法

    该方法自动保存和提交 cookie

    import requests
    # 创建session对象
    session = requests.session()
    res = session.get("https://github.com/login",headers={
        "Referer": "https://github.com/",
        "User-Agent": user_agent
    })
    
    token = re.search('name="authenticity_token" value="(.*?)"',res.text).group(1)
    
    res2 = session.post("https://github.com/session",
                         headers = {
                             "Referer": "https://github.com/login",
                             "User-Agent": user_agent},
                         data={
                             "commit": "Sign in",
                             "utf8": "✓",
                             "authenticity_token": token,
                             "login": "xxxxxx",
                             "password": "xxxxxxxxx"},
                         allow_redirects = False
                         )
    
    

    3、其他方法

    response = requests.get('https://www.baidu.com')
    print(response.text)   # 返回文本内容
    print(response.content)   # 返回二进制数据
    print(response.json())    # 反序列化,只能在返回数据为json格式时使用
    print(response.history)  # 获取 重定向的所有连接历史
    print(respone.status_code)
    print(respone.headers)
    print(respone.cookies)
    print(respone.cookies.get_dict())
    print(respone.url)
    print(respone.history) # 重定向历史
    print(respone.encoding) # 响应体编码方式
    
    

    二、指定响应体编码

    import requests
    response=requests.get('http://www.autohome.com/news')
    response.encoding = "GBK"
    print(response.text)
    print(response.encoding)
    

    三、分段获取数据

    # 当响应体数据太大的时候一次性获取所有可能造成内存溢出
    # 可以使用iter_content 分段获取数据,
    # chunk_size指定每次获取的长度,
    # decode_unicode 是否进行解码 通常为false
    
    from contextlib import closing
    with closing(requests.get('xxx',stream=True)) as response:
        for line in response.iter_content(chunk_size=1024,decode_unicode=False):
            print(line)
    

    四、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)
    

    五、使用代理

    # 官网链接: http://docs.python-requests.org/en/master/user/advanced/#proxies
    
    # 代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
    import requests
    proxies={
        'http':'http://112.98.126.100:8118',#带用户名密码的代理,@符号前是用户名与密码
        'https':'https://124.42.68.152:90',
    }
    respone=requests.get('https://www.baidu.com',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)
    

    六、超时设置

    # 超时设置
    # 两种超时: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)
    

    七、捕获异常

    #异常处理
    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')
    

    八、上传文件

    import requests
    files={'file':open('a.jpg','rb')} # value为文件对象
    respone=requests.post('http://httpbin.org/post',files=files)
    print(respone.status_code)
    
  • 相关阅读:
    面向对象(OOP:Objdec Oriented Programming)
    vue中v-model和v-bind区别
    DateTimeFormat
    html中frameset简介
    学习及资料地址
    mybatis+oracle批量新增带序列List对象
    Io流读取并输出文件(例如.mp3格式文件)
    Java从服务器下载图片保存到本地
    转:Java DecimalFormat的主要功能及使用方法
    数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)
  • 原文地址:https://www.cnblogs.com/linagcheng/p/10306029.html
Copyright © 2011-2022 走看看