zl程序教程

您现在的位置是:首页 >  其他

当前栏目

4-06python语法基础-内置模块-urllib模块,以及第三方模块requests的使用,cookie字典生成式,切url的末尾字符串

基础模块Cookie 字符串 以及 语法 url 第三方
2023-09-14 09:00:32 时间

###

官方文档:https://docs.python.org/zh-cn/3/library/urllib.request.html#module-urllib.request

###

urllib模块介绍:

一共是四块,

urllib.request - 打开和读取 URL。
urllib.error - 包含 urllib.request 抛出的异常。
urllib.parse - 解析 URL。
urllib.robotparser - 解析 robots.txt 文件。

 

###

基本使用

from  urllib import parse
from  urllib import request
from  urllib import response
from  urllib import error
from  urllib import robotparser

# url = "https://www.baidu.com/"
url = "https://www.runoob.com/"
resp = request.urlopen(url)
# print(resp)
print(resp.status)
print(resp.getcode())
# print(resp.url)
# print(resp.headers)
# print(resp.read())
# print(resp.readlines())
"""
getcode()  ---- 效果就是status的效果,
使用 read() 函数获取网页的 HTML 实体代码。  # 这是一个二进制的
readline() - 读取文件的一行内容
readlines() - 读取文件的全部内容,它会把读取的内容赋值给一个列表变量。
URL 的编码与解码可以使用 urllib.request.quote() 与 urllib.request.unquote() 方法:
"""

####

设置headers,

import urllib.request
# import urllib.parse

url = 'https://www.runoob.com/?s='  # 菜鸟教程搜索页面
keyword = 'Python 教程'
key_code = urllib.request.quote(keyword)  # 对请求进行编码
url_all = url+key_code
header = {
    'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}   #头部信息
request = urllib.request.Request(url_all,headers=header)
print(request)  # 打开统一资源定位符 url,可以是一个字符串或一个 Request 对象。

reponse = urllib.request.urlopen(request).read()


###

快捷下载图片或者html文本

from  urllib import request

imgurl = 'xxx' 
request.urlretrieve(imgurl,"./myimg.jpeg")

 

###

requests模块

这个是第三方模块,需要安装

pip install requests

###

http的8种请求方式:get,post,put,delete,option,trace,connect,head,

主要就是get和post,

### 

request源码分析

# requests源码解析,

import requests
requests.get(url,)

# 里面除了url参数还有什么参数?
#看源码,这个get请求是取调用了request,
def get(url, params=None, **kwargs):
    kwargs.setdefault('allow_redirects', True)
    return request('get', url, params=params, **kwargs)

# 然后request最后是返回了session.request()
def request(method, url, **kwargs):
    with sessions.Session() as session:
        return session.request(method=method, url=url, **kwargs)

# 而session.request()里面有很多的参数,
def request(self, method, url,
            params=None, data=None, headers=None, cookies=None, files=None,
            auth=None, timeout=None, allow_redirects=True, proxies=None,
            hooks=None, stream=None, verify=None, cert=None, json=None): XXX

# 参数解释
# data 这是携带请求体里面的数据,字典格式,    
# headers 这是携带请求头,字典格式,
# cookies 这是携带请求的cookies信息,字典格式,
# proxies 这个是使用代理,也是字典格式,
# verify 如果是https请求,把这个=FALSE,就是不校验证书,

 

###

分析response响应数据

import requests

res = requests.get(url)

print(dir(res))

#通过这个dir查看一下这个返回值,有什么方法?
[ 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 
'headers', 'history', 'is_permanent_redirect', 'is_redirect', 'iter_content', 'iter_lines', 'json',
'links', 'next', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url'] #去掉双下划线的方法,解释一下这些方法, # content,返回一个二进制的响应内容, # cookies,打印出cookies信息, # encoding,打印出编码类型 # headers,打印出headers信息, # status_code,打印状态码 # text,打印出编码后的响应内容 # url,打印出本次请求的url,

### 

python-使用字典推导式把cookie从字符串转换成字典

cookies = "vaptchaNetway=cn; Hm_lvt_337e99a01a907a08d00bed4a1a52e35d=1628248083,1629106799; " \
          "sessionid=g1siko0evn5hmnn3pbgl0vaoqjx29cfo; Hm_lpvt_337e99a01a907a08d00bed4a1a52e35d=1629124377"

# 不使用字典推导式的写法
cookie_list = cookies.split(";")
cookie_dict = {}
print(cookie_list)
for cookie in cookie_list:
    cookie_dict[cookie.split("=")[0].strip()] = cookie.split("=")[1].strip()

print(cookie_dict)

# 使用字典推导式的写法
print({cookie.split("=")[0].strip():cookie.split("=")[1].strip()for cookie in cookies.split(";")})

###

切url的末尾字符串

url = "http://n.sinaimg.cn/news/1_img/upload/cf3881ab/67/w1000h667/20200710/1349-iwasyei8902095.jpg"

# 三种办法 切到----1349-iwasyei8902095.jpg
print(url.split("/")[len(url.split("/"))-1])  # 取值列表的最后一个元素
print(url.split("/")[-1])  # 取值列表的最后一个元素
print(url.rsplit("/",1)[1])  # 这个就是从右侧分隔字符串,分隔一次,所以要取第二个,

 

###

requests报错解决

requests.exceptions.SSLError: HTTPSConnectionPool(host='www.kuaidaili.com', port=443): Max retries exceeded with url: /free/inha/2/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)')))

解决方法:

requests.get(url.format(i), headers=headers, cookies=cookie_dict, verify=False)

重点是增加 verify=False

可能会有一个警告,

增加2行代码,去掉警告,

import urllib3

urllib3.disable_warnings()

 

####

固定header头顺序

在使用 requests 发送 post 请求时保持 headers 的顺序不变

import requests

url = "xxx"
headers = {
    "Host": "match.yuanrenxue.com",
    "Connection": "keep-alive",
    "Content-Length": "0",
    "Origin": "http://match.yuanrenxue.com",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
    "Accept": "*/*",
    "Referer": "http://match.yuanrenxue.com/match/3",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.9",
}
# 先session
session=requests.Session()
# 后session clear,clear这个是比较关键的写法。
session.headers.clear()
session.headers.update(
    headers
)
resp=session.post(url)

####

requests添加代理

import requests

proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}

requests.get("http://example.org", proxies=proxies)

 

####

打印你请求的headers

print(response.request.headers)

 

 

####

 

 

 

####