Python(爬虫篇)---Requests模块

一、Requests简介

1. requests库简介

Urllib 和 Requests 模块是发起 http 请求最常见的模块。

虽然 Python 的标准库中 urllib 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称“http for Humans”,说明使用更简洁方便。

Requests继承了urllib的所有特性。Requests支持http连接保持和连接池,支持使用cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数 据自动编码。

**requests 的底层实现其实就是 urllib3(urllib2 的升级版—python2 支持) **
Requests 的文档非常完备,中文文档也相当不错。Requests 能完全满足当前网络的需求, 支持 Python 2.6—3.6。

开源地址:http://github.com/kennethreitz/requests
中文文档 API:http://2.python-requests.org/zh_CN/latest/

2. 安装方式

利用 pip 安装或者利用 easy_install 都可以完成安装:
$ pip install requests

二、GET请求

  1. 导入requests
  2. 发送请求,返回响应
    • 确定请求的URL
    • 确定请求方式get
  3. 保存文件(html)

1. 全页面保存

例:将百度产品大全页面保存到本地

import requests
response = requests.get(url='https://www.baidu.com/more/')
with open('百度产品大全.html','w',encoding='utf-8') as fp:
     fp.write(response.text)

发现问题:

  1. 中文乱码
  2. 图片不显示

解决:

  1. 中文乱码:最根本原因是编码问题
    content:获取页面二进制类型内容,使用content.decode(‘编码格式’),默认是utf-8大部分网页都是使用utf-8或者是gbk,解码时,尝试使用utf-8,如果乱码没有解决,换成gbk基本可以。如果还没有解决,使用response.encoding来解决
import requests
response = requests.get(url='https://www.baidu.com/more/')
with open('百度产品大全.html','w',encoding='utf-8') as fp:
     fp.write(response.content.decode())
  1. 图片不显示:图片是本地路径,我们本地没有,所以,不显示。
text和content的使用情况
  1. text获取页面文本类型数据,在大部分使用text获取数据时都不会出现乱码情况,如果乱码,使用content.decode()解决乱码。
  2. content()获取页面二进制类型的内容,在下载图片、视频、音频等媒体文件时,必须使用content()

2. params属性

当请求携带参数,参数少时可以直接写在url上,当参数过长则及其不方便,此时使用params属性加载参数。
params作用:自动的将参数按照地址栏的参数形式拼接

提取参数
在请求时传入参数params,接收字典类型数据,get请求的参数是放在Query String Parameters中,get请求时,传递的关键字参数是params

例:将新浪搜索python的页面保存至本地

import requests

params = {  # 定义参数字典
    'q': 'python',
    'c': 'news'
}

response = requests.get(url='http://search.sina.com.cn/', params=params)

with open('新浪搜索-python.html', 'w', encoding='utf-8') as fp:
    fp.write(response.text)

3. headers属性

  1. 不管写什么爬虫,都加上请求头,至少加一个UA
  2. 如果加入UA之后还是访问不到数据,尝试加入cookie
  3. 如果加入cookie还是不好用,将全部的请求头都加入,以:开头的请求头不要加入

例:自定义百度搜索

import requests

# 自定义搜索内容
wd = input('请输入想要查询的内容:')

params = {
    "wd": "python"
}

headers = {  # 定义请求头字典
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
response = requests.get(url='https://www.baidu.com/s', params=params, headers=headers)

print(response.headers)

with open(f'{wd}.html', 'w', encoding='utf-8') as fp:
    fp.write(response.text)

三、POST请求

类似百度实时翻译的页面,输入一个单词实时出现翻译以及联想翻译,这种并不是get请求,而是post请求,

步骤与get相同:

  1. 导入requests
  2. 发送请求,返回响应
    • 确定请求的URL
    • 确定请求方式post
  3. 保存文件(html)

1. data属性

如果是post请求,需要携带参数,加入data的关键字参数,data接收字典格式数据

2. header属性

与get相同,都需要携带请求头属性,
如果获取异步请求的数据,最好将x-requested-with: XMLHttpRequest加入到请求头中

例:用户自定义输入单词,获取解释

import requests

# 自定义用户输入
kw = input('请输入想要查询的单词:')

# 定义参数字典
data = {
    'kw':kw
}
# 定义请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
    'x-requested-with': 'XMLHttpRequest'
}

# 发起请求,接收响应
response = requests.post(url='https://fanyi.baidu.com/sug',data=data,headers=headers)

# 使用json()可以将json格式的字符串转换成字典
data_list = response.json()['data']

# 获取数据
for data in data_list:
    # 获取单词
    word = data['k']
    # 获取解释
    explain = data['v']
    print(word,explain)
    ...
  • 30
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值