文章目录
学习爬虫,需要了解requests这个简单的库.下面都是我对这方面的理解及简单的介绍,使用的环境是ubuntu16.04+python3.5.2+requests2.9.1+pycharm如有错误欢迎补充.
什么是requests
requests是python实现的简单易用的HTTP库,你可以使用它,把自己的爬虫包装的让web服务器看的时候像一个正常的浏览器.从而实现发送请求获取数据的目的.简单来说,就是__发送网络请求,获取返回的相应数据__使用起来也比urllib简洁很多.
最常见的网络请求库就是urllib和requests.以前用urlib的人比较多,所以很容易在网上搜到一些关于urllib的疑问和解答,但requests的相对来说就少一点.
那么requests相对于urllib有什么区别?
- requests的底层还是urllib
- requests在python2中和3中是一样的用法.但urllib在python2中和python3的名称是不同的等
- requests简单易用,能自动帮助我们解压gzip等内容.urllib需要手动解压
requests的简单使用
安装
pip快速安装
pip3 install requests
发送一个GET请求
我们先来发送一个get请求,需求是:通过requests向百度首页发送请求,获取百度首页的数据.
打开PyCharm:
import requests
# 目标网站的url
url = 'http://www.tjnk.gov.cn/xwzx/'
# 使用requests发送请求,接收响应
response = requests.get(url)
# 打印响应
print(response)
运行结果是一个对象:
<Response [200]>
认识响应对象
我们可以使用print(dir(response)),来查看response响应对象都有哪些使用方法:
['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__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', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url']
其中我们比较常用的有:
response.status_code # 获取响应状态码
response.headers # 获取响应头
response.request # 获取响应对应的请求
response.text # 获取被转成str类型后的响应
response.content # 获取被转成bytes类型后的响应
response.url # 获取响应对应的url
response.request.headers # 获取响应对应的请求的请求体
response.encoding # 获取响应体的编码方式
response.content.decode() # 获取被转成bytes类型后的响应再经过decode解码后的响应
response.cookies # 获取响应的cookie
大家可以在自己的pycharm中一一尝试,这里我们不再进行效果展示
发送一个带headers的GET请求
- 带上headers(请求头)是为了模拟浏览器更加真实,欺骗服务器.
- headers的格式是一个字典{key:value}
- 使用方法: requests.get(url, headers=headres)
import requests
url = 'http://www.tjnk.gov.cn/xwzx/'
headers = {
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
}
response = requests.get(url, headers=headers)
print(response)
print(response.status_code)
运行结果:
<Response [200]>
200
发送一个带参数的GET请求
发送带参数的get请求有两种方法:
- 直接在请求的url中写上参数,如:
# 该url中包含两个参数,一个是值为'wwwt'的fr,一个是值为'hello'的kw,写在url后的?之后,相互之间以&符隔开
url = 'http://tieba.baidu.com/f?fr=wwwt&kw=hello'
- 使用params参数发送参数数据,格式也是一个字典,使用方法如下:
import requests
url = 'http://www.tjnk.gov.cn/xwzx/'
headers = {
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
}
params = {
'fr':'wwwt',
'kw':'hello'
}
response = requests.get(url, headers=headers, params=params)
print(response)
print(response.status_code)
运行结果:
<Response [200]>
200
案例:使用requests方法来爬取某度贴吧的任意吧的前10页并保存
import requests
# 目标站点的url
url = "https://tieba.baidu.com/f?kw=漫威"
# 创建请求头
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"}
# 要发送给目标站点的参数(通过观察目标站点的url的变化发现,当pn值为0时,返回的时该贴吧的第一页.pn值为50时是第二页,以此类推)
pn = 0
# 通过变量i来决定循环的次数(也就是目标贴吧要获取前多少页)
i = 1
while i <= 10:
params = {"pn": pn}
# 发送请求并获取该站点的响应
response = requests.get(url, headers=headers, params=params)
# 将响应写入文件,名为'tieba' + str(i) + ".html"
with open('tieba' + str(i) + ".html", "w") as f:
f.write(response.content.decode())
i +=1
pn += 50
运行结束后在该py文件的同级目录中会依次出现tieba1.html ~tieba10.html文件.
或者还可以使用面向对象的方式进行请求,详细代码如下:
import requests
# 面向对象的方法:创建Tieba类
class Tieba(object):
def __init__(self, name, n):
# 初始化贴吧名称
self.name = name
# 初始化请求的url
self.base_url = "https://tieba.baidu.com/f?kw={}&pn=".format(name)
# 构建url列表
self.url_list = [self.base_url + str(i*50) for i in range(n)]
# 构建请求头
self.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"}
def get_data(self,url):
# 发送请求,获取数据
data = requests.get(url, headers=self.headers)
# 将数据转成二进制bytes类型返回
return data.content
def save_data(self,i,data):
# 保存数据
with open("tieba_" + str(self.name) + "_" + str(i) + ".html", "w") as f:
f.write(data.decode())
def run(self):
i = 1
# 遍历url列表,循环向每个url发送请求
for url in self.url_list:
# 调用Tieba类的 self.get_data()方法并把结果赋值给data变量
data = self.get_data(url)
# 调用Tieba类的 self.save_data()方法
self.save_data(i,data)
i += 1
if __name__ == '__main__':
# 初始化一个tieba对象,并写好参数
tieba = Tieba("漫威",10)
# 运行
tieba.run()
程序运行完毕后,在该py文件的同级目录中,会依次出现tieba_漫威_1.html~tieba_漫威_10.html文件.
下一篇再讲解使用requests库发送post请求.