urllib简介

简介

Python3中将python2.7的urllib和urllib2两个包合并成了一个urllib库

Python3中,urllib库包含有四个模块:

  1. urllib.request        主要用来打开或者读取url
  2. urllib.error            主要用来存放返回的错误信息
  3. urllib.parse           主要用来解析url
  4. urllib.robotparser  主要用来解析robots.txt文件

模块安装与导入

urllib是python自带的一个包,无需安装,导入方法如下:

from urllib import request
...

urllib.request

urllib.request这个模块用得比较多, 尤其是urlopen函数,会返回一个二进制的对象,对这个对象进行read()操作可以得到一个包含网页的二进制字符串,然后用decode()解码成一段html代码:

语法结构:

urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None, capath=None, cadefault=False, context=None)

参数:其中url既可以是一个URL字符串,又可以是一个Requst对象,一般使用后者添加其他参数。

当request的方式是post时,使用参数data,用于填写传递的表单信息,将data填好表单信息,准备传入urlopen 前,还需要利用urllib.parse里的urlencode()函数转换格式,写成data = urllib.parse.urlencode(data).encode(‘’),然后将data传入函数。

而urllib.request的Request函数,也可以用于打开url字符串,同时可以传入更多的参数,例如:headers,Request函数可以返回一个request对象作为urlopen函数的url参数使用。

语法结构:

urllib.request. Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

参数:其中url是一个URL字符串。

data用法与urlopen一致。

headers参数是一个字典,服务器对于用户发出的request,会通过其中的headers信息来判断用户发信息,我们可以通过自己编写headers传入urllib.request. Request中用于伪装自己的身份。Header中User-agent参数是判断用户身份。另外通过设置代理可以改变用户提交时的IP地址。

urllib.error

待续......

urllib.parse

待续......

urllib.robotparser

待续......

爬虫小示例

代码

from urllib import request

# 定义一个url
url = 'https://www.baidu.com/' # 用request.urlopen()方法打开指定的url
response = request.urlopen(url) # 返回的是一个HTTPResponse对象
print(type(response)) # <class 'http.client.HTTPResponse'>
print(response) # <http.client.HTTPResponse object at 0x00000196C95CB550> # 调用返回的response对象的read()方法,可以读取url返回的html内容,不过是bytes类型的
html = response.read()
print(type(html)) # <class 'bytes'> # 对bytes类型的html进行解码
html = html.decode()
print(html)

分析

根据以上代码,我们得知,urllib包下面的request模块的urlopen方法可以获取一个HttpResponse对象,通过调用对象的read()方法可以获取二进制格式的url的html内容,对结果进行解码即可

urlopen返回的HttpResonse对象

我们从上面的小示例可以看出,urlopen打开一个url后会返回一个HttpResponse对象,这个对象有以下几个常用的方法:

read()

次方法用来读取url的html内容,格式为二进制

geturl()

用来获取urlopen的url参数,也就是所打开的url

如,在上面示例中调用此方法:

print(response.geturl())

# https://www.baidu.com/

info()

返回response对象的meta信息

print(response.info())

'''
Accept-Ranges: bytes
Cache-Control: no-cache
Content-Length: 227
Content-Type: text/html
Date: Wed, 09 May 2018 13:59:22 GMT
Last-Modified: Tue, 08 May 2018 03:45:00 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BD_NOT_HTTPS=1; path=/; Max-Age=300
Set-Cookie: BIDUPSID=E163F6688178D6656D765FF58DBA2D01; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1525874362; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=0
X-Ua-Compatible: IE=Edge,chrome=1
Connection: close
'''

getcode()

返回http状态码。200 404  403等

print(response.getcode())

# 200

给urlopen传递参数

get方法传参

利用url参数给服务器传递信息

参数为dict类型,需要用parse对字典参数进行编码

格式为:

response = request.urlopen(url,data)

示例如下:

from urllib import request
from urllib import parse url = 'https://www.baidu.com/s' # 让用户输入关键词
keyword = input('请输入您要搜索的内容:') # 定义一个字典,将用户输入的关键字封装到里面
data = {'kw':keyword} # 对data进行编译
data = parse.urlencode(data).encode() response = request.urlopen(url,data) print(response.read().decode())

上面的小示例是直接用给urlopen的data传参数的形式来传递数据,也可以将参数数据封装给一个Request对象,然后将对象再传递给urlopen。

这种方法可以传递更多的信息,如header等,可以更好的隐藏我们身份,伪装成浏览器访问,如下:

from urllib import request
from urllib import parse keyword = input('请输入您要搜索的内容:')
url = 'https://www.baidu.com/s'
data = {'kw':keyword}
header = {'Content-Length':len(data)} req = request.Request(url,data=parse.urlencode(data).encode(),headers=header) response = request.urlopen(req) print(response.read().decode())

post方法传参

连接百度翻译接口的小示例

from urllib import request
from urllib import parse url = 'http://fanyi.baidu.com/sug' keyword = input('请输入您要翻译的词语') data = {'kw':keyword}
data = parse.urlencode(data).encode() header = {'Content-Length':len(data)} res = request.Request(url,data=data,headers=header) response = request.urlopen(res) res = response.read().decode()
print(res)

上面的小示例返回的是一个json类型的字典,输入'girl'之后翻译结果如下:

{"errno":0,"data":[{"k":"girl","v":"n. \u5973\u5b69; \u59d1\u5a18\uff0c\u672a\u5a5a\u5973\u5b50; \u5973\u804c\u5458\uff0c\u5973\u6f14\u5458; \uff08\u7537\u4eba\u7684\uff09\u5973\u670b\u53cb;"},{"k":"girls","v":"n. \u5973\u5b69; \u5973\u513f( girl\u7684\u540d\u8bcd\u590d\u6570 ); \u5973\u5de5; \uff08\u7537\u4eba\u7684\uff09\u5973\u670b\u53cb;"},{"k":"girlfriend","v":"n. \u5973\u670b\u53cb; \u5973\u6027\u670b\u53cb;"},{"k":"girl friend","v":"n. \u5973\u670b\u53cb\uff0c\uff08\u7537\u4eba\u7684\uff09\u60c5\u4eba; \u5bf9\u8c61;"},{"k":"Girls' Generation","v":" \u5c11\u5973\u65f6\u4ee3\uff08\u97e9\u56fdSM\u5a31\u4e50\u6709\u9650\u516c\u53f8\u4e8e2007\u5e74\u63a8\u51fa\u7684\u4e5d\u540d\u5973\u5b50\u5c11\u5973\u7ec4\u5408\uff09;"}]}

我们只需要用json给它转成字典格式,然后循环展示即可查看到结果,如下:

from urllib import request
from urllib import parse
import json url = 'http://fanyi.baidu.com/sug' keyword = input('请输入您要翻译的词语') data = {'kw':keyword}
data = parse.urlencode(data).encode() header = {'Content-Length':len(data)} res = request.Request(url,data=data,headers=header) response = request.urlopen(res) res = response.read().decode() fanyi_res = json.loads(res)['data'] for item in fanyi_res:
print(item['k'],item['v'])

结果如下:

请输入您要翻译的词语girl
girl n. 女孩; 姑娘,未婚女子; 女职员,女演员; (男人的)女朋友;
girls n. 女孩; 女儿( girl的名词复数 ); 女工; (男人的)女朋友;
girlfriend n. 女朋友; 女性朋友;
girl friend n. 女朋友,(男人的)情人; 对象;
Girls' Generation 少女时代(韩国SM娱乐有限公司于2007年推出的九名女子少女组合);

  

爬虫之urllib包以及request模块和parse模块的更多相关文章

  1. 爬虫之urllib包

    urllib简介 简介 Python3中将python2.7的urllib和urllib2两个包合并成了一个urllib库 Python3中,urllib库包含有四个模块: urllib.reques ...

  2. python爬虫(1)——urllib包

    人生苦短,我用python! 一.关于爬虫 鉴于我的windos环境使用命令行感觉非常不便,也懒得折腾虚拟机,于是我选择了一个折中的办法--Cmder.它的下载地址是:cmder.net Cmder是 ...

  3. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  4. 爬虫模块介绍--request(发送请求模块)

    爬虫:可见即可爬   # 每个网站都有爬虫协议 基础爬虫需要使用到的三个模块 requests 模块  # 模拟发请求的模块 PS:python原来有两个模块urllib和urllib的升级urlli ...

  5. 爬虫框架urllib 之(三) --- urllib模块

    Mac本 需导入ssl import ssl ssl._create_default_https_context = ssl._create_unverified_context  urllib.re ...

  6. 练手爬虫用urllib模块获取

    练手爬虫用urllib模块获取 有个人看一段python2的代码有很多错误 import re import urllib def getHtml(url): page = urllib.urlope ...

  7. Python爬虫之urllib模块1

    Python爬虫之urllib模块1 本文来自网友投稿.作者PG,一个待毕业待就业二流大学生.玄魂工作室未对该文章内容做任何改变. 因为本人一直对推理悬疑比较感兴趣,所以这次爬取的网站也是平时看一些悬 ...

  8. python 3.x 爬虫基础---Urllib详解

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...

  9. python爬虫之urllib库(一)

    python爬虫之urllib库(一) urllib库 urllib库是python提供的一种用于操作URL的模块,python2中是urllib和urllib2两个库文件,python3中整合在了u ...

随机推荐

  1. 跟着百度学习php之ThinkPHP的运行流程-2

    Thinkphp为了提高编译的效率,第一次运行的时候thinkphp会把文件全部编译到temp目录下的~runtime.php文件,在第二次运行的时候会直接读取这个文件.所以我们在线下自己写代码测试的 ...

  2. 高德地图sdk的AMapNavi.getInstance为null解决办法

    问题,动态库没有全部导入,之前我只放到了armeabi下,可是没想到我手机是armeabi-v7a的. 最近做Android项目,先用的是百度地图,可是后来发现百度地图没有提供地图的View点击事件( ...

  3. Supervisor重新加载配置启动新的进程

    一.添加好配置文件后 二.更新新的配置到supervisord supervisorctl update 三.重新启动配置中的所有程序 supervisorctl reload 四.启动某个进程(pr ...

  4. Spring Cloud的子项目,大致可分成两类

    Spring Cloud的子项目,大致可分成两类,一类是对现有成熟框架”Spring Boot化”的封装和抽象,也是数量最多的项目:第二类是开发了一部分分布式系统的基础设施的实现,如Spring Cl ...

  5. OGNL支持各种纷繁复杂的表达式

    OGNL支持各种纷繁复杂的表达式.但是最最基本的表达式的原型,是将对象的引用值用点串联起来,从左到右,每一次表达式计算返回的结果成为当前对象,后面部分接着在当前对象上进行计算,一直到全部表达式计算完成 ...

  6. 嵌入式开发之davinci--- 8148/8168/8127 中的二维图像处理内存tiler 铺瓷砖

    http://blog.csdn.net/shanghaiqianlun/article/details/7619603

  7. ubuntu 解压命令全部

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...

  8. mysql -- 创建存储过程 往数据表中新增字段

    需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: ...

  9. MFC通过button控制编辑框是否显示系统时间(动态显示)

    1.在dlg.h中public bool flag; static UINT time(void *param); 2.在构造函数中 flag=false; 3.在button的生成函数中 if(fl ...

  10. bootstrap基础学习八篇

    bootstrap辅助类 a.对于文本颜色 以下不同的类展示了不同的文本颜色.如果文本是个链接鼠标移动到文本上会变暗: 类 描述 .text-muted "text-muted" ...