关于python:爬虫系列-4详解Requests的用法

3次阅读

共计 4609 个字符,预计需要花费 12 分钟才能阅读完成。

理解了爬虫和网络申请,上面就能够开始正式的理解 Python 中爬虫相干的模块了

很多爬虫相干的书籍个别刚开始都会讲一下 urllib 模块,等你跟着书中的学完之后,会通知你 urllib 模块用起来比较复杂,通常不应用

的确,urllib 是一个比拟古老的模块,封装的爬虫办法也绝对简单。所以能够间接开始撸 requests 模块.

Requests 模块的作用就是模仿浏览器发送申请。是 Python 中原生的一款基于网络申请的模块,不仅功能强大,而且应用起来也比较简单!

模块的装置

间接通过 pip 进行装置即可

pip install requests

应用起来也十分的简略,分为三步

  • 指定 URL,也就是说你要爬取的网站地址
  • 发送申请,申请又分为 GET/POST/PUT/DELETE 等等
  • 获取响应数据

这样看是不是非常简单呢?废话不多说,来个简略的例子,比方我须要爬取百度的首页

GET 申请

# 导入模块
import requests

url = 'https://www.baidu.com'
# 发送 get 申请
response = requests.get(url)
# 获取网页源代码
baidu_html = response.text
# 将获取的数据进行长久化(保留)with open('baidu.html', 'w', encoding='utf-8') as f:
    f.write(baidu_html)

执行之后就会在同级目录下有个 baidu.html 的文件。

以上就是一个最最最根本的应用 requests 发送 get 申请的例子。同样如果发送其余申请比方 POST/PUT/HEAD 等等

requests.post(url)
requests.delete(url)
requests.put(url)
...

在发送申请的时候,大部分时候会携带一些参数的。比方咱们进行搜寻的时候,发送的 GET 申请就会携带搜寻内容

比方我在百度上搜寻 python 时,url 是 https://www.baidu.com/s?wd=python


为了使爬虫程序更加灵便,必定要将搜寻的内容进行拆散。能够通过构建一个字典参数,发送 GET 申请

import requests

# 输出搜寻的关键词
wd = input('请输出要搜寻的内容:\n')
url = 'https://www.baidu.com/s?'
# 构建 get 申请的搜寻参数
url_param = {'wd': wd}
# 避免爬虫被拦挡,减少申请的 UA
header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
# 发送 GET 申请
response = requests.get(url, params=url_param, headers=header)
# 获取网页源代码
wd_html = response.text
# 写入文件,长久化操作
with open('wd.html', 'w', encoding='utf-8') as f:
    f.write(wd_html)

具体的 GET 用法如下

# url 拜访的地址
# params 携带的参数
# **kwargs 其余参数,比方申请头、cookie、代理(proxies)等等
def get(url, params=None, **kwargs):

POST 申请

应用 httpbin 网站进行测试

httpbin 是一个能测试 HTTP 申请和响应的网站,反对各种申请办法

1、以 form 表单的模式提交参数,只须要将申请参数结构成一个字典,传给 data 参数即可。

import requests

url = 'http://httpbin.org/post'
params = {'name': '公众号:Python 极客专栏', 'language': 'python'}
response = requests.post(url, data=params)
print(response.json())

执行后果:

{'args': {},
    'data': '','files': {},'form': {'language':'python','name':' 公众号:Python 极客专栏 '},'headers': {'Accept':'*/*','Accept-Encoding':'gzip, deflate','Content-Length':'99','Content-Type':'application/x-www-form-urlencoded','Host':'httpbin.org','User-Agent':'python-requests/2.22.0','X-Amzn-Trace-Id':'Root=1-5fef5112-65ad78d4706c58475905fef2'},'json': None,'origin':'',
    'url': 'http://httpbin.org/post'
}

2、以字符串的模式提交参数,通过 json.dumps 将字典转换成字符串

import requests
import json

header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
url = 'http://httpbin.org/post'
params = {'name': 'Tom', 'hobby': ['music', 'game']}
# 通过 json.dumps 将字典格式化为 json 字符串
response = requests.post(url, json=json.dumps(params), headers=header)
print(response.json())

执行后果:

{'args': {},
    'data': '"{\\"name\\": \\"Tom\\", \\"hobby\\": [\\"music\\", \\"game\\"]}"',
    'files': {},
    'form': {},
    'headers': {
        'Accept': '*/*',
        'Accept-Encoding': 'gzip, deflate',
        'Content-Length': '55',
        'Content-Type': 'application/json',
        'Host': 'httpbin.org',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36', # 申请中退出的 headers 在这里也能够看到
        'X-Amzn-Trace-Id': 'Root=1-5fef583e-5224201d08e2ff396416e822'
    },
    'json': '{"name":"Tom","hobby": ["music","game"]}',
    'origin': '','url':'http://httpbin.org/post'
}

3、应用 post 申请提交文件(以 multipart 模式)

import requests
import json

header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
url = 'http://httpbin.org/post'
# 读取 baidu.html 文件,'rb': 以二进制模式读取
files = {'file': open('baidu.html', 'rb')}
# post 模式传入 file 文件
response = requests.post(url, files=files)
print(response.json())

执行后果:

{'args': {},
    'data': '','files': {'file':'<!DOCTYPE html>..... 此处省略 HTML 内容...'},'form': {},'headers': {'Accept':'*/*','Accept-Encoding':'gzip, deflate','Content-Length':'2732','Content-Type':'multipart/form-data; boundary=1ba2b1406c4a4fe89c1846dc6398dae5','Host':'httpbin.org','User-Agent':'python-requests/2.22.0','X-Amzn-Trace-Id':'Root=1-5fef58f8-68f9fb2246eb190f06092ffb'},'json': None,'origin':'',
    'url': 'http://httpbin.org/post'
}

响应的解决

通过 GET/POST 等申请会获取到服务器的响应,也就是下面例子中的response。改如何获取更多的信息呢?

import requests

headers = {
    'referer': 'https://www.baidu.com',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
url = 'http://httpbin.org/post'
# 读取 baidu.html 文件,'rb': 以二进制模式读取
files = {'file': open('baidu.html', 'rb')}
# post 模式传入 file 文件
response = requests.post(url, files=files, headers=headers, cookies={'test': 'abcdefg'})
# response 的解决
# 指定编码
response.encoding = 'utf-8'
print(response.url) # 申请的 url
print(response.encoding) # 申请的编码、print(response.status_code) # 状态码
print(response.content) # 响应内容的二进制模式(保留文件、图片、音频等)print(response.text) # 响应内容的文本模式
print(response.json()) # 响应内容的 json 模式
print(response.headers) # 响应头信息
print(response.request.headers) # 申请头信息
print(response.request.headers['referer']) # 申请头对应属性的内容
print(response.cookies) # cookie 信息,返回的 cookie 对象
print(response.cookies.items())

输入后果如下图

正文完
 0