51Testing软件测试论坛

标题: Python----Urllib的学习 [打印本页]

作者: 测试积点老人    时间: 2019-1-10 16:28
标题: Python----Urllib的学习
Urllib库

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

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

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


[attach]120861[/attach]

[attach]120862[/attach]


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

  1. import urllib.request

  2. # 方式1
  3. url = "http://www.baidu.com"
  4. data = urllib.request.urlopen(url).read()
  5. handlelData = open("D:/python/file/1.html", "wb")
  6. handlelData.write(data)
  7. handlelData.close()

  8. # 方式2 可以直接通过urllib.request.urlretrieve()方法直接将网页内容保存在本地
  9. filename = urllib.request.urlretrieve(url,filename = "D:/python/file/1.html")
复制代码


注意:

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

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

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

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


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

  1. encode = urllib.request.quote("http://www.sina.com.cn")
  2. decode = urllib.request.unquote(encode)
  3. print(encode)
  4. print(decode)
复制代码


3.模拟浏览器访问网页

  1. # 方式1 通过build_opener()修改报头
  2. url = "http://www.baidu.com"
  3. 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')
  4. opener = urllib.request.build_opener()
  5. opener.addheaders = [header]
  6. data = opener.open(url).read()
  7. print(data)
  8. # 方式2 通过urlib.request.Request()来添加报头
  9. req = urllib.request.Request(url)
  10. 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')
  11. data = urllib.request.urlopen(req).read()
  12. print(data)
复制代码


4. 超时设置

  1. for i in range(1,100):
  2.     try:
  3.         file = urllib.request.urlopen("http://yum.iqianyue.com",timeout=1)
  4.         data = file.read()
  5.         print(len(data))
  6.     except Exception as e:
  7.         print('出现异常----》',e)
复制代码


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

post请求的实例

  1. url = "http://www.iqianyue.com/mypost/"

  2. # 1.构建post请求参数
  3. postdata = {"name":"ceo@iqianyue.com","pass":"aA123456"}

  4. # 2.采用urllib.parse.urlencode()来编码数据,然后设置成utf-8来编码
  5. encode_postdata = urllib.parse.urlencode(postdata).encode('utf-8')

  6. # 3.用post参数来构建request的请求
  7. req = urllib.request.Request(url,encode_postdata)

  8. # 4.模拟浏览器访问,给request请求添加报头
  9. 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')

  10. # 5.通过urllib.request.urlopen()来发送请求,得到响应结果.
  11. data = urllib.request.urlopen(req).read()

  12. # 6.将数据保存在本地
  13. os_handle = open("D:/python/file/5.html","wb")
  14. os_handle.write(data)

  15. # 7.关闭流
  16. os_handle.close()
复制代码

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


6.代理请求的设置

  1. def user_proxy(proxy_address, url):

  2.     # 1.代理的设置(包括端口号,用户名,密码,ip地址等),采用什么样的来设置代理(http、ftp、https)
  3.     proxy = urllib.request.ProxyHandler({'http': proxy_address})

  4.     # 2.通过 build_opener()来设置代理(HTTPHandler、HTTPSHandler、FTPHandler)
  5.     opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)

  6.     # 3.模拟浏览器访问网页
  7.     headers = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36"
  8.     opener.addheaders = [('User-Agent', headers)]

  9.     # 4. 创建全局的opener
  10.     urllib.request.install_opener(opener)

  11.     # 5.使用全局的opener来发送请求
  12.     data = urllib.request.urlopen(url).read()
  13.     return data


  14. self_url = "https://www.baidu.com"
  15. proxy_ip = '144.48.4.214:8989'
  16. data = user_proxy(proxy_ip, self_url)
  17. print(len(data))
复制代码


7. DebugLog的实战

  1. # 1.通过将urllib.request.HTTPHandler 和 urllib.request.HTTPSHandler(debuglevel=1)
  2. http_hd = urllib.request.HTTPHandler(debuglevel=1)
  3. https_hd = urllib.request.HTTPSHandler(debuglevel=1)

  4. # 2. 通过 build_opener()来设置debug,创建全局的opener
  5. opener = urllib.request.build_opener(http_hd, https_hd)
  6. urllib.request.install_opener(opener)

  7. # 3. 通过全局的opener来发送请求
  8. data = urllib.request.urlopen("http://edu.51cto.com")
复制代码


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

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

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

  1. try:
  2.     data = urllib.request.urlopen("https://www.jiangcxczxc.com").read()
  3.     print(len(data))
  4. except urllib.error.URLError as e:
  5.     if hasattr(e, 'code'):
  6.         print(e.code)
  7.     if hasattr(e, 'reason'):
  8.         print(e.reason)
复制代码

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


总结:

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



作者: Miss_love    时间: 2021-1-5 13:37
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2