Python爬虫之requests的基本使用

概述

本章节主要介绍本项目中需要用到的知识点

导入模块

要使用requests模块,首先需要导入该模块,如:import requests

发送请求

requests能够发送几乎所有类型的网络请求,如GETPOSTPUTPATCHDELETEHEADOPTIONS等,具体使用如下:

r = requests.get('https://www.baidu.com')
r = requests.post(https://www.baidu.com)
r = requests.put('https://www.baidu.com')
r = requests.patch('https://www.baidu.com')
r = requests.delete('https://www.baidu.com')
r = requests.head('https://www.baidu.com')
r = requests.options('https://www.baidu.com')

正如上面的各种方法,每一种网络请求其实都是requests模块(对象)的一个属性,直接调用该方法就可以发送具体的网络请求

GET请求

在这里,我们主要通过一个小例子来具体介绍一下GET请求的用法,其他方法的请求类似,就不一一细说了
小墨鱼在逛论坛,突然看到篇文章介绍,Chrome非常好用,然后A君内心蠢蠢欲动,这个时候,他就打开了个网页,叫做百度一下,网址是:https://www.baidu.com/,他在页面上中间的输入框部分输入了Chrome,然后页面就跳转到了一个新的页面,网址为:

https://www.baidu.com/s?wd=Chrome&rsv_spt=1&rsv_iqid=0xd977689a0002d37b&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=7&rsv_sug1=6&rsv_sug7=101&rsv_t=f286JF3qYNnhAfxAhxzUpQAPb%2F4%2F0mCrJTGW5uz5b8nGl17Af%2FJZthpqEzH1OdImeLci&inputT=5129&rsv_sug4=5641

该页面就跟上面的网址一样复杂,内容繁多,小墨鱼看得眼花缭乱,感觉第一页的内容都不是他想要的,然后他点了一下第二页,然后啪啦啪啦,又有一个新的网址:

https://www.baidu.com/s?wd=Chrome&pn=10&oq=Chrome&tn=baiduhome_pg&ie=utf-8&usm=4&rsv_idx=2&rsv_pq=a32297f7000327f8&rsv_t=6200AfhaY4p18yGFKXyTcWxLipZ%2FR%2Bb2yt7S3phVvOoEJ7GR5%2BfRJ8muChccyKPzMKDm

由于小墨鱼家里的网速不太好,页面加载内容有点慢,作为半个程序猿的小墨鱼无法忍受这些事情,而他又想ZZB,然后他分析了一下这三个网址,采用最笨拙的方法,在浏览器删除URL的参数(具体过程就不细述啦(#^.^#)),最终得到了两个重要的信息

  • wd: 搜索的关键字
  • pn: 页码的编号,第二页为10,第三页为20,以此类推

小墨鱼兴高采烈地打开了VS Code,准备用他这两天学习的Python来模拟浏览器请求这个网页。

发送GET请求

import requests

url = 'https://www.baidu.com'
rsp = requests.get(url)
print(rsp)

执行上面的代码,我们在命令行里面打印了

打印出来的信息告诉我们,我们发送的请求得到了回应,并且http的状态码为200,也就是说,我们的请求成功发送,并且成功返回了。
但是,相对来说,我们更想知道返回的内容。

响应内容

我们首先可以查看rsp的属性,如下:

['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', '_next', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']

其中,json主要是用来处理json数据格式的响应,contenttext都可以查看响应的内容,这两个的区别主要在于编码

text

通过print(rsp.text)我们发现,命令行报错了,这里面主要是因为,使用rsp.text的时候,Requests会自动解码来自服务器的内容.大多数unicode 字符集都能被无缝地解码。但是本页面就有特殊的。。。,为此,我们手动转码,转码后可以正常显示

print(rsp.encoding)
rsp.encoding = 'utf-8'
print(rsp.text)

content

同上,print(rsp.content)虽然没有报错,但是打印出来的中文乱码了,因为rsp.content不会自动转码,而它的格式默认是bytes,可以用decode解码,也就是rsp.content.decode('utf-8')

json

json的使用方式为,rsp.json()这里主要是将json格式的字符串转换为json对象,当然也可以用json模块进行转换

请求参数

以上所说的都是请求百度首页,但是如果我们想要搜索Chrome呢,我们根据分析已经知道具体的URL是: https://www.baidu.com/s?wd=Chrome,相对请求首页来说,这里面多了参数,url的参数,也就是我们GET方法的参数
GET方法我们有两种方式来处理参数,第一种是直接拼接到URL上面去,也就是说我们可以请求该地址

import requests


url = 'https://www.baidu.com/s?wd=Chrome'
rsp = requests.get(url)

另一种就是用requests模块封装好的方法,Requests允许你使用params关键字参数,以一个字符串字典来提供这些参数。

import requests


url = 'https://www.baidu.com/s'
params = {
    'wd': 'Chrome'
}
rsp = requests.get(url, params=params)

然而,执行了上面的代码,并没有得到我们想要的结果,并没有返回相对应的页面,这是为啥呢,且听下回分解。。。O(∩_∩)O哈哈~