还在为怎么发送数据而发愁吗,请看本文。
python中几种能对网页发送请求的模块
前言
想要得到网页的一些数据,你就需要先向其发送请求,获取到返回的数据,再写规则,获取想要获取的数据,那么,发送请求的模块都有什么呢?
一、requests模块
他是一个第三方模块,需要pip安装。
1.发送请求方法
源代码中,一共有7种请求方式
requeses.get()
requeses.post()
requeses.options()
requeses.head()
requeses.put()
requeses.patch()
requeses.delete()
而爬虫里面能用到的只有get和post请求,所以学爬虫的主要了解这两个就足够了。
1.get请求
1.get发送请求
源代码
def get(url, params=None, **kwargs):
"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
"""
请求示例
import requests
url = 'https://www.baidu.com'
method: 请求方法 get post
url: 请求网址
params: (可选的) 查询参数
headers: (可选的) 字典 请求头
cookies: (可选的) 字典.cookiejar对象, 用户身份信息
proxies: (可选的) ip代理
data: (可选的) 字典.列表.元组.bytes post请求时会用到
json: (可选的) 字典 提交参数
verify: (可选的) 是否验证证书, ca证书
timeout: (可选的) 设置响应时间,一旦超过,程序会报错
allow_redirects: (可选的) 是否允许重定向, 布尔类型数据
files: (可选的) 字典,文件
auth: (可选的) 字典,权限认证
stream: (可选的) 是否是数据流传输
response = requests.get(url=url,headers=headerrs,params=params,cookies=cookies,proxies=proxies) # 根据情况添加
2.打印响应值
print(response)
"""
1xx:表示临时响应并需要请求者继续执行操作的状态代码
2xx:表示成功处理了请求的状态代码
3xx:要完成请求,需要进一步操作(通常这些代码用来重定向)
4xx:表示请求可能出错,妨碍了服务器的处理
5xx:表示服务器在尝试处理请求时,发生内部错误(这些错误通常是服务器本身的错误,并不是由于请求出错,当然也有可能是访问者的故意为之,使服务器本身出现错误)
"""
3.响应的数据类型
响应的数据可分为文本数据和二进制数据,如图片、视频、音频为二进制数据
# 1.查看文本信息
print(response.text)
# 2.查看二进制数据
print(response.content)
2.post请求
源代码
def post(url, data=None, json=None, **kwargs):
r"""Sends a POST request.
:param url: URL for the new :class:`Request` object.
:param data: (optional) Dictionary, list of tuples, bytes, or file-like
object to send in the body of the :class:`Request`.
:param json: (optional) json data to send in the body of the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
return request('post', url, data=data, json=json, **kwargs)
请求示例
import requests
url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'
headers = {
'Host': 'fanyi.baidu.com',
'Origin': 'https://fanyi.baidu.com',
'Referer': 'https://fanyi.baidu.com/?aldtype=16047',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
}
data = {
'from': 'zh',
'to': 'en',
'query': '你好',
'transtype': '',
'simple_means_flag': '',
'sign': '',
'密钥': '',
'domain': ''
}
cookies = {'',}
response = requests.post(url=url, headers=headers, data=data, cookies=cookies)
print(response.json())
# 基本传参与get相同
想要探讨python,创建一个良好的学习氛围,点击 一发冲天,给你满满的体验感。
二、urllib
urllib作为Python的标准库,基本上涵盖了基础的网络请求功能。
1.发送请求
1. 发起GET请求
主要使用urlopen()方法来发起请求:
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None):
from urllib import request
url = 'https://www.baidu.com'
response = request.urlopen('http://www.baidu.com')
print(response.read())
如若需要添加请求头,则需要另外添加东西,如下
from urllib import request
from urllib.request import Request
url = 'https://www.bbitxt.com/book/1031/1.html'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
urls = Request(url=url,headers=headers)
response = request.urlopen(urls)
print(response.read().decode('utf-8'))
"""
访问的结果会是一个http.client.HTTPResponse对象,使用此对象的read()方法,则可以获取访问网页获得的数据。但是要注意的是,获得的数据会是bytes的二进制格式,所以需要decode()一下,转换成字符串格式。
"""
请求头用headers接收,接着用Request携带
class Request:
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
源代码中,Request能携带url, data, headers,origin_req_host,unverifiable, method
2.发送post请求
urlopen()默认发送get请求,但只需要在urlopen()方法中携带data参数,便可发送post请求,注意,data是字节流编码格式的内容,即bytes类型
示例:
import urllib.parse
from urllib import request
from urllib.request import Request
url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'
headers = {
'Host': 'fanyi.baidu.com',
'Origin': 'https://fanyi.baidu.com',
'Referer': 'https://fanyi.baidu.com/?aldtype=16047',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
}
datas = {
'from': 'zh',
'to': 'en',
'query': '你好',
'transtype': '',
'simple_means_flag': '',
'sign': '',
'密钥': '',
'domain': ''
}
urls = Request(url=url,headers=headers)
data = bytes(urllib.parse.urlencode(datas), encoding='utf8')
response = urllib.request.urlopen(urls, data=data)
print(response.read().decode('utf-8'))
三、urllib3
需要通过pip 进行下载
1.发送请求
1.发送get请求
源代码
def request(self, method, url, fields=None, headers=None, **urlopen_kw):
示例
import urllib3
req = urllib3.PoolManager()
url = 'http://www.baidu.com/s'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = req.request('GET', url, fields={'ie': 'UTF-8', 'wd': '图片'}, headers=headers)
result = response.data.decode('UTF-8')
print(result)
2.发送post请求
import urllib3
url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'
headers = {
'Acs-Token': '',
'Host': 'fanyi.baidu.com',
'Origin': 'https: // fanyi.baidu.com',
'Referer': 'https: // fanyi.baidu.com /?aldtype = 16047',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
}
params = {
'from': 'zh',
'to': 'en',
'query': '你好',
'transtype': 'realtime',
'simple_means_flag': '3',
'sign': '',
'密钥': '',
'domain': '',
}
http = urllib3.PoolManager()
res = http.request('POST', url, headers = headers, fields = params)
result = res.data.decode('UTF-8')
print(result)
4.selenium
该模块个人认为算不上专门发送请求的模块,他主在于网页的自动化操作,想要使用该模块,查看我的网页自动化获取天气情况以及播报这篇文章,里面有谷歌驱动的下载,模块的使用。
注意:在使用时驱动放在当前文件目录下或者放在python解释器目录下
总结
注:源代码是为了让大家了解都能传什么参数。
urllib 是一个内置官方标准库,无需下载;它是python2中的 urllib 与 urllib2 的合并,urllib3 库是第三方标准库, 解决了线程安全,增加了连接池等功能,urllib与urllib3 相互补充,而urllib3明显高于urllib,而在发送请求这方面,我更喜欢用requests模块,用着简单。