爬虫 之Requests库的详细使用

1、什么是Requests?

Requests是用Python语言编写的,基于urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库。

它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。

一句话---Python实现的简单易用的HTTP库。

 

1.1基本用法

安装Requests

pip3 install requests

 

 

#各种请求方式:常用的就是requests.get()和requests.post()
>>> import requests
>>> r = requests.get('https://api.github.com/events')
>>> r = requests.post('http://httpbin.org/post', data = {'key':'value'})
>>> r = requests.put('http://httpbin.org/put', data = {'key':'value'})
>>> r = requests.delete('http://httpbin.org/delete')
>>> r = requests.head('http://httpbin.org/get')
>>> r = requests.options('http://httpbin.org/get')

 

 

 

1.3 GET 请求

首先,构建一个最简单的GET请求,请求的链接为http://httpbin.org/get,该网站会判断如果客户端发起的是GET 请求的话,他返回相应的请求信息:

import requests

r = requests.get('http://httpbin.org/get')
print(r.text)

 

可以发现,我们成功发起了GET请求,返回结果中包含请求头,URL,IP等信息。

那么,对于GET 请求,如果要附加额外的信息,一般怎么添加呢?比如现在想添加两个参数,其中name是germery,age是22.哟构造这个请求链接,是不是可以直接写成:

r = requests.get('http://httpbin.org/get?name=germery&age=22')

这样也可以,但是一般情况下,这种信息数据会用字典来存储。那么怎么构造这个链接呢?---->利用params这个参数就好了,示例如下:

import requests

data = {
    'name':'germary',
    'age':22
}

r = requests.get('http://httpbin.org/get',params=data)
print(r.text)

 

通过运行结果可以判断,请求的链接自动被构成了:http://httpbin.org/get?name=germery&age=22。

另外,网页的返回类型实际上是str类型,但是他很特殊,是JSON格式的。所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用json()方法,示例如下:

import requests



r = requests.get('http://httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))

可以发现,调用json()方法,就可以将返回结果是JSON格式的字符串转化为字典。

但需要注意的是,如果返回的结果不是JSON 格式,便会出现解析错误,抛出json.decoder.JSONDecoderError异常。

 

抓取网页

上面的请求链接返回的是JSON形式的字符串,那么如果请求普通的网页,则肯定能获得相应的内容了。下面以‘’知乎‘’----->‘’发现‘’页面为例来看一下:

import requests

import re

headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) '
                 'Chrome/72.0.3626.121 Safari/537.36'

}

r = requests.get('https://www.zhihu.com/explore',headers=headers)
pattern = re.compile('explore-feed.*?question_link.*?>(.*?)</a>',re.S)

titles = re.findall(pattern,r.text)
print(titles)

这里我们加入headers信息,其中包含了User-Agent字段信息,也就是浏览器标识信息。如果不加这个,知乎会禁止抓取。

接下来我们用到了最基础的正则表达式来匹配出所有的问题内容。关于正则表达式的内容我会单独写篇博客,这里作为实例来配合讲解。

运行结果如下:

['\n如何进行完备而高效的法律检索?\n', '\n怎样用C语言画出一个佛祖?\n', '\n捡到狗是什么体验?\n', '\n为什么男生追到一半就不追了?\n', '\n野比大雄为什么被称为野比海皇,具体有哪些事迹?\n', '\n人的努力可以有多可怕?\n', '\n你遇到过最有教养的人是什么样的?\n', '\n欧美有没有中国当代作家的书卖的很好,任何行业的都行?\n', '\n德云社的哪个演员最会说话/双商高?\n', '\n为什么路飞的船停在码头敌人都不会破坏船呢?\n']

我们发现,这里成功的提取出了所有的问题内容。

 

 

抓取二进制数据

在上面的例子中,我们抓取的是知乎的一个页面,实际上他返回的是一个HTML文档。如果想要抓取图片、音频、视频、等文件,应该怎么办呢?

图片、音频、视频这些文件本质上都是有二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以,想要抓取他们,就要拿到他们的二进制码。

下面以GitHub的站点图标为例来看一下:

import requests


response = requests.get('https://github.com/favicon.ico')

print(response.text)
print(response.content)

这里抓取的内容是站点图标,也就是浏览器在每一个标签上的小图标,如下图所示

爬虫 之Requests库的详细使用

这里打印了Response对象的两个属性,一个是text,一个是content。

运行结果如下图所示,其中前两行是response.text的结果,最后一行是response.content的结果。

爬虫 之Requests库的详细使用

 

可以注意到的,前者出现了乱码,后者结果前带了一个b,这代表是bytes类型的数据。由于图片是二进制数据,所以前者在打印是转化为str类型,也就是图片直接转化为字符串,这理所当然会出现乱码。

接着,我们将刚才的提取到的图片保存下来:

import requests


response = requests.get('https://github.com/favicon.ico')
with open('favicon.ico','wb')as f:
    f.write(response.content)

 

这里用了open()方法,他的第一个参数是文件名称,第二个参数以二进制写的形式打开,可以向文件里写入二进制数据。

运行结束之后,可以发现在文件夹中出现了名为favicon.ico的图标,如图:

爬虫 之Requests库的详细使用

 

 

同样的,音频和视频文件也可以用这种方式获取。

 

 

添加headers

与urllib.request一样,我们也可以通过headers参数来传递头信息。

比如,在上面‘’知乎‘’的例子中,如果不传递headers,就不能正常请求:

爬虫 之Requests库的详细使用

 

但是如果加上headers并加上User-Agent信息,那就没问题了:

当然,我们可以在headers这个参数中任意添加其他的字段信息。

 

上一篇:requests的使用


下一篇:4.爬虫 requests库讲解 GET请求 POST请求 响应