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中自定义函数的教程
Apr 27 Python
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
Python  pip安装lxml出错的问题解决办法
Feb 10 Python
python编写朴素贝叶斯用于文本分类
Dec 21 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
对python dataframe逻辑取值的方法详解
Jan 30 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
python识别验证码图片实例详解
Feb 17 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
Python OpenCV实现图像模板匹配详解
Apr 07 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
人族 Terran 基本策略
2020/03/14 星际争霸
用Zend Encode编写开发PHP程序
2006/10/09 PHP
PHP 图片上传代码
2011/09/13 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
js实现的类似于asp数据字典的数据类型代码实例
2014/09/03 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
javascript实现禁止复制网页内容
2014/12/16 Javascript
jQuery循环动画与获取组件尺寸的方法
2015/02/02 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
vue element 生成无线级左侧菜单的实现代码
2019/08/21 Javascript
详解JS预解析原理
2020/06/16 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
Python单元测试与测试用例简析
2019/11/09 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
澳大利亚网上书店:QBD
2021/01/09 全球购物
注塑工厂厂长岗位职责
2013/12/02 职场文书
历史教育专业个人求职信
2013/12/13 职场文书
大学生素质拓展活动方案
2014/02/11 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
黄山导游词
2015/01/31 职场文书
离婚案件上诉状
2015/05/23 职场文书
教师学习心得体会范文
2016/01/21 职场文书
GO语言异常处理分析 err接口及defer延迟
2022/04/14 Golang
Go语言编译原理之源码调试
2022/08/05 Golang