博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python----Urllib的学习
阅读量:5820 次
发布时间:2019-06-18

本文共 4208 字,大约阅读时间需要 14 分钟。

hot3.png

                                                  Urllib库

Urllib库的定义:Urllib库是Python提供来操作URL的模块。

1.Python2.X 和    Python3.X的区别:Python2.X中包括Urllib库、Urllib2库,而在Python3.X中,将Urllib2合并到Urllib中。

Python2.x到Python3.X之间的变化:

1. 爬取百度网页并保存在本地

import urllib.request# 方式1url = "http://www.baidu.com"data = urllib.request.urlopen(url).read()handlelData = open("D:/python/file/1.html", "wb")handlelData.write(data)handlelData.close()# 方式2 可以直接通过urllib.request.urlretrieve()方法直接将网页内容保存在本地filename = urllib.request.urlretrieve(url,filename = "D:/python/file/1.html")

注意:read()、readlines()、readline()三者的区别:

read(): 读取网页的所有的内容,并且将读取的内容返回一个字符串。

readlines(): 也是读取网页全部内容,不同的是它会将读取对的内容赋值给一个列表

readline(): 它是读取网页每一行的内容。

2. 对url中含有中文的字符,我们需要对其进行编码和解码

encode = urllib.request.quote("http://www.sina.com.cn")decode = urllib.request.unquote(encode)print(encode)print(decode)

3.模拟浏览器访问网页

# 方式1 通过build_opener()修改报头url = "http://www.baidu.com"header = ('Uesr-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36')opener = urllib.request.build_opener()opener.addheaders = [header]data = opener.open(url).read()print(data)# 方式2 通过urlib.request.Request()来添加报头req = urllib.request.Request(url)req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36')data = urllib.request.urlopen(req).read()print(data)

4. 超时设置

for i in range(1,100):    try:        file = urllib.request.urlopen("http://yum.iqianyue.com",timeout=1)        data = file.read()        print(len(data))    except Exception as e:        print('出现异常----》',e)

5.请求方式的使用:post、get、put等

post请求的实例

url = "http://www.iqianyue.com/mypost/"# 1.构建post请求参数postdata = {"name":"ceo@iqianyue.com","pass":"aA123456"}# 2.采用urllib.parse.urlencode()来编码数据,然后设置成utf-8来编码encode_postdata = urllib.parse.urlencode(postdata).encode('utf-8')# 3.用post参数来构建request的请求req = urllib.request.Request(url,encode_postdata)# 4.模拟浏览器访问,给request请求添加报头req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36')# 5.通过urllib.request.urlopen()来发送请求,得到响应结果.data = urllib.request.urlopen(req).read()# 6.将数据保存在本地os_handle = open("D:/python/file/5.html","wb")os_handle.write(data)# 7.关闭流os_handle.close()

get请求需要注意的是,如果请求的url中含有中文字符或者特需字符,需要进行转码在发送请求。

6.代理请求的设置

def user_proxy(proxy_address, url):    # 1.代理的设置(包括端口号,用户名,密码,ip地址等),采用什么样的来设置代理(http、ftp、https)    proxy = urllib.request.ProxyHandler({'http': proxy_address})    # 2.通过 build_opener()来设置代理(HTTPHandler、HTTPSHandler、FTPHandler)    opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)    # 3.模拟浏览器访问网页    headers = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36"    opener.addheaders = [('User-Agent', headers)]    # 4. 创建全局的opener    urllib.request.install_opener(opener)    # 5.使用全局的opener来发送请求    data = urllib.request.urlopen(url).read()    return dataself_url = "https://www.baidu.com"proxy_ip = '144.48.4.214:8989'data = user_proxy(proxy_ip, self_url)print(len(data))

7. DebugLog的实战

# 1.通过将urllib.request.HTTPHandler 和 urllib.request.HTTPSHandler(debuglevel=1)http_hd = urllib.request.HTTPHandler(debuglevel=1)https_hd = urllib.request.HTTPSHandler(debuglevel=1)# 2. 通过 build_opener()来设置debug,创建全局的openeropener = urllib.request.build_opener(http_hd, https_hd)urllib.request.install_opener(opener)# 3. 通过全局的opener来发送请求data = urllib.request.urlopen("http://edu.51cto.com")

8.异常的处理: 分为两种 HTTPError 和 URLError

  HTTPError主要是http协议中状态码的错误

  URLError主要是请求url中发生的错误

try:    data = urllib.request.urlopen("https://www.jiangcxczxc.com").read()    print(len(data))except urllib.error.URLError as e:    if hasattr(e, 'code'):        print(e.code)     if hasattr(e, 'reason'):        print(e.reason)

区别在于:HTTPError只能处理状态码的错误,不能处理URL不存在,服务器出现异常等,而URLError是都能处理的。

总结:我们在使用urllib模块时,应该注意哪些细节。

  1. Urllib是我们操作URL中的一个模块,我们在爬虫过程汇总经常会使用到这个模块
  2. 一般来说,标准的URL只允许一部分ASCII字符,比如字母、数字、部分符号等,如果我们在使用不标准的URL做请求就会出现错误,我们经常会在URL中遇到的中文、":" 、"&"等字符,我们需要将其编码,然后在使用编码过后的url发送请求。
  3. 我们在爬虫过程中经常会遇到403的错误,这是别人网页采取了反爬虫设置,此时我们需要通过其他方式来做。比如模拟浏览器来访问、或者设置代理来做请求,在或者保存cookie等
  4. 就是异常的处理,我们在爬虫过冲中必须捕获异常,防止在爬虫过程中中断。

 

转载于:https://my.oschina.net/quguangle/blog/1825248

你可能感兴趣的文章
【IL】IL生成exe的方法
查看>>
SettingsNotePad++
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
论模式在领域驱动设计中的重要性
查看>>
有关GitHub仓库分支的几个问题
查看>>
云原生的浪潮下,为什么运维人员适合学习Go语言?
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
解决Unable to load R3 module ...VBoxDD.dll (VBoxDD):GetLastError=1790
查看>>
.net excel利用NPOI导入oracle
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
My97DatePicker 日历插件
查看>>
hive基本操作与应用
查看>>