当前位置:   article > 正文

【python中几种能对网页发送请求的模块】_python如何向网站发送请求

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.
   
    """
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

请求示例

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) # 根据情况添加
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
2.打印响应值
print(response)
"""
1xx:表示临时响应并需要请求者继续执行操作的状态代码
2xx:表示成功处理了请求的状态代码
3xx:要完成请求,需要进一步操作(通常这些代码用来重定向)
4xx:表示请求可能出错,妨碍了服务器的处理
5xx:表示服务器在尝试处理请求时,发生内部错误(这些错误通常是服务器本身的错误,并不是由于请求出错,当然也有可能是访问者的故意为之,使服务器本身出现错误)
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
3.响应的数据类型

响应的数据可分为文本数据和二进制数据,如图片、视频、音频为二进制数据

# 1.查看文本信息
print(response.text)
# 2.查看二进制数据
print(response.content)
  • 1
  • 2
  • 3
  • 4

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

请求示例

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相同
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

想要探讨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):

  • 1
  • 2
  • 3
from urllib import request

url = 'https://www.baidu.com'
response = request.urlopen('http://www.baidu.com')
print(response.read())
  • 1
  • 2
  • 3
  • 4
  • 5

如若需要添加请求头,则需要另外添加东西,如下

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()一下,转换成字符串格式。
"""
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

请求头用headers接收,接着用Request携带

class Request:

    def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):
  • 1
  • 2
  • 3
  • 4
  • 5

源代码中,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'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

三、urllib3

需要通过pip 进行下载

1.发送请求

1.发送get请求

源代码

def request(self, method, url, fields=None, headers=None, **urlopen_kw):
  • 1

示例

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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

4.selenium

该模块个人认为算不上专门发送请求的模块,他主在于网页的自动化操作,想要使用该模块,查看我的网页自动化获取天气情况以及播报这篇文章,里面有谷歌驱动的下载,模块的使用。
注意:在使用时驱动放在当前文件目录下或者放在python解释器目录下


总结

注:源代码是为了让大家了解都能传什么参数。
urllib 是一个内置官方标准库,无需下载;它是python2中的 urllib 与 urllib2 的合并,urllib3 库是第三方标准库, 解决了线程安全,增加了连接池等功能,urllib与urllib3 相互补充,而urllib3明显高于urllib,而在发送请求这方面,我更喜欢用requests模块,用着简单。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/278927
推荐阅读
相关标签
  

闽ICP备14008679号