zoukankan      html  css  js  c++  java
  • 【Python3 爬虫】U05_requests库


    虽然Python中的标准库urllib模块已经可以满足我们的大多数需求,但是它的API使用起来让人感觉不是很好,而requests宣传是HTTP for Humans,说明使用更简洁方便。

    1.安装和文档地址

    • 安装
    pip install requests
    

    2.发送get请求

    2.1 发送最简单的get请求

    import requests
    resp = requests.get("https://www.sohu.com/")
    print(resp.content.decode('utf-8'))
    

    2.2 添加headers和查询参数

    如果想要添加headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用params参数。
    实例代码:

    import requests
    params = {
        'q': 'Python'
    }
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
    }
    
    # params接受一个字典或者字符串查询参数,字典类型自动转换为url编码
    response = requests.get('https://www.so.com/s', params = params, headers = headers)
    
    # 查看完整的url地址
    print(response.url)
    
    # 查看响应内容,response.text返回的是Unicode格式的数据
    print(response.text)
    
    # 查看响应内容,response.content返回的字节流数据
    print(response.content.decode('utf-8'))
    
    # 查看响应头的字符编码
    print(response.encoding)
    
    # 查看响应码
    print(response.status_code)
    
    

    response.text和response.content的区别

    • response.text
      类型:str
      解码类型: 根据HTTP头部对响应的编码作出有根据的推测,推测的文本编码
      如何修改编码方式:response.encoding="GBK"

    • response.content
      类型:bytes
      解码类型: 没有指定
      如何修改编码方式:response.content.deocde("utf-8")
      推荐使用response.content.deocde()的方式获取响应的html页面

    3.发送post请求

    
    import requests
    
    url = 'http://httpbin.org/post'
    d = {'key1': 'value1', 'key2': 'value2'}
    r = requests.post(url, data=d)
    print(r.text)
    

    输出结果:

    4.设置代理

    用法:requests.get("http://www.baidu.com", proxies = proxies)
    
    proxies的形式:字典
    
    proxies = { 
    	"http": "http://12.34.56.79:9527", 
    	"https": "https://12.34.56.79:9527", 
    	}
    

    实际案例:

    import requests
    
    proxies = {
    	"https": "https://117.114.149.66:53281"
    	}
    
    response = requests.get('http://httpbin.org/ip', proxies = proxies )
    print(response.text)
    

    使用代理注意事项:
    (1) 准备一堆的ip地址,组成ip池,随机选择一个ip来使用
    (2) 如何随机选择代理ip,让使用次数较少的ip地址有更大的可能性被用到
    {"":ip,"times":0}
    [{},{},{},{},{},{}],对这个ip的列表进行排序,按照使用次数进行排序
    选择使用次数较少的10个ip,从中随机选择一个
    (3) 检查ip可用性
    使用requests设置超时参数,判断ip地址的质量
    在线代理ip质量检测的网站

    5.爬虫的cookie和session

    5.1 cookie和session的区别

    • cookie数据存放在客户的浏览器上,session数据放在服务器上。

    • cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。

    • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。

    • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
      利弊分析

    • 带上cookie、session的好处:
      能够请求到登录之后的页面

    • 带上cookie、session的弊端:
      一套cookie和session往往和一个用户对应
      请求太快,请求次数太多,容易被服务器识别为爬虫

    不需要cookie的时候尽量不去使用cookie
    但是为了获取登录之后的页面,我们必须发送带有cookies的请求

    5.2 处理cookies、session请求

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

    • 使用方法:
      实例化一个session对象
      让session发送get或者post请求

      session = requests.session()
      response = session.get(url,headers)

    5.3 实战演练:登录人人网

    实现思路:

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

    5.3.1 第一种登录方法

    # Author:Logan
    
    import requests
    
    # 实例化session
    session = requests.session()
    
    post_url = "http://www.renren.com/PLogin.do"
    
    post_data = {"email":"1829xxxxxx", "password":"xxxxxx"}
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
    }
    
    # 使用session发送post请求,将cookie保存在其中
    session.post(post_url, data=post_data, headers=headers)
    
    # 使用session进行请求登录之后才能访问的地址
    r = session.get("http://www.renren.com/422522252", headers=headers)
    
    # 保存抓取到的网页
    with open("登录主页.html","w",encoding="utf-8") as f:
        f.write(r.content.decode())
    

    5.3.2 第二种方法:直接使用cookie

    实现思路:

    • cookie过期时间很长的网站
    • 在cookie过期之前能够拿到所有的数据,比较麻烦、
    • 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
    # Author:Logan
    
    import requests
    
    # 实例化session
    session = requests.session()
    
    # cookie需要从浏览器的开发者工具中获取
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
        "Cookie": " depovince=GW; _r01_=1; JSESSIONID=abcSUGlZJI35n-eGRWaax; ick_login=14b370e8-ddda-4454-92bd-1ee4e7e43cff; taihe_bi_sdk_uid=e010145001347915db9751467f2cd0ea; taihe_bi_sdk_session=8d5708e58efbff67d0c898d0cfb65190; ick=a6cd9b11-1041-4369-9c2e-988a1145e2db; __utma=151146938.1477590665.1580561077.1580561077.1580561077.1; __utmc=151146938; __utmz=151146938.1580561077.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmb=151146938.4.10.1580561077; first_login_flag=1; ln_uact=18298377941; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20130527/1710/h_main_kCBe_44640000035d111a.jpg; springskin=set; jebe_key=03183a84-908b-4464-a274-effbad2465bd%7C328749f653f1c822a5c17f3cffb81c7e%7C1580561163632%7C1%7C1580561167311; jebe_key=03183a84-908b-4464-a274-effbad2465bd%7C328749f653f1c822a5c17f3cffb81c7e%7C1580561163632%7C1%7C1580561167317; vip=1; wp=1; _ga=GA1.2.1477590665.1580561077; _gid=GA1.2.949337216.1580561260; wp_fold=0; jebecookies=232a41e5-1d06-4b42-997e-b882808e2f33|||||; _de=02B2EB92B8F71ACD92522705638FE3D8; p=95ac9bbe0e38f6f505d6b802289e32ae2; t=df3627f5cb62cc5c01424ea6f48bb1e42; societyguester=df3627f5cb62cc5c01424ea6f48bb1e42; id=422522252; xnsid=ff1c185f; ver=7.0; loginfrom=null"
    }
    
    # 使用session进行请求登录之后才能访问的地址
    r = session.get("http://www.renren.com/422522252", headers=headers)
    
    # 保存抓取到的网页
    with open("登录主页2.html","w",encoding="utf-8") as f:
        f.write(r.content.decode())
    

    5.3.3 第三种方法:字典推导式、列表推导式实现

    # Author:Logan
    
    import requests
    
    # 实例化session
    session = requests.session()
    
    cookie = " depovince=GW; _r01_=1; JSESSIONID=abcSUGlZJI35n-eGRWaax; ick_login=14b370e8-ddda-4454-92bd-1ee4e7e43cff; taihe_bi_sdk_uid=e010145001347915db9751467f2cd0ea; taihe_bi_sdk_session=8d5708e58efbff67d0c898d0cfb65190; ick=a6cd9b11-1041-4369-9c2e-988a1145e2db; __utma=151146938.1477590665.1580561077.1580561077.1580561077.1; __utmc=151146938; __utmz=151146938.1580561077.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmb=151146938.4.10.1580561077; first_login_flag=1; ln_uact=18298377941; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20130527/1710/h_main_kCBe_44640000035d111a.jpg; springskin=set; jebe_key=03183a84-908b-4464-a274-effbad2465bd%7C328749f653f1c822a5c17f3cffb81c7e%7C1580561163632%7C1%7C1580561167311; jebe_key=03183a84-908b-4464-a274-effbad2465bd%7C328749f653f1c822a5c17f3cffb81c7e%7C1580561163632%7C1%7C1580561167317; vip=1; wp=1; _ga=GA1.2.1477590665.1580561077; _gid=GA1.2.949337216.1580561260; wp_fold=0; jebecookies=232a41e5-1d06-4b42-997e-b882808e2f33|||||; _de=02B2EB92B8F71ACD92522705638FE3D8; p=95ac9bbe0e38f6f505d6b802289e32ae2; t=df3627f5cb62cc5c01424ea6f48bb1e42; societyguester=df3627f5cb62cc5c01424ea6f48bb1e42; id=422522252; xnsid=ff1c185f; ver=7.0; loginfrom=null"
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
        }
    
    cookies = {i.split("=")[0]:i.split("=")[1] for i in cookie.split(";")}
    print(cookies)
    # 使用session进行请求登录之后才能访问的地址
    r = session.get("http://www.renren.com/422522252", headers=headers, cookies=cookies)
    
    # 保存抓取到的网页
    with open("登录主页3.html","w",encoding="utf-8") as f:
        f.write(r.content.decode())
    
  • 相关阅读:
    临摹帖
    PC+PLC通过Modbus协议构建工控系统
    mvn打包时出现一个子模块找不到另一个子模块的情况
    T-SQL——函数——字符串操作函数
    T-SQL——透视PIVOT动态获取待扩展元素集
    T-SQL——数据透视和逆透视
    T-SQL——关于表数据的复制插入
    T-SQL——关于SQL读取Excel文件
    T-SQL——关于SqlPrompt的使用
    微信小程序--聊天室小程序(云开发)
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12574093.html
Copyright © 2011-2022 走看看