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

  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. centos 使用RPM包安装指定版本的docker-engine

    下面是拿安装docker-engine-1.10.3-1为例: wget https://yum.dockerproject.org/repo/main/centos/7/Packages/docke ...

  2. Azure SQL 数据库仓库Data Warehouse (4) 2018 TechSummit 动手实验营

    <Windows Azure Platform 系列文章目录> 上传一下之前在2018 TechSummit的动手实验营:Azure数据仓库PaaS项目架构规划与实战入门 包含PPT和Wo ...

  3. php语法基础(相比C语言)

    前言 php的语法跟C语言很类似,相信有一定C的基础的人学起来会非常快. 本篇主要介绍php相比C语言有差异的地方 php代码标记 ASP标记:<% 代码 %> 短标记:<? 代码 ...

  4. Hadoop 管理工具HUE配置-Hive配置

    1 前言 首先要配置好Hive,可以参见:http://www.cnblogs.com/liuchangchun/p/4761730.html 2 hive配置 找到beeswax标签,不叫hive, ...

  5. 3.STM32复位系统

    一.概念 复位: 使系统结束当前运行状态,重新开始运行,并根据复位种类,将系统的寄存器(特定的寄存器除外)恢复到默认状态. 二.复位的种类 1.系统复位 将除了系统后备区域寄存器(BKP)和时钟控制寄 ...

  6. [转]MySQL group_concat设置group_concat_max_len

    GROUP_CONCAT函数用于将多个字符串连接成一个字符串,在拼接成字符串时就会存在拼接长度的问题,mysql 默认的拼接最大长度为1024 个字节,由于1024个字节会出现不够用的情况,所以有时需 ...

  7. Vue Checkbox全选和选中的方法

    <div class="search-content"> <Checkbox :value="checkAll" @click.prevent ...

  8. win10环境下Android studio安装教程----亲测可用

    这段时间学习了一下Android的基本开发,发现Google已经停止了对eclipse的支持,并开发了自己的Android开发工具--Android Studio,于是想安装一下Android Stu ...

  9. java反编译工具cfr

    http://www.benf.org/other/cfr/ 下载反编译工具 @echo off SET home=%cd% rem 指定存放jar包的目录 SET jar_dir=%home%\ja ...

  10. canvas 2.0

    了解 虽然大家都称Canvas为html5的新标签,看起来好像Canvas属于html语言的新知识,但其实Canvas画图是通过javascript来做的.所以,如果你想学习Canvas画图,你必须要 ...