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 相关文章推荐
Django自定义认证方式用法示例
Jun 23 Python
python如何压缩新文件到已有ZIP文件
Mar 14 Python
linux下python使用sendmail发送邮件
May 22 Python
Pycharm导入Python包,模块的图文教程
Jun 13 Python
python用插值法绘制平滑曲线
Feb 19 Python
python解析含有重复key的json方法
Jan 22 Python
详解python深浅拷贝区别
Jun 24 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
Aug 09 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
python3爬取torrent种子链接实例
Jan 16 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 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
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
跟随鼠标旋转的文字
2006/11/30 Javascript
慎用 somefunction.prototype 分析
2009/06/02 Javascript
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
js拖动div 当鼠标移动时整个div也相应的移动
2013/11/21 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
NodeJS远程代码执行
2016/08/28 NodeJs
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
快速入手Python字符编码
2016/08/03 Python
Python中动态检测编码chardet的使用教程
2017/07/06 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
2019/08/12 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
请介绍一下Ant
2016/07/22 面试题
外包公司软件测试工程师
2014/11/01 面试题
办公室助理岗位职责
2013/12/25 职场文书
仓库主管岗位职责
2014/03/02 职场文书
《孔繁森》教学反思
2014/04/17 职场文书
品质标语大全
2014/06/21 职场文书
乒乓球兴趣小组活动总结
2014/07/08 职场文书
医药公司采购员岗位职责
2014/09/12 职场文书
党的群众路线教育实践活动个人剖析材料
2014/10/07 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
KVM基础命令详解
2022/04/30 Servers