Python中的urllib
urllib提供了一系列URL的功能。
Get
urllib的request模块可以非常方便的抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP响应:
例如,对豆瓣的一个URLhttps://opi.douban.com/v2/book/2129650进行抓取,并返回响应:
from urllib import request
with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
data = f.read()
print('Status:',f.status, f.reason)
for k, v in f.getheader():
print('%s: %s' % (k, v))
print('Data:', data.decode('utf-8'))
可以看到HTTP响应的头和JSON数据:
Stutas:200 OK
Server: nginx
Date: Tue, 26 May 2015 10:02:27 GMT
Content-Type:application/json, charset=utf-8
Content-Length: 2049
Connection: close
Expires: Sun, 1 Jan 2006 01:00:00 GMT
Pragma: no-cache
Cache-Contorl: must-revalidate, no-cache, private
X-DAE-Node: pidll
Data:{"rating": {"max": 10, "numRaters": 16,"average":"7.4","min":0}, "subititle":"","author":["编著"]},“pubdate”:“2007-6,...”
如果我们想要模仿浏览器发送GET请求,就需要使用Request对象,通过往Request对象添加HTTP头,我们就可以把请求伪装成浏览器。例如,模拟iPone 6 去请求豆瓣首页:
from urllib import request
req = request.Request("http://www.douban.com/")
req.add_header('User-Agent', 'Moailla/6.0 (iPone OS 8_0 like Mac OS X) AppleWebKit/536.26(KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
with request.urlopen(req) as f:
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8'))
这样豆瓣返回适合iPone的移动网页:
...
<meta name = 'viewport' content='width=device-width, user-scalable=no, initial-scale-1.0, minimum-scale=1.0, maxmum-scale=1.0'>
<meta name="format-detection" content=no>
<link rel="apple-touch-icon" sizes="57*57" href="http://img4.douban.com/pics/cardkit/launcher/57.png"/>
...
Post
如果要以POST发送一个请求,只需要把参数data以bytes形式传入。
我们模拟一个微博登陆,先读取登陆的邮箱和口令,然后按照weibo.cn的登陆页的格式以username=xxx&password=xxx的编码传入:
from urllib import request, parse
print('Login to webo.cn...')
email = input('Email:')
passwd = input("Passwod:")
login_data = parse.urlencode([
('username',email),
('password', passwd),
('entry', 'mweibo'),
('client_id', ''),
('savestate', ''),
('ec', ''),
('pagerefer', 'https://passport.weibo.cn/sigin/welcome?entry=mweibo&r=http%3A%2F%2FM.weibo.cn%2F')])
req = request.Request('https://passport.weibo.cn/sso/login')
req.add_header('Origin', 'https://passport.weibo.cn')
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')
req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')
with request.urlopen(req, data=login_data.encode('utf-8')) as f:
print('Status:', f.status, f.reason)
for k, v in f.getheaders():
print('%s: %s' % (k, v))
print('Data:', f.read().decode('utf-8'))
如果登陆成功,我们获得的响应如下:
Status: 200 OK
Server: nginx/1.2.0
...
set-Cookie: SSOLoginState= 1432620126; path=/;domain = weibo.cn
...
Data:{"retcode": 20000000, 'msg':'data':{...,"uid":""}}
如果登陆失败,我们获得的响应如下;
...
Data: {"retcode": 50011015,"msg":"\u7528\u6237\u540d\u6216\u5bc6\u7801\u9519\u8bef","data":{"username":"example@python.org","errine": 536}}
小结
urllib提供的功能就是利用程序去执行各种HTTP请求。吐过要模拟浏览器完成特定功能,需要吧请求伪装成浏览器。伪装的方法是先监控浏览器发出的请求,在根据浏览器的请求头来伪装,User-Agent 头就是用来via哦是浏览器的。
Python中的urllib的更多相关文章
- ┱Python中关于urllib和urllib2的问题
python3对urllib和urllib2进行了重构主要拆分成了:1.urllib.request 1.urllib.request.Request(url, data=None, headers= ...
- 第14.9节 Python中使用urllib.request+BeautifulSoup获取url访问的基本信息
利用urllib.request读取url文档的内容并使用BeautifulSoup解析后,可以通过一些基本的BeautifulSoup对象输出html文档的基本信息.以博文<第14.6节 使用 ...
- python学习笔记——urllib库中的parse
1 urllib.parse urllib 库中包含有如下内容 Package contents error parse request response robotparser 其中urllib.p ...
- python中Url链接编码处理(urlencode,urldecode)
做完了flask-web应用,这几天想用爬虫做个好玩的电影链接整合器,平时找电影都是在dytt或者dy2018之类的网站,在用dytt搜索电影<美国队长时>,发现他的搜索链接是这样的:ht ...
- Python爬虫之urllib.parse详解
Python爬虫之urllib.parse 转载地址 Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数. 解析url 解析url( urlparse() ) ur ...
- 第14.8节 Python中使用BeautifulSoup加载HTML报文
一. 引言 BeautifulSoup是一个三方模块bs4中提供的进行HTML解析的类,可以认为是一个HTML解析工具箱,对HTML报文中的标签具有比较好的容错识别功能.阅读本节需要了解html相关的 ...
- [转]Python中urllib与urllib2的区别与联系
引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...
- python中urllib, urllib2,urllib3, httplib,httplib2, request的区别
permike原文python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 若只使用python3.X, 下面可以不看了, 记住有个ur ...
- python中 urllib, urllib2, httplib, httplib2 几个库的区别
转载 摘要: 只用 python3, 只用 urllib 若只使用python3.X, 下面可以不看了, 记住有个urllib的库就行了 python2.X 有这些库名可用: urllib, urll ...
随机推荐
- myibatis的坑--text类型的字段查询缺失
问题:某个字段的类型为text(或者mediumtext,longtext)的时候,用selectByQuery语句查询出来的结果不包含该字段内容. myibatis 用mybatis-generat ...
- [zz]有哪些优秀的科学网站和科研软件推荐给研究生?
https://www.zhihu.com/question/37061410 如题,各位科研前辈,有没有一些好的科研网站或者适合科研人员用的软件以及APP,推荐给一只研一的菜鸡,帮助我们提高科研效率 ...
- docker 进程监控 Dumb-Init进程信号处理 --转自https://blog.csdn.net/tiger435/article/details/54971929
随着docker及Kubernetes技术发展的越来越成熟稳定,越来越多的公司开始将docker用于生产环境的部署,相比起物理机上直接部署,多了一层docker容器的环境,这就带来一个问题:进程信号接 ...
- JAVA web端JS下载excel文件
JSP代码如下: JSP端引入jquery.easyui.min.js库: <script type="text/javascript" src="<c:ur ...
- FPGA editor 的使用之一 ------ Probe探针
做FPGA设计经常会用到FPGA editor工具,今天开始总结下使用FPGA editor工具的经验. 1.添加probes 在debug时,经常要分析设计中的某一个信号的状态变化,需要观测这个信号 ...
- 2-zookeeper、ha
1.zookeeper ①背景: Zookeeper 最早起源于雅虎研究院的一个研究小组.在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调, 但是这些系统往往都 ...
- 详解vue-cli脚手架项目-package.json
该随笔收藏自: 详解vue-cli脚手架项目-package.json package.json是npm的配置文件,里面设定了脚本以及项目依赖的库. npm run dev 这样的命令就写在packa ...
- linux下自定义dubbo的shell脚本
- 199. Spring Boot JNDI:这是虾米?
[视频&交流平台] àSpringBoot视频:http://t.cn/R3QepWG à SpringCloud视频:http://t.cn/R3QeRZc à Spring Boot源 ...
- html: 仿制soundmanager2右上角面板
仿制 http://schillmania.com/projects/soundmanager2/#volume 右上角面板 <style type="text/css"&g ...