美文网首页
入门爬虫第一步,熟悉requests库

入门爬虫第一步,熟悉requests库

作者: SunCOOL_2291 | 来源:发表于2019-08-15 22:56 被阅读0次

    SunCOOL

    Requests是一个针对python的http库(可以理解为一个浏览器)该库无需安装,安装Python的时候已经自带。****利用它,一行代码就可以发送请求。

    01发送请求

    在网络请求中,GET,POST请求是浏览器与服务器交流的两种主要方式,你看到的每一一网页的背后是一系列由浏览器向服务器发送的GET/POST请求。

    使用 Requests 发送网络请求非常简单。

    一开始要导入 Requests 模块:

    import requests
    

    然后,尝试获取某个网页。本例子中,我们来获取 百度的主页:

    
    r = requests.get('https://www.baidu.com/')
    

    有请求必定有回复,现在我们有一个名为 rResponse 对象。我们可以从这个对象中获取所有我们想要的信息。我们已经向百度的服务器发送了一个GET请求怎么样?是不是很简单!

    POST请求和GET请求一样简单但是,会比GET请求多一个步骤。顾名思义,POST即为发送,那么我们需要来定义发送的内容。这个内容的格式是一个字典。如在所示,字典的格式是用{}来包裹你需要向服务器来发送的参数,比如下面这个字典,里面有两个键值,每个键值都是一对。键就是下面的'key1'、'key2',值则是‘value1’,‘value2’。有了这个字典,那么我们就可进行POST请求了。ps:没有字典可以发送POST请求吗?可以,但是这样做没有意义。

    data1 = {'key1':'value1','key2':'value2',}
    
    r = requests.post('https://www.baidu.com/',data = data1)
    

    另外,在HTTP定义的请求中还有其他 HTTP 请求类型:PUT,DELETE,HEAD 以及 OPTIONS .这些请求我们一般不会应用于爬虫。当然,或许在日后的某次编码中,你会用到他们,请自行学习。

    02向GET请求中传递参数

    我们刚才讲到,在发送POST请求时需要我们来定义一个字典,不然我们的POST请求是无意义的。那么GET请求可以向服务器发送特定的参数吗?

    首先我们来看一张图片

    批注 2019-08-15 210534.png

    这是使用百度搜索引擎来搜索关键词“百度”时返回的网页,我们可以看到在黄线标注的URL是很长的一串。?后面跟的是一串key=value格式的多干个键值对。所以GET请求也是可以向服务器来发送特定的参数的。

    方法如下

    data2 = {'key1': 'value1', 'key2': 'value2'}
    
    r = requests.get("https://www.baidu.com/",params=data2)
    

    我们来使用r.url 来看一下我们带参数的GET请求

    print(r.url)         
    #输出https://www.baidu.com/? key2=value2&key1=value1
    

    我们的字典data2被添加到了URL中,这就是GET请求与POST请求的不同之处,POST请求所需要带的参数是不会被传入url中的,而GET请求则会。

    03请求之后的响应
    在我们向服务器发送请求后,服务器会根据你向服务器发送的内容来进行返回内容。刚才我们使用百度来搜索“百度”,在点击搜索后,服务器为我们返回了我们查找的内容,这就是一个响应。

    import requests                                        
    r = requests.get('https://www.baidu.com/')             #使用 .text方法我们可以来查看服务器返回的内容  
    print(r.text)          
    

    你将看到这样的内容

    批注 2019-08-15 213109.png

    上面密密麻麻的地方就是我们在向http://www.baidu.com发送请求,服务器返回给我们的内容。

    大多数时候,Requests会为我们来根据返回的数据的编码格式来进行自动解码,但是有些时候可能解码的结果会是显示一堆乱码,就像下图那样

    批注 2019-08-15 214215.png

    那么我就需要来为我们的程序指定编码格式。

    常见的编码格式有以下几种:

    utf-8

    GBK

    gb2312

    通过下面的方法来进行指定编码

    r.encoding = 'utf-8'
    

    这样我们就可以来访问经过正确解码的内容

    04Requests访问图片

    我们在浏览器中看到的不只是文本,还有音频视频图片,这些格式也是可以进行访问的,只是这些格式是以二进制的形式来进行传输的,所以我们是不能使用文字编码来进行解码的,我们平常看到的mp4、jpg,mp3后缀名的文件,这些其实是一种编码格式,也就是说后缀名为MP4那么这是一个视频文件,打开时会使用MP4的解码器来进行解码,其实文件内部还是使用二进制的数据来进行存储。你可以按照下图简单的理解。(具体过程往大佬指点)

    批注 2019-08-15 220831.png

    编码器和解码器在python中我们无需担心,我要做的就是来获取一张图片的二进制数据,然后存储成我们想要的格式就行了。上文中使用了 .text来获取文本,获取二进制数据的方法则为 .content

    r=requests.get('[](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565888449736&di=fee8f4746a4cca39385184b61b4a106f&imgtype=0&src=http%3A%2F%2Fimg2.ph.126.net%2FJ3JHQOYyAV2xBU84epsR9w%3D%3D%2F4905545894214113834.jpg'))[https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565888508096&di=39a4cb3e4e21e91a5a68f52432974669&imgtype=0&src=http%3A%2F%2Fimg2.ph.126.net%2FJ3JHQOYyAV2xBU84epsR9w%3D%3D%2F4905545894214113834.jpg](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565888508096&di=39a4cb3e4e21e91a5a68f52432974669&imgtype=0&src=http%3A%2F%2Fimg2.ph.126.net%2FJ3JHQOYyAV2xBU84epsR9w%3D%3D%2F4905545894214113834.jpg)')                                
    r1 = r.content 
    

    这个时候r1为二进制数据,我们下面把二进制数据进行存储

    with open('1.jpg','wb') as f:                                   
               f.write(r1)
    

    通过上面的方法,我们可以把我们获取的二进制数据,变成我们电脑是的一张文件名是1.jpg的图片。这里用到了python的open()函数,请自行学习。

    05装成一个浏览器

    我们是使用python来进行的请求数据,对方服务器会发现我们的请求来自于一个不是浏览器的程序,很可能就不会给我们返回内容,那么怎么对对方服务器进行欺骗?

    首先,服务器是来根据我们请求的Headers中的User-Agent来进行判断我们是不是浏览器的。我们只要更改Headers中这一项的值,就可以达到欺骗浏览器的目的。

    url='https://www.baidu.com'                         
    headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64;    x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}                                          
    r = requests.get(url, headers=headers)
    

    这样服务器会认为我们的请求来自于一个浏览器

    user-agent的值我们可以从哪些地方获得?

    你可以打开自己的浏览器,访问任意一个网页,按F12,点击Network,你可以发现里面的值。

    相关文章

      网友评论

          本文标题:入门爬虫第一步,熟悉requests库

          本文链接:https://www.haomeiwen.com/subject/spqxsctx.html