urllib提供了一系列URL的功能。

Get

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

例如,对豆瓣的一个URLhttps://opi.douban.com/v2/book/2129650进行抓取,并返回响应:

  1. from urllib import request
  2.  
  3. with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
  4. data = f.read()
  5. print('Status:',f.status, f.reason)
  6. for k, v in f.getheader():
  7. print('%s: %s' % (k, v))
  8. print('Data:', data.decode('utf-8'))

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

  1. Stutas200 OK
  2. Server: nginx
  3. Date: Tue, 26 May 2015 10:02:27 GMT
  4. Content-Type:application/json, charset=utf-8
  5. Content-Length: 2049
  6. Connection: close
  7. Expires: Sun, 1 Jan 2006 01:00:00 GMT
  8. Pragma: no-cache
  9. Cache-Contorl: must-revalidate, no-cache, private
  10. X-DAE-Node: pidll
  11. Data:{"rating": {"max": 10, "numRaters": 16,"average":"7.4","min":0}, "subititle":"","author":["编著"]},“pubdate”:“2007-6,...”

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

  1. from urllib import request
  2.  
  3. req = request.Request("http://www.douban.com/")
  4. 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')
  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'))

这样豆瓣返回适合iPone的移动网页:

  1. ...
  2. <meta name = 'viewport' content='width=device-width, user-scalable=no, initial-scale-1.0, minimum-scale=1.0, maxmum-scale=1.0'>
  3. <meta name="format-detection" content=no>
  4. <link rel="apple-touch-icon" sizes="57*57" href="http://img4.douban.com/pics/cardkit/launcher/57.png"/>
  5. ...

Post

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

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

  1. from urllib import request, parse
  2.  
  3. print('Login to webo.cn...')
  4. email = input('Email:')
  5. passwd = input("Passwod:")
  6. login_data = parse.urlencode([
  7. ('username',email),
  8. ('password', passwd),
  9. ('entry', 'mweibo'),
  10. ('client_id', ''),
  11. ('savestate', ''),
  12. ('ec', ''),
  13. ('pagerefer', 'https://passport.weibo.cn/sigin/welcome?entry=mweibo&r=http%3A%2F%2FM.weibo.cn%2F')])
  14.  
  15. req = request.Request('https://passport.weibo.cn/sso/login')
  16. req.add_header('Origin', 'https://passport.weibo.cn')
  17. 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')
  18. req.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')
  19.  
  20. with request.urlopen(req, data=login_data.encode('utf-8')) as f:
  21. print('Status:', f.status, f.reason)
  22. for k, v in f.getheaders():
  23. print('%s: %s' % (k, v))
  24. print('Data:', f.read().decode('utf-8'))

如果登陆成功,我们获得的响应如下:

  1. Status: 200 OK
  2. Server: nginx/1.2.0
  3. ...
  4. set-Cookie: SSOLoginState= 1432620126; path=/;domain = weibo.cn
  5. ...
  6. Data:{"retcode": 20000000, 'msg':'data':{...,"uid":""}}

如果登陆失败,我们获得的响应如下;

  1. ...
  2. 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的更多相关文章

  1. ┱Python中关于urllib和urllib2的问题

    python3对urllib和urllib2进行了重构主要拆分成了:1.urllib.request 1.urllib.request.Request(url, data=None, headers= ...

  2. 第14.9节 Python中使用urllib.request+BeautifulSoup获取url访问的基本信息

    利用urllib.request读取url文档的内容并使用BeautifulSoup解析后,可以通过一些基本的BeautifulSoup对象输出html文档的基本信息.以博文<第14.6节 使用 ...

  3. python学习笔记——urllib库中的parse

    1 urllib.parse urllib 库中包含有如下内容 Package contents error parse request response robotparser 其中urllib.p ...

  4. python中Url链接编码处理(urlencode,urldecode)

    做完了flask-web应用,这几天想用爬虫做个好玩的电影链接整合器,平时找电影都是在dytt或者dy2018之类的网站,在用dytt搜索电影<美国队长时>,发现他的搜索链接是这样的:ht ...

  5. Python爬虫之urllib.parse详解

    Python爬虫之urllib.parse 转载地址 Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数. 解析url 解析url( urlparse() ) ur ...

  6. 第14.8节 Python中使用BeautifulSoup加载HTML报文

    一. 引言 BeautifulSoup是一个三方模块bs4中提供的进行HTML解析的类,可以认为是一个HTML解析工具箱,对HTML报文中的标签具有比较好的容错识别功能.阅读本节需要了解html相关的 ...

  7. [转]Python中urllib与urllib2的区别与联系

    引用文章1:http://my.oschina.net/u/558071/blog/144792 引用文章2:http://zhuoqiang.me/python-urllib2-usage.html ...

  8. python中urllib, urllib2,urllib3, httplib,httplib2, request的区别

    permike原文python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 若只使用python3.X, 下面可以不看了, 记住有个ur ...

  9. python中 urllib, urllib2, httplib, httplib2 几个库的区别

    转载 摘要: 只用 python3, 只用 urllib 若只使用python3.X, 下面可以不看了, 记住有个urllib的库就行了 python2.X 有这些库名可用: urllib, urll ...

随机推荐

  1. MySQL数据库中统计一个库中的所有表的行数?

    今天公司两个远端的数据库主从同步有点问题,查看下wordpress库下所有表的表的条目? mysql> use information_schema;Database changedmysql& ...

  2. Java中用字符串常量赋值和使用new构造String对象的区别

    String str1 = "ABC"; String str2 = new String("ABC"); String str1 = “ABC”;可能创建一个 ...

  3. udev example -- detect usb and write test file

    之前学习了下Udev,就随便做了个测试小程序.....设计什么的也没考虑,就实现了一个基本功能,插入U盘,识别,循环检测到有特定文件后,就然后往U盘里面写数据,插拔多次,都能正常工作. 里面的warn ...

  4. vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡

    问题描述:vm虚拟机 模板机进行克隆导致centos 7.2 无法加载网卡. 1.ifconfig 查看网卡状态 lo: flags=<UP,LOOPBACK,RUNNING> mtu i ...

  5. ubuntu18.04 安装mysql server

    mysql 5.7支持的最高版本是Ubuntu17 ,即使安装成功后,也会出现各种妖蛾子,本人就被这种问题困扰了好一会.在Ubuntu 18.04下安装mysql,建议安装8.0以上版本! 1. 配置 ...

  6. 性能监控扩展篇(grafana + influxdb + telegraf)

    之前已经说过了自己写sh脚本监控,我看有人评论了说用telegraf进行数据收集,于是乎去研究了下,感觉还可以,不过磁盘io的的表个人感觉有些美中不足,并未直接给出读写速率的情况,可能是研究时间太短, ...

  7. django之 基于queryset和双下划线的跨表查询

    前面篇随笔写的是基于对象的跨表查询:对象.objects.filter(...)  对象.关联对象_set.all(...)  -->反向 基于对象的跨表查询例如: book_obj= Book ...

  8. 安装grid时找不到ASM共享磁盘

    1.安装ORACLE数据库集群软件grid时找不到共享磁盘,如下图: 2.网上找过有各种说法,但此处小编的解决方案是:通过重新安装软件:oracleasmlib-2.0.4-1.el6.x86_64. ...

  9. HBuilder ,及自用主题

    字体:Consolas http://bbs.csdn.net/topics/390858585  让代码更美:你最爱的编程字体 http://www.dcloud.io HBuilder下载 htt ...

  10. Python学习:模块初识、数据类型

    1.模块初识 在Python中,模块分为两种: (1)标准库 标准库无需安装,只要在使用的时候import就可以使用了 (2)第三方库 第三方库必须下载安装之后才能够引入使用 下面介绍两个基本的模块: ...