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中定义结构体的方法
Mar 04 Python
在Python中处理XML的教程
Apr 29 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
Python部署web开发程序的几种方法
May 05 Python
Python学习小技巧之列表项的拼接
May 20 Python
python利用标准库如何获取本地IP示例详解
Nov 01 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
Python编程深度学习计算库之numpy
Dec 28 Python
Python基于WordCloud制作词云图
Nov 29 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
C++和python实现阿姆斯特朗数字查找实例代码
Dec 07 Python
python开发人人对战的五子棋小游戏
May 02 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
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
PHP循环结构实例讲解
2014/02/10 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
JS跨域总结
2012/08/30 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
js实现日历的简单算法
2017/01/24 Javascript
vue操作下拉选择器获取选择的数据的id方法
2018/08/24 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
Python中使用logging模块打印log日志详解
2015/04/05 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
英国顶级珠宝品牌之家:John Greed
2018/06/09 全球购物
旅游管理专业学生求职信
2013/09/28 职场文书
经销商培训邀请函
2014/01/21 职场文书
年终总结会主持词
2014/03/25 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
聘用合同范本
2015/09/21 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
pytorch fine-tune 预训练的模型操作
2021/06/03 Python