精华内容
下载资源
问答
  • Python爬虫request库request库的get()方法request的重要对象——Reponserequest的使用流程 从这个文章开始我将写一个关于爬虫学习的系列文章,希望大家持续关注,我会持续进行更新,希望大家共同进步。 request库...

    ☞☞☞点击查看更多优秀Python博客☜☜☜


    从这个文章开始我将写一个关于爬虫学习的系列文章,希望大家持续关注,我会持续进行更新,希望大家共同进步。

    request库的get()方法

    获取网页最简单的方法也就是request.get()的方法了,下面就让我们来看一下这种方法的使用:
    在进行request.get()后函数会返回一个包含服务器资源的Response对象
    同时会构造一个向服务器请求资源Request对象

    import requests
    url = "https://www.baidu.com/"
    r = request.get(url)
    print(r)
    

    上述代码就是request函数得到网页代码的最简单的方法了,但是这样得到的代码不一定能够正确显示,可能出现乱码的情况,面对这样可能出现的情况,我们可以给他加入参数的方法进行调节,下面进行详细的介绍
    request.get()共有三个参数:
    request.get(url,parapans = none,**kwargs)
    其中 : url代表网页链接
    parapans是url的额外参数,可以是字典或者字符串,可有可无
    **kwargs表示12个控制访问的参数

    request的重要对象——Reponse

    Reponse包含了爬虫所爬取回来的所有的内容。
    request的使用历程如下:

    import requests
    url = "https://www.baidu.com"
    r = request.get(url)
    #打印request返回的所有内容
    print (r)
    打印r的类型
    print(type(r))
    #打印函数返回的状态码,若为200表示成功
    print(r.status_code)
    #带你函数的获得的头部信息
    print(r.headers)
    

    request.get()请求最常用的对象属性:

    属性说明
    r.status_codeHTTP请求的返回状态,200表示连接成功,404表示失败等等
    r.textHTTP相应 内容的字符串形势,即url所对应的页面内容
    r.enconding从HHTTPheader中猜测的编码方式,即可以得到网页的编码方式
    r.apparent_encoding从内容中相应处编码方式
    r.contentHTTP相应的二进制形势

    request的使用流程

    1. 导入requests函数
    2. 通过r.status_code进行连接是否成功进行判断
    3. 若2中返回值为200,则进行r.text;r.encoding;r.apparent_enconding;
      r.content等操作
    4. 若2中返回不是200,则需要进行失败原因的查找

    理解Reponse的编码

    属性说明
    r.encoding从HTTTP header中猜测的相应内容编码方式
    r.apparent_encoding从内容中分析出相应内容的编码方式(备选的编码方式)

    区别:
    r.encoding:如果header中不存在charset,则默认为编码为ISO-8859-1
    r.apparent_encoding:从内容中分析,得到的编码方式比较可靠当r.encoding无法得到编码方式是应使用r.apparent_encoding进行编码方式的分析,分析完后再讲分析出来的值赋予r.encoding。

    以上即为本文的全部内容,快去试试你说学到的代码吧,python的学习一定要进行实践,不能只刷视频,不练习,希望本文对你的学习能有帮助。
    另外我会对python爬虫进行持续更新。希望大家持续关注
    提示学习来源:北京理工大学慕课

    **文章导航:**

    零基础学Python教程

    在这里插入图片描述

    展开全文
  • 主要介绍了Python爬虫:Request Payload和Form Data的简单区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 这篇文章主要介绍了python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例,需要的朋友可以参考下 使用Python爬虫库requests多线程抓取猫眼电影TOP100思路: 查看网页源代码 抓取单页内容 正则...
  • Python爬虫-Request入门

    千次阅读 2018-07-25 16:48:25
    安装Requests requests.get()-获取百度首页信息 import requests r = requests.get("www.baidu.com") #获取反馈信息 200为正常 r.status_code r.encoding = "utf-8" r.text 爬取网页的...

    安装Requests库

    requests.get()-获取百度首页信息

    import requests
    r = requests.get("www.baidu.com")
    #获取反馈信息 200为正常
    r.status_code
    r.encoding = "utf-8"
    r.text
    

    爬取网页的通用代码框架

    import requests
    
    def getHTMLText(url):
        try:
            r = requests.get(url,timeout=30)
            r.raise_for_status()
            #如果状态不是200,引发HTTPError异常
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return("产生异常")
    if _name_=="_main_":
        url = "http://www.baidu.com"
        print(getHTMLText(url))

    HTTP协议及requests方法:

    HTTP协议:超文本传输协议

    基于“请求与响应”模式的无状态的应用层协议。无状态-第一次和第二次请求没有关联。应用层-在TCP协议之上

    URL:http://host【:port】【path】 host:Internet 主机域名。port:端口号,端口为80。path:请求资源的路径

               www.bit.edu.cn.      220.181.111.188/duty(internet路径)

    Requests库方法解析(get最常使用 head获取概要)

    requests.request(method,url,**kwargs)

    展开全文
  • Python爬虫遇到Request-Payload怎么办?

    千次阅读 2019-08-08 16:08:47
    最近想用 Python 自动地爬取某个站点里的图片,没想到其请求数据是以request payload格式传输给后端进行处理的。博主还是第一次遇到这种情况,写下这篇文章记录一下解决过程。 博主浏览器使用的是 Chrome,下文说...

    前言

    最近想用 Python 自动地爬取某个站点里的图片,没想到其请求数据是以request payload格式传输给后端进行处理的。博主还是第一次遇到这种情况,写下这篇文章记录一下解决过程。

    博主浏览器使用的是 Chrome,下文说的浏览器一律指的是 Chrome浏览器。

    POST提交数据常见的几种Content-Type

    在网络请求中常用的Content-Type有很多,但是在POST请求下我们常用的Content-Type大约有3种。

    1.application/x-www-form-urlencoded

    这应该是我们最常见到的POST数据提交方式,原生的表单默认提交方式就是这个,

    我用站长工具模拟原生的POST请求,如图1-1:

    图1-1

    图1-1

    第一个红框可以看到请求的Content-Type确实是application/x-www-form-urlencoded,第二个红框展示的是向后端请求的数据,它是经过浏览器解码然后展示给我们看的,实际上数据编码格式如图1-2:

    图1-2

    可以看到,我们请求的数据变成了键值对的形式,并且中间用&分隔,形如key1=val1&key2=val2

    2.multipart/form-data

    使用表单传数文件时,Content-Type必须是multipart/form-data,传输的文件会被分割成多个部分,每部分使用–boundary分割。

    大体如图2-1:

    图2-1

    第二个红框数据也是经过浏览器解码的,原始数据如图2-2:

    图2-2

    3.application/json

    一般情况下,我们遇到的POST请求数据编码格式都是application/x-www-form-urlencoded,但是这种格式有局限性,如果想向后端传输复杂的数据,如:

    {
        "info": [
            {
                "name": "Kelvin",
                "age": 18
            }
        ]
    }
    

    这个时候,采用application/x-www-form-urlencoded对数据进行编码的话,就不是很方便。

    对于像这种复杂的数据,一般都是以json格式直接传给后端进行解析。

    博主在爬虫时遇到的就是Content-Type:application/json的情况,如图3-1:

    图3-1

    第二个红框也不像前两个一样是Form Data 而是变成了Request Payload,其中的数据也是经过浏览器解析的,原始数据如图3-2:

    图3-2

    图3-2

    可以看出来,数据确实是以json格式进行传输的。

    如果我们想模拟这种请求,如下代码是不行的:

    import requests
    
    
    headers = {
        'Content-Type': 'application/json',
        ......
    }
    
    data = {
        "n": "测试logo",
    
        "s": "TEST LOGO",
    
        "descr": "this is demo",
        "data": [],
        "p": 1,
        "dataPage": 0,
        "icon_lists": [],
        "icon_page": 1
    }
    
    url = 'https://www.logosc.cn/api/getAllInfo'
    response = requests.post(url=url, data=data, headers=headers)
    
    print(response.json())
    

    根据请求的URL不同,报错信息也会一样,但无一例外的请求失败,如图3-3:

    图3-3

    遇到Request Payload的解决办法

    碰到问题,我们首先求助的应该是官方文档,文档建议如下图4-1:

    图4-1

    图4-1

    官方提供了两种方法让我们以 application/json 格式编码数据进行传输。

    1.使用json.dumps()方法

    json.dumps()方法将字典数据转化成json类型然后传给data参数,代码如下:

    import requests
    import json
    
     headers = {
     'Content-Type': 'application/json',
     ......
    }
     data = {
     "n": "测试logo",
     "s": "TEST LOGO",
     "descr": "this is demo",
     "data": [],
     "p": 1,
     "dataPage": 0,
     "icon_lists": [],
     "icon_page": 1
     }
     url = 'https://www.logosc.cn/api/getAllInfo'
     response = requests.post(url=url, data=json.dumps(data), headers=headers)
     print(response.json())
    

    2.将数据传给json参数

    requests.post方法里有个json参数,当我们把数据传给json参数时,Content-Type会被自动的设置成application/json,代码如下:

    import requests
     headers = {
     'Content-Type': 'application/json',
     ......
    }
     data = {
     "n": "测试logo",
     "s": "TEST LOGO",
     "descr": "this is demo",
     "data": [],
     "p": 1,
     "dataPage": 0,
     "icon_lists": [],
     "icon_page": 1
     }
     url = 'https://www.logosc.cn/api/getAllInfo'
     response = requests.post(url=url, json=data, headers=headers)
     print(response.json())
    

    结尾语

    今天又爬出了一个小坑,很是开心,如果本文对你有所帮助,欢迎关注下方公众号「猿天罡」,不定期更新Python和算法相关的文章。see you!
    猿天罡

    展开全文
  • 使用python爬虫库requests,urllib爬取今日头条街拍美图 代码均有注释 import re,json,requests,os from hashlib import md5 from urllib.parse import urlencode from requests.exceptions import ...
  • 两万字博文教你python爬虫requests【详解篇】

    万次阅读 多人点赞 2021-07-12 09:00:11
    python为我们封装了那么多伟大而又简单实用的爬虫库,”不过我想说的是,“ 学啥技术都是从底层抓起,万丈高楼平地起,它也是基于地基稳! 所以在入坑文中简单地介绍使用了下底层爬虫库——socket!”????  ????而...

     👻上一篇博文一篇万字博文带你入坑爬虫这条不归路(你还在犹豫什么&抓紧上车) 【❤️熬夜整理&建议收藏❤️】被众多爬虫爱好者/想要学习爬虫的小伙伴们阅读之后,很多小伙伴私信我说——大佬搞爬虫都是用的socket套接字嘛?👻

     😬(苦笑)“那肯定不是啊!python为我们封装了那么多伟大而又简单实用的爬虫库,”不过我想说的是,“ 学啥技术都是从底层抓起,万丈高楼平地起,它也是基于地基稳! 所以在入坑文中简单地介绍使用了下底层爬虫库——socket!”😬

     😜而本文,本博主就带领小伙伴们认真地学习一下Python中一大广为使用的爬虫库——Requests——专为人类而构建;有史以来下载次数最多的Python软件包之一!😜

    在这里插入图片描述


                 重点来啦!重点来啦!! 💗💗💗

      相信有不少小伙伴已经通过我的上篇博文入坑爬虫,而本篇文讲解的Requests库也是学习爬虫之路的一大最为重要的知识点,在我们日后的爬虫开发中使用的最多的也是它哦!

    学好Requests,你的爬虫之路日后将畅通无阻!!!


    在这里插入图片描述

    1.简介

    Requests是一个优雅而简单的Python HTTP库,专为人类而构建。
    Requests是有史以来下载次数最多的Python软件包之一,每天下载量超过400,000次。

      之前的urllib(后面会更新文章讲解哦——敬请期待!)做为Python的标准库,因为历史原因,使用的方式可以说是非常的麻烦而复杂的,而且官方文档也十分的简陋,常常需要去查看源码。与之相反的是,Requests的使用方式非常的简单、直观、人性化,让程序员的精力完全从库的使用中解放出来。

      Requests的官方文档同样也非常的完善详尽,而且少见的有中文官方文档&&英文官方文档

    在这里插入图片描述

    2.发起请求

    根据入坑文可知爬虫:模拟浏览器发送请求,获取响应。那么首先我们就要学会使用Requests发起请求!

      Requests的请求不再像urllib一样需要去构造各种Request、opener和handler,直接使用Requests构造的方法,并在其中传入需要的参数即可。

    源码:
    def request(method, url,params=None, data=None, headers=None, cookies=None,
        timeout=None, allow_redirects=True, proxies=None,verify=None,  json=None):
    

    参数详解:

    (1)请求方法method:

    每一个请求方法都有一个对应的API,比如GET请求就可以使用get()方法
    在这里插入图片描述
    而POST请求就可以使用post()方法,并且将需要提交的数据传递给data参数即可:
    在这里插入图片描述
    而其他的请求类型,都有各自对应的方法:
    在这里插入图片描述

    知识点补给站——POST请求方法的小知识点:
    	应用场景:登录注册
    	需要传输大文本内容的时候使用(post请求对长度没有要求)。
    

    在这里插入图片描述

    (2)统一资源定位符url

    URL(Universal Resource Locator),即统一资源定位符。
    在这里插入图片描述

    (3)传递url参数params

      传递URL参数也不用再像urllib中那样需要去拼接URL,而是简单的,构造一个字典,并在请求时将其传递给params参数:

    import requests
    params = {'key': 'value1', 'key2': 'value2'}
    resp = requests.get("http://httpbin.org/get", params=params)
    print(resp.url)
    

    在这里插入图片描述

    小知识点:
      有时候我们会遇到相同的url参数名,但有不同的值,而python的字典又不支持键的重名,那么我们可以把键的值用列表表示:

    import requests
    params = {'key': 'value1', 'key2': ['value2', 'value3']}
    resp = requests.get("http://httpbin.org/get", params=params)
    print(resp.url)
    

    在这里插入图片描述

    知识点补给站:
    	本文大多使用的URL站点是httpbin.org,它可以提供HTPP请求测试哦!
    

    (4)传递form表单数据——data

      将放进data的数据转换为form表单数据,同时不能传json数据,json数据为null。注意:json和data二者只能同时存在其一
    在这里插入图片描述在这里插入图片描述

    (5)传递json数据——json

      将json对应的数据放进json参数里。

    在这里插入图片描述在这里插入图片描述

    (6)自定义headers

    是不是很熟悉,这就是反爬第一阶段常用套路!

      如果想自定义请求的Headers,同样的将字典数据传递给headers参数。
    在这里插入图片描述

    (7)自定义cookies

    在这里插入图片描述

    ①获取cookies:

    第一种方法:

    import requests
    from fake_useragent import UserAgent
    
    r = requests.get('https://www.baidu.com',headers = {'User-Agent': UserAgent().random})
    print(r.cookies)
    
    print('*'*25)
    print(r.cookies.items())
    print('*'*25)
    
    for key,value in r.cookies.items():
        print(key + "=" + value)
    

    在这里插入图片描述

      此处我们首先调用cookies属性即可成功得到cookies,可以发现他是个RequestsCookieJar类型。然后用items()方法将其转化为元组组成的列表,遍历输出每一个Cookie的名称和值,实现Cookie的遍历解析。


    第二种方法:

      使用requests.utils.dict_from_cookiejar:把cookiejar对象转化为字典。

    import requests
    from fake_useragent import UserAgent
    
    url = 'http://www.baidu.com'
    response = requests.get(url=url, headers ={'user-agent': UserAgent().random})
    cookie = requests.utils.dict_from_cookiejar(response.cookies)
    print(cookie)
    
    """
    输出:
    {'BAIDUID_BFESS': '52EB4182E0877DFD9DBA8E0793772027:FG=1', 'H_PS_PSSID': '33802_34222_31254_33848_34112_34107_26350_34093', 'BDSVRTM': '0', 'BD_HOME': '1'}
    """
    

    在这里插入图片描述

    ②使用Cookie维持登录状态的两种方法:

      第一种方法: 请求头中加入网页复制的cookie来维持登录状态!

    实战之以QQ空间为例来说明:
    (如何在网页中获取Cookie:首先登录QQ空间,将Headers中的Cookie内容复制即可!)

    import requests
    
    headers = {
        'cookie': '此处换为你自己的Cookie即可!',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36'
    }
    
    r = requests.get('https://user.qzone.qq.com/这里写上要登录的QQ号/infocenter', headers=headers)
    print(r.text)
    
    

    我们发现,结果中包含了登录后的结果,说明我们登录成功!


      第二种方法: 通过cookies参数来设置,直接将cookies构造字典传入即可!

    在这里插入图片描述

    (8)设置代理proxies

    在这里插入图片描述

    1. 什么是代理?
      代理IP是一个ip ,指的是一个代理服务器。

    2. 要晓得正向代理和反向代理是啥?
      知不知道服务器的地址做为判断标准:知道就是正向代理,不知道就是反向代理。

    在这里插入图片描述
    3. 代理ip的分类(常见有两大分类依据:匿名度&&协议)
      ①匿名度:
       透明代理 :目标服务器可以通过代理找到你的ip;
       匿名代理 :两者之间;
       高匿代理 :在爬虫中经常使用,目标服务器无法获取你的ip。
      ②协议:(根据网站使用的协议不同,需要使用响应的协议代理服务)
       http代理:目标的url为http协议;
       https代理:目标url为https协议;
       socks代理 :只是简单的传递数据包,不关心是何种协议,比http和HTTPS代理消耗小, 可以转发http和https的请求。

    1. 为何使用代理?
      (1)让服务器以为不是同一个客户端在请求;
      (2)防止我们的真实地址被泄露,防止被追究。

    2. 用法:
        当我们需要使用代理时,同样构造代理字典,传递给proxies参数。

    在这里插入图片描述

    (9)重定向allow_redirects

      在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。
    在这里插入图片描述

    (10)禁止证书验证vertify

    在这里插入图片描述

      有时候我们使用了抓包工具,这个时候由于抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的(比如,之前12306的整数就没有被官方CA机构信任,就会出现证书验证错误的结果!),所以证书的验证会失败,这时我们就需要关闭证书验证。

    在这里插入图片描述  解决方法:在请求的时候把verify参数设置为False就可以关闭证书验证了。
    在这里插入图片描述小拓展:
    在这里插入图片描述  但是关闭验证后,会有一个比较烦人的warning,它建议我们给它指定证书。我们可以通过设置忽略警告的方式来屏蔽它:

    在这里插入图片描述

    (11)设置超时timeout

      为了防止服务器不能及时响应,而设置一个超时时间,即超过了这个时间还没有得到响应,那就报错!
      设置访问超时——设置timeout参数即可。(这个时间的计算是发出请求到服务器返回响应的时间)
      实际上:请求分为两个阶段,即连接(connect)和读取(read)。下面设置的timeout将用作连接和读取这二者的timeout总合。如果分别指定,就可以传入一个元组:timeout=(5,11,30)。
    在这里插入图片描述

    拓展:

    实际上,我们在多数爬虫开发中——超时参数timeout是和retrying模块(刷新)一起使用的!
    1. 使用retrying模块提供的retry方法
    2. 通过装饰器的方式,让被装饰的函数反复执行
    3. retry中可以传入参数 stop_max_attempt_number,让函数报错后继续重新执行,达到最大执行次数的上限,如果每次都报错,整个函数报错,如果中间有一个成功,程序继续往后执行

    ①代码讲解:

    import requests
    from retrying import retry
    
    headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 "}
    
    @retry(stop_max_attempt_number=3)   # stop_max_attempt_number=3最大执行3次,还不成功就报错
    def _parse_url(url):                                            # 前面加_代表此函数,其他地方不可调用
        print("*"*100)
        response = requests.get(url, headers=headers, timeout=3)    # timeout=3超时参数,3s内
        assert response.status_code == 200                          # assert断言,此处断言状态码是200,不是则报错
        return response.content.decode()
    
    
    def parse_url(url):
        try:
            html_str = _parse_url(url)
        except Exception as e:
            print(e)
            html_str = None
        return html_str
    
    if __name__ == '__main__':
        # url = "www.baidu.com"         # 这样是会报错的!
        url = "http://www.baidu.com"
        print(parse_url(url))
    

    ②实现效果一:无法爬取到的情况:url = “www.baidu.com”!
    在这里插入图片描述

    ②实现效果二:正确爬取到的情况:url = “http://www.baidu.com”!

    在这里插入图片描述

    (12)文件上传

      假如有的网站需要上传文件,我们也可以使用requests实现!

    当前脚本的同一目录下有个名为1.jpg的文件:

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

    在这里插入图片描述
    在这里插入图片描述
      这个网站会返回响应,里面包含files这个字段,而form字段是空的,这证明文件上传部分会单独有个files字段来标识。

    (13)Prepared Request

      我们知道在urllib中可以将请求表示为数据结构,其中各个参数都可以通过一个Request对象来表示。这在requests中同样可以做到,这个数据结构叫做Prepared Request。如下:

    from requests import Request,Session
    
    url = 'http://httpbin.org/post'
    data = {
        'name':'peter'
    }
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13'
    }
    
    s = Session()
    req = Request('POST', url, data=data, headers=headers)
    prepped = s.prepare_request(req)
    r = s.send(prepped)
    print(r.text)
    

      先用url,data,headers参数构造了一个Request对象,这时需要再调用Session的prepare_request()方法将其转换为一个Prepared Request对象,然后调用send()方法发送即可!

    在这里插入图片描述
      使用较少,但是这样使用的好处是:有了Request这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便!
    在这里插入图片描述

    总结:

    import requests
    
    # res=requests.get("http://httpbin.org/get")       #功能:发起完整的网络请求
    
    '''
    源码:
    def request(method, url,params=None, data=None, headers=None, cookies=None,
        timeout=None, allow_redirects=True, proxies=None,verify=None,  json=None):
    '''
    
    #1.method
    # res=requests.post("http://httpbin.org")
    # res=requests.delete("http://httpbin.org")
    
    # url  字符串  统一资源定位符
    
    # params    将放进params里的字典数据变为url的请求参数(如果是中文会自动编码)
    # test_url="http://httpbin.org/get"
    # params={"name":"allen","name2":"哈哈"}
    # res=requests.get(url=test_url,params=params)
    # print(res.text)
    
    # data   将放进data的数据转换为form表单数据,同时不能传json数据,json数据为null
    # test_url="http://httpbin.org/post"            #post提交数据
    # data={"stu":"丸子","worker":"鲸落"}
    # res=requests.post(url=test_url,data=data)
    # print(res.text)
    
    # json      将json对应的数据放进json数据里
    # test_url="http://httpbin.org/post"               #post提交数据
    # json={"name":"selffly"}    #'{"name":"selffly"}' json串形式也可以传,字典也可以传
    # res=requests.post(url=test_url,json=json)
    # print(res.text)
    
    # 添加头部信息headers       添加cookies     添加timeout     设置代理proxies=None      verify=False安全验证(为False是忽略证书)
    # test_url="http://httpbin.org/get"
    # headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36"}
    # cookies={"sessionid":"dfsdaaagdgagdf"}
    # proxies={'http':"127.0.0.1:8888"}           #这个代理胡写的,不可用
    # res=requests.get(url=test_url,headers=headers,cookies=cookies,timeout=10,proxies=proxies)
    # print(res.text)
    
    # 测试重定向allow_redirects    如果为True就可以进行重定向;反之不可以
    # res_bd=requests.get("http://www.baidu.com",allow_redirects=False)
    # print(res_bd.text)
    

    在这里插入图片描述

    3.接收响应

    根据入坑文可知爬虫:模拟浏览器发送请求,获取响应。使用requests发送请求我们OK了,下面我们要做的就是获取响应!

      通过Requests发起请求获取到的,是一个requests.models.Response对象。通过这个对象我们可以很方便的获取响应的内容。

    (1)响应内容

    requests通过text属性,可以获得字符串格式的响应内容。

    在这里插入图片描述

    (2)字符编码

      Requests会自动的根据响应的报头来猜测网页的编码是什么,然后根据猜测的编码来解码网页内容,基本上大部分的网页都能够正确的被解码。而如果发现text解码不正确的时候,就需要我们自己手动的去指定解码的编码格式。
    在这里插入图片描述

    (3)二进制数据

    而如果你需要获得原始的二进制数据,那么使用content属性即可。

    在这里插入图片描述

    (4)json数据

    如果我们访问之后获得的数据是JSON格式的,那么我们可以使用json()方法,直接获取转换成字典格式的数据。
    在这里插入图片描述

    (5)状态码

    通过status_code属性获取响应的状态码

    在这里插入图片描述

    应用:
      状态码常用来判断请求是否成功,而requests还提供了一个内置的状态码查询对象requests.codes,如下。这里通过比较返回码和内置的成功的返回码,来保证请求得到了正常响应,输出成功请求的消息,否则程序终止,这里我们用requests.codes.ok得到的是成功的状态码200。其实我们直接和200判断就好了!不过像下面这样写B格高!

    import requests
    r = requests.get('https://www.baidu.com')
    print('内置的成功的返回码:',requests.codes.ok)
    print('状态码:',r.status_code)
    exit() if not r.status_code == requests.codes.ok else print('Request Successfully')
    

    在这里插入图片描述

    (6)响应报头

    通过headers属性获取响应的报头
    在这里插入图片描述

    (7)服务器返回的cookies

    通过cookies属性获取服务器返回的cookies
    在这里插入图片描述

    (8)查看响应的url

    还可以使用url属性查看访问的url。
    在这里插入图片描述

    总结:

    import requests
    
    res=requests.get("http://www.baidu.com")	#发起完整的网络请求
    print(res.content)      #字节码格式   图片,视频数据等
    res.encoding="utf-8"    #乱码需要解码,修改编码方式
    print(res.text)         #字符串格式  非字节码
    print(res.status_code)  #状态码
    print(res.url)          #获取响应的url
    print(res.cookies)      #获取cookies
    
    res=requests.get("http://httpbin.org/get")
    print(res.json()["headers"]["User-Agent"])      #使用json()方法将数据变为字典格式
    print(res.headers)    #获取响应报头
    
    # 拓展:还可以使用方法获取请求的一些数据:
    print("请求头:",res.request.headers)
    print("请求的url",res.request.url)
    print("请求的cookie",res.request._cookie)    # 返回cookiejar类型
    

    在这里插入图片描述

    4.使用requests库进行实战:

    (1)基操 之 实战项目一:进行百度贴吧指定搜索内容获取到的html源码头5页的爬取!

    ①上代码:

    import os
    import requests
    
    '''
    为了构造正确的url!!!
    进入百度贴吧进行测试,任意搜索一个信息,通过不同页更换,观察url找寻规律:
    https://tieba.baidu.com/f?kw=美食&ie=utf-8&pn=0
    https://tieba.baidu.com/f?kw=美食&ie=utf-8&pn=50
    https://tieba.baidu.com/f?kw=美食&ie=utf-8&pn=100
    https://tieba.baidu.com/f?kw=美食&ie=utf-8&pn=150
    '''
    
    class TiebaSpider:
        def __init__(self,tieba_name):
            self.tieba_name = tieba_name
            self.url_temp = "https://tieba.baidu.com/f?kw="+tieba_name+"&ie=utf-8&pn={}"
            self.headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}
    
        # 构造url列表
        def get_url_list(self):
            return [self.url_temp.format(i*50) for i in range(5)]
    
        # 发送请求,获取响应
        def parse_url(self,url):
            response = requests.get(url,headers=self.headers)
            return response.content.decode()
    
        # 保存
        def save_html_str(self, html_str, page_num):
            file_path = "{}_第{}页.html".format(self.tieba_name, page_num)
            dir = 'ceshi'
            if not os.path.exists(dir):
                os.mkdir(dir)
            file_path = dir + '/' + file_path
            with open(file_path, "w", encoding='utf-8') as f:
                f.write(html_str)
            print("保存成功!")
    
        # 实现主要逻辑
        def run(self):
            # 构造url列表
            url_list = self.get_url_list()
            # 发送请求,获取响应
            for url in url_list:
                html_str = self.parse_url(url)
                # 保存
                page_num = url_list.index(url)+1
                self.save_html_str(html_str, page_num)
    
    if __name__ == '__main__':
        name_date = input("请输入你想知道的内容:")
        tieba_spider = TiebaSpider(name_date)
        tieba_spider.run()
    

    ②实现效果:

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    (2)升级版操作 之 实战项目二:使用session实现人人网登录状态维持

    requests模拟登陆的三种方法:
    					   1.session:
    					        实例化对象
    					        session.get(url) #cookie保存在session中
    					        session.get(url) #带上保存在session中cookie
    					
    					   2.cookie方法在headers中
    					   3.cookie传递给cookies参数:
    					        cookie = {"cookie 的name的值":"cookie 的value对应的值"}
    

    ①上代码:

    import requests
    
    # 1.实例化session
    session = requests.Session()
    
    # 2. 使用session发送post请求,对方服务器会把cookie设置在session中
    headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.2 (KHTML, like Gecko) Chrome/4.0.222.3 "}
    post_url = "http://www.renren.com/PLogin.do"
    post_data = {"email":"自己的账号","password":"自己的密码"}
    
    session.post(post_url,data=post_data,headers=headers)
    
    # 3.请求个人主页,会带上之前的cookie,能够请求成功
    profile_url = "http://www.renren.com/自己进自己主页会有的/profile"
    response = session.get(profile_url,headers=headers)
    
    with open("renren.html", "w", encoding="utf-8") as f:
        f.write(response.content.decode())
    
    

    ②实现效果:

    在这里插入图片描述

    5.In The End!

    在这里插入图片描述

    从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

    本博主会持续更新爬虫基础分栏及爬虫实战分栏,认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多爬虫文!

    	如有错误或者言语不恰当的地方可在评论区指出,谢谢!
    	如转载此文请联系我说明用以意并标注出处及本博主名,谢谢!
    
    展开全文
  • 06-python爬虫库urllib,开始编写python爬虫代码

    千次阅读 多人点赞 2020-09-22 07:17:12
    我们首先了解一下 Urllib ,它是 Python 内置的 HTTP 请求,也就是说我们不需要额外安装即可使用,它包含四个模块: 第一个模块 request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在...
  • ![图片说明]...上图是谷歌显示 post 提交时候的数据。 ... 我的目的是拿到这个dwr里面的数据。 还有这个Content-Type:"text/plain; charset=UTF-8"。是不是有关系。...万分感激
  • 先上图,这个是笔者写爬虫时遇到request payload时,还是想from data那样来爬取数据,结果返回的是{"Message":"An error has occurred."},很郁闷,上百度找了一下资料...
  • Python爬虫-Request爬取网站内容

    千次阅读 2018-07-25 17:44:53
    爬去网页-Requests,网站-Scrapy,全网爬取-定制Google这种。 爬取京东一个页面的信息 import requests url = 'http://item.jd.com/2967929.html' try: r = requests.get(url) r.raise_for_status() #...
  • from urllib import request, parse # 使用 parse 模块对 URL 进行参数编码 urls = "http://www.baidu.com/s?" wd = input("请输入: ") qs = { "wd": wd } # 转换 URL 编码 qs = parse.urlencode(qs) url = urls + ...
  • http://tieba.baidu.com/f?kw=??&pn=50

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,928
精华内容 25,571
关键字:

python爬虫库request

python 订阅
爬虫 订阅