一篇文章带你搞定Python中urllib库(操作URL)

开发 后端
使用Python语言,能够帮助大家更好的学习Python。urllib提供的功能就是利用程序去执行各种HTTP请求。如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。

[[434848]]

Hey,大家好呀,我是Go进阶者。

一、操作URL

urllib提供了一系列用于操作URL的功能。分类讲解相关内容。

二、Get()

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:

例如,对豆瓣的URLhttps://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078进行抓取,并返回响应:

  1. from urllib import request 
  2.  
  3. with request.urlopen('https://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078'as f: 
  4.     data = f.read() 
  5.     print('Status:', f.status, f.reason) 
  6.     for k, v in f.getheaders(): 
  7.         print('%s: %s' % (k, v)) 
  8.     print('Data:', data.decode('utf-8')) 

可以看到HTTP响应的头和JSON数据:

如果要想模拟浏览器发送GET请求,就需要使用Request对象,通过往Request对象添加HTTP头,就可以把请求伪装成浏览器。例如,模拟iPhone 6去请求豆瓣首页:

  1. from urllib import request 
  2.  
  3. req = request.Request('http://www.douban.com/'
  4. req.add_header('User-Agent''Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25'
  5. with request.urlopen(req) as f: 
  6.     print('Status:', f.status, f.reason) 
  7.     for k, v in f.getheaders(): 
  8.         print('%s: %s' % (k, v)) 
  9.     print('Data:', f.read().decode('utf-8')) 

这样豆瓣会返回适合iPhone的移动版网页:

三、Post()

如果要以POST发送一个请求,只需要把参数data以bytes形式传入。

模拟一个微博登录,先读取登录的邮箱和口令,然后按照weibo.cn的登录页的格式以username=xxx&password=xxx的编码传入:

  1. from urllib import request, parse 
  2.  
  3. print('Login to weibo.cn...'
  4. #电子邮件 
  5. email = input('Email: '
  6. #密码 
  7. passwd = input('Password: '
  8. #相关的参数 
  9. login_data = parse.urlencode([ 
  10.     ('username', email), 
  11.     ('password', passwd), 
  12.     ('entry''mweibo'), 
  13.     ('client_id'''), 
  14.     ('savestate''1'), 
  15.     ('ec'''), 
  16.     ('pagerefer''https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F'
  17. ]) 
  18. #网址请求 
  19. req = request.Request('https://passport.weibo.cn/sso/login'
  20. req.add_header('Origin''https://passport.weibo.cn'
  21. #构造User-Agent 
  22. req.add_header('User-Agent''Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25'
  23. req.add_header('Referer''https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F'
  24.  
  25. with request.urlopen(req, data=login_data.encode('utf-8')) as f: 
  26.     print('Status:', f.status, f.reason) 
  27.     for k, v in f.getheaders(): 
  28.         print('%s: %s' % (k, v)) 
  29.     print('Data:', f.read().decode('utf-8')) 

如果登录成功,获得的响应如下:

如果登录失败,获得的响应如下:

四、Handler

如果还需要更复杂的控制,比如通过一个Proxy去访问网站,需要利用ProxyHandler来处理,示例代码如下:

  1. import urllib.request 
  2.  
  3. # 构建了两个代理Handler,一个有代理IP,一个没有代理IP 
  4.  
  5. httpproxy_handler = urllib.request.ProxyHandler({"https""27.191.234.69:9999"}) 
  6.  
  7. nullproxy_handler = urllib.request.ProxyHandler({}) 
  8.  
  9. # 定义一个代理开关 
  10.  
  11. proxySwitch = True  
  12.  
  13. # 通过 urllib.request.build_opener()方法使用这些代理Handler对象,创建自定义opener对象 
  14.  
  15. # 根据代理开关是否打开,使用不同的代理模式 
  16.  
  17. if proxySwitch: 
  18.  
  19.     opener = urllib.request.build_opener(httpproxy_handler) 
  20. else
  21.     opener = urllib.request.build_opener(nullproxy_handler) 
  22.  
  23.  
  24. request = urllib.request.Request("http://www.baidu.com/")  
  25.  
  26. # 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。 
  27.  
  28. response = opener.open(request) 
  29.  
  30. # 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。 
  31.  
  32. # urllib.request.install_opener(opener) 
  33.  
  34. # response = urllib.request.urlopen(request) 
  35.  
  36.  
  37. # 获取服务器响应内容 
  38.  
  39. html = response.read().decode("utf-8"
  40.    
  41. # 打印结果 
  42.  
  43. print(html) 

如果代理成功返回网址的信息。

如果网址出错或者代理地址有误,返回下面界面。

五、总结

使用Python语言,能够帮助大家更好的学习Python。urllib提供的功能就是利用程序去执行各种HTTP请求。如果要模拟浏览器完成特定功能,需要把请求伪装成浏览器。伪装的方法是先监控浏j览器发出的请求,再根据浏览器的请求头来伪装,User-Agent头就是用来标识浏览器的。

 

责任编辑:姜华 来源: Go语言进阶学习
相关推荐

2021-11-17 10:11:08

PythonLogging模块

2021-11-10 09:19:41

PythonShutil模块

2021-05-15 10:16:14

Python匿名函数

2024-04-17 13:21:02

Python匿名函数

2020-02-28 11:29:00

ElasticSear概念类比

2021-01-13 08:40:04

Go语言文件操作

2021-03-06 10:05:03

Python函数变量

2021-05-31 08:59:57

Java数据库访问JDBC

2022-03-30 10:51:40

JavaScript性能调优

2022-05-28 15:59:55

PythonPandas数据可视化

2021-02-20 10:06:14

语言文件操作

2021-05-18 09:00:28

Pythonclass

2021-01-05 09:07:30

Django ORMF查询Q查询

2020-12-18 09:06:42

模块Python系统

2021-04-24 10:19:41

Python函数指向

2021-05-15 09:18:04

Python进程

2021-03-15 08:38:42

StringBuffeJava基础Java开发

2021-08-12 14:19:14

Slice数组类型内存

2023-07-30 15:18:54

JavaScript属性

2021-05-18 08:30:42

JavaScript 前端JavaScript时
点赞
收藏

51CTO技术栈公众号