乐趣区

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

理解了爬虫和网络申请,上面就能够开始正式的理解 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())

输入后果如下图

退出移动版