Python urllib request模块发送请求实现过程解析


Posted in Python onDecember 10, 2020

1.Request()的参数

import urllib.request

request=urllib.request.Request('https://python.org')
response=urllib.request.urlopen(request)
print(response.read().decode('utf-8'))

通过构造这个数据结构,一方面可以我们可以将请求独立成一个对象,另一方面可以更加丰富和灵活地配置参数。

它的构造方法如下:

class.urllib.request.Request(url,data=None,headers={},origin_rep_host=None,unverifiable=False,method=None)

参数:

1.url必传参数

2.data,必须传bytes类型。如果是字典,先使用urllib.parse里的urlencode()

3.headers,是一个字典,请求头,直接构造或者用add_header()方法添加

4.origin_rep_host,请求方的名称或者ip地址

5.unverifiable,默认为false,表示这个请求是否无法验证。如果没有抓取的权限,此时值就是true。

6.method,用来指示请求使用的方法。

尝试传入多个参数构建请求:

from urllib import request,parse

url='http://httpbin.org/post'
headers={
  'Url-Agent':'Mozilla/4.0(compatible;MSIE 5.5;Windows NT)',
  'Host':'httpbin.org'
}#也可以使用add_header()方法添加headers:#req=request.Request(url=url,data=data,method='POST')#req.add_header('User-Agent','Mozilla/4.0(compatible;MSIE 5.5;Windows NT)')
dict={
  'name':'Germey'
}
data=bytes(parse.urlencode(dict),encoding='utf-8')#用urlencode()将dict转换成bytes类型,传递给data
req=request.Request(url=url,data=data,headers=headers,method='POST')
response=request.urlopen(req)
print(response.read().decode('utf-8'))

运行结果:

Python urllib request模块发送请求实现过程解析

2.Handler与Opener

Handler:

它是各种处理器,几乎可以做到HTTP请求中的所有事情。

urllib.request模块里的BaseHandler类,它是所有其他Headler的父类,它提供了最基本的方法。

Opener:

例如urlopen()就是一个Opener,它是urllib为我们提供的。

它们的关系是:使用Handler来构建Opener。

3.用法

验证:

创建一个需要验证的网站,我这里使用的是IIS

Python urllib request模块发送请求实现过程解析

遇到的问题:

IIS怎样安装与配置-百度经验 (baidu.com)

IIS网站如何设置基本身份验证-百度经验 (baidu.com)

window10家庭版解决IIS中万维网服务的安全性中无Windows身份验证 - enjoryWeb - 博客园 (cnblogs.com)

代码:

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError

username='username'#填上自己的用户名和密码
password='password'
url='http://localhost:5000/'

p=HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)#添加用户名和密码,建立了一个处理验证的Handler
auth_handler=HTTPBasicAuthHandler(p)#基本认证
opener=build_opener(auth_handler)#利用Handler构建一个Opener

try:
  result=opener.open(url)#打开链接
  html=result.read().decode('utf-8')
  print(html)#结果打印html源码内容
except URLError as e:
  print(e.reason)

代理:

添加代理,在本地搭建一个代理,运行在9743端口上。

代码:

from urllib.request import ProxyHandler,build_opener
from urllib.error import URLError

proxy_handler=ProxyHandler({
  'http':'http://127.0.0.1:9743',
  'https':'https://127.0.0.1:9743'
})#构建一个Handler
opener=build_opener(proxy_handler)#构建一个Opener
try:
  response=opener.open('https://www.baidu.com')
  print(response.read().decode('utf-8'))
except URLError as e:
  print(e.reason)

Cookies:

将网站的Cookies获取下来:

代码:

import http.cookiejar,urllib.request

cookie=http.cookiejar.CookieJar()#声明一个CookieJar对象
handler=urllib.request.HTTPCookieProcessor(cookie)#构建一个Handler
opener=urllib.request.build_opener(handler)#构建一个Opener
response=opener.open('http://www.baidu.com')
for item in cookie:
  print(item.name+"="+item.value)

运行结果:

Python urllib request模块发送请求实现过程解析

将Cookie输出成文件格式:

代码:

import http.cookiejar,urllib.request

filename='cookies.txt'

cookie=http.cookiejar.MozillaCookieJar(filename)
#MozillaCookieJar()生成文件时用到,用来处理Cookie和文件相关的事件
#如果要保存LWP格式的Cookies文件,可以改为:
#cookie=http.cookiejar.LWPCookieJar(filename)

handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener(handler)
response=opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True,ignore_expires=True)

运行结果:

# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file! Do not edit.

.baidu.com  TRUE  /  FALSE  1638359640  BAIDUID  9BB1BA4FDD840EBD956A3D2EFB6BF883:FG=1
.baidu.com  TRUE  /  FALSE  3754307287  BIDUPSID  9BB1BA4FDD840EBD25D00EE8183D1125
.baidu.com  TRUE  /  FALSE    H_PS_PSSID  1445_33119_33059_31660_33099_33101_26350_33199
.baidu.com  TRUE  /  FALSE  3754307287  PSTM  1606823639
www.baidu.com  FALSE  /  FALSE    BDSVRTM  7
www.baidu.com  FALSE  /  FALSE    BD_HOME  1

LWP格式:

#LWP-Cookies-2.0
Set-Cookie3: BAIDUID="DDF5CB401A1543ED614CE42962D48099:FG=1"; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2021-12-01 12:04:18Z"; comment=bd; version=0
Set-Cookie3: BIDUPSID=DDF5CB401A1543ED00860C3997C3282C; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2088-12-19 15:18:25Z"; version=0
Set-Cookie3: H_PS_PSSID=1430_33058_31254_33098_33101_33199; path="/"; domain=".baidu.com"; path_spec; domain_dot; discard; version=0
Set-Cookie3: PSTM=1606824257; path="/"; domain=".baidu.com"; path_spec; domain_dot; expires="2088-12-19 15:18:25Z"; version=0
Set-Cookie3: BDSVRTM=0; path="/"; domain="www.baidu.com"; path_spec; discard; version=0
Set-Cookie3: BD_HOME=1; path="/"; domain="www.baidu.com"; path_spec; discard; version=0

以LWP格式的文件为示例,展示读取和利用的方法:

代码:

import http.cookiejar,urllib.request

cookie=http.cookiejar.LWPCookieJar()
#如果文件保存为Mozilla型浏览器格式,可以改为:
#cookie=http.cookiejar.MozillaCookieJar()

cookie.load('cookies.txt',ignore_discard=True,ignore_expires=True)
#调用load()方法来读取本地的Cookies文件,获取Cookies的内容

handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener(handler)
response=opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

运行结果:输出网页源代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用HTMLParser解析html实例
Feb 08 Python
Python功能键的读取方法
May 28 Python
python函数的5种参数详解
Feb 24 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
python中获得当前目录和上级目录的实现方法
Oct 12 Python
Python从零开始创建区块链
Mar 06 Python
python数字图像处理实现直方图与均衡化
May 04 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
浅谈图像处理中掩膜(mask)的意义
Feb 19 Python
Python爬取数据并实现可视化代码解析
Aug 12 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 Python
python中opencv实现图片文本倾斜校正
Jun 11 Python
Python APScheduler执行使用方法详解
Dec 10 #Python
flask项目集成swagger的方法
Dec 09 #Python
python的dict判断key是否存在的方法
Dec 09 #Python
python RSA加密的示例
Dec 09 #Python
python中把元组转换为namedtuple方法
Dec 09 #Python
python不同版本的_new_不同点总结
Dec 09 #Python
python中_del_还原数据的方法
Dec 09 #Python
You might like
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
PHP实现获取图片颜色值的方法
2014/07/11 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
js实现倒计时效果(小于10补零)
2017/03/08 Javascript
jQuery实现简单的下拉菜单导航功能示例
2017/12/07 jQuery
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
Python实现快速排序和插入排序算法及自定义排序的示例
2016/02/16 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
Python同时处理多个异常的方法
2020/07/28 Python
Django集成MongoDB实现过程解析
2020/12/01 Python
Appium+Python实现简单的自动化登录测试的实现
2021/01/26 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
酒店开业策划方案
2014/06/02 职场文书
李强为自己工作观后感
2015/06/11 职场文书
CAD实训总结范文
2015/08/03 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技
Python中的pprint模块
2021/11/27 Python
Java完整实现记事本代码
2022/06/16 Java/Android
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技