# 注意一下 是import urllib.request 还是 form urllib import request

0. urlopen()

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

  • 实例0:(这个函数 一般就使用三个参数 url data timeout)

*添加的data参数需要使用bytes()方法将参数转换为字节流(区别于str的一种类型 是一种比特流 010010010)编码的格式的内容,即bytes类型。

*response.read()是bytes类型的数据,需要decode(解码)一下。

  1. import urllib.parse
  2. import urllib.request
  3. import urllib.error
  4.  
  5. url = 'http://httpbin.org/post'
  6. data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8')
  7. try:
  8. response = urllib.request.urlopen(url, data=data,timeout=1)
  9. except urllib.error.URLError as e:
  10. if isinstance(e.reason, socket.timeout):
  11. print('TIME OUT')
  12. else:
  13. print(response.read().decode("utf-8"))

输出结果:

  1. {
  2. "args": {},
  3. "data": "",
  4. "files": {},
  5. "form": {
  6. "word": "hello"
  7. },
  8. "headers": {
  9. "Accept-Encoding": "identity",
  10. "Content-Length": "10",
  11. "Content-Type": "application/x-www-form-urlencoded",
  12. "Host": "httpbin.org",
  13. "User-Agent": "Python-urllib/3.6"
  14. },
  15. "json": null,
  16. "origin": "101.206.170.234, 101.206.170.234",
  17. "url": "https://httpbin.org/post"
  18. }
  • 实例1:查看i状态码、响应头、响应头里server字段的信息
  1. import urllib.request
  2.  
  3. response = urllib.request.urlopen('https://www.python.org')
  4. print(response.status)
  5. print(response.getheaders())
  6. print(response.getheader('Server'))

输出结果:

  1. 200
  2. [('Server', 'nginx'), ('Content-Type', 'text/html; charset=utf-8'), ('X-Frame-Options', 'DENY'), ('Via', '1.1 vegur'), ('Via', '1.1 varnish'), ('Content-Length', '48410'), ('Accept-Ranges', 'bytes'), ('Date', 'Tue, 09 Apr 2019 02:32:34 GMT'), ('Via', '1.1 varnish'), ('Age', '722'), ('Connection', 'close'), ('X-Served-By', 'cache-iad2126-IAD, cache-hnd18751-HND'), ('X-Cache', 'MISS, HIT'), ('X-Cache-Hits', '0, 1223'), ('X-Timer', 'S1554777154.210361,VS0,VE0'), ('Vary', 'Cookie'), ('Strict-Transport-Security', 'max-age=63072000; includeSubDomains')]
  3. nginx

使用urllib库的urlopen()方法有很大的局限性,比如不能设置响应头的信息等。所以需要引入request()方法。

1. Request()

  • 实例0:(这两种方法的实现效果是一样的)
  1. import urllib.request
  2.  
  3. response = urllib.request.urlopen('https://www.python.org')
  4. print(response.read().decode('utf-8'))
  5.  
  6. ######################################
  7.  
  8. import urllib.request
  9.  
  10. req = urllib.request.Request('https://python.org')
  11. response = urllib.request.urlopen(req)
  12. print(response.read().decode('utf-8'))

下面主要讲解下使用Request()方法来实现get请求和post请求,并设置参数。

  • 实例1:(post请求)
  1. from urllib import request, parse
  2.  
  3. url = 'http://httpbin.org/post'
  4. headers = {
  5. 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
  6. 'Host': 'httpbin.org'
  7. }
  8. dict = {
  9. 'name': 'Germey'
  10. }
  11. data = bytes(parse.urlencode(dict), encoding='utf8')
  12. req = request.Request(url=url, data=data, headers=headers, method='POST')
  13. response = request.urlopen(req)
  14. print(response.read().decode('utf-8'))

亦可使用add_header()方法来添加报头,实现浏览器的模拟,添加data属性亦可如下书写:

补充:还可以使用bulid_opener()修改报头,不过多阐述,够用了就好。

  1. from urllib import request, parse
  2.  
  3. url = 'http://httpbin.org/post'
  4. dict = {
  5. 'name': 'Germey'
  6. }
  7. data = parse.urlencode(dict).encode('utf-8')
  8. req = request.Request(url=url, data=data, method='POST')
  9. req.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
  10. response = request.urlopen(req)
  11. print(response.read().decode('utf-8'))
  • 实例2:(get请求) 百度关键字的查询
  1. from urllib import request,parse
  2.  
  3. url = 'http://www.baidu.com/s?wd='
  4. key = '路飞'
  5. key_code = parse.quote(key)
  6. url_all = url + key_code
  7. """
  8. #第二种写法
  9. url = 'http://www.baidu.com/s'
  10. key = '路飞'
  11. wd = parse.urlencode({'wd':key})
  12. url_all = url + '?' + wd
  13. """
  14. req = request.Request(url_all)
  15. response = request.urlopen(req)
  16. print(response.read().decode('utf-8'))

在这里,对编码decode、reqest模块里的quote()方法、urlencode()方法 等就有疑问了,,对此,做一些说明:

  1. parse.quote:将str数据转换为对应的编码
  2. parse.urlencode:将字典中的k:v转换为K:编码后的v
  3. parse.unquote:将编码后的数据转化为编码前的数据
  4. decode 字符串解码 decode("utf-8")跟read()搭配很配!
  5. encode 字符串编码
  1. >>> str0 = '我爱你'
  2. >>> str1 = str0.encode('gb2312')
  3. >>> str1
  4. b'\xce\xd2\xb0\xae\xc4\xe3'
  5. >>> str2 = str0.encode('gbk')
  6. >>> str2
  7. b'\xce\xd2\xb0\xae\xc4\xe3'
  8. >>> str3 = str0.encode('utf-8')
  9. >>> str3
  10. b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
  11. >>> str00 = str1.decode('gb2312')
  12. >>> str00
  13. '我爱你'
  14. >>> str11 = str1.decode('utf-8') #报错,因为str1是gb2312编码的
  15. Traceback (most recent call last):
  16. File "<pyshell#9>", line 1, in <module>
  17. str11 = str1.decode('utf-8')
  18. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte

* encoding指定编码格式

在这里,又有疑问了?read()、readline()、readlines()的区别:

  1. read():全部,字符串str
  2. reasline():一行
  3. readlines():全部,列表list

0.爬虫 urlib库讲解 urlopen()与Request()的更多相关文章

  1. 1.爬虫 urlib库讲解 Handler高级用法

    在前面我们总结了urllib库的 urlopen()和Request()方法的使用,在这一小节我们要使用相关的Handler来实现代理.cookies等功能. 写在前面: urlopen()方法不支持 ...

  2. 2.爬虫 urlib库讲解 异常处理、URL解析、分析Robots协议

    1.异常处理 URLError类来自urllib库的error模块,它继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过这个类来处理. from urllib ...

  3. 3.爬虫 urlib库讲解 总结

    urllib库的总结: 用ProcessOn(安利这个软件,够用了)根据前面的几节内容做了个思维导图. urllib库一共有四个模块: request:它是最基本的模块,可以用来模拟发送请求 erro ...

  4. 4.爬虫 requests库讲解 GET请求 POST请求 响应

    requests库相比于urllib库更好用!!! 0.各种请求方式 import requests requests.post('http://httpbin.org/post') requests ...

  5. 5.爬虫 requests库讲解 高级用法

    0.文件上传 import requests files = {'file': open('favicon.ico', 'rb')} response = requests.post("ht ...

  6. 6.爬虫 requests库讲解 总结

    requests库的总结: 用ProcessOn根据前面的几节内容做了个思维导图:

  7. Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  8. 爬虫-Python爬虫常用库

    一.常用库 1.requests 做请求的时候用到. requests.get("url") 2.selenium 自动化会用到. 3.lxml 4.beautifulsoup 5 ...

  9. 对于python爬虫urllib库的一些理解(抽空更新)

    urllib库是Python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数: 在Python3的urllib库中,所有和网 ...

随机推荐

  1. c# 常见验证邮箱、电话号码、日期等格式

    #region 验证邮箱验证邮箱 /**//// <summary> /// 验证邮箱 /// </summary> /// <param name="sour ...

  2. 数据库优先生成EF CRUD演示

    ①准备我们的数据库: Northwind ②新建 实体数据模型,由数据库优先创建 ③创建控制器,这里我们只针对了Customers这张表做演示,实际会复杂的多 注:你可以把上面两步合成一步来写,创建控 ...

  3. webpack4——打包html报错解决

    ①先引入html-webpack-plugin插件,然后在终端下载 npm install --save-dev html-webpack-plugin ②我的文件结构 ③修改webpack.dev. ...

  4. Spring知识点总结(三)之注解方式实现IOC和DI

        1. 注解概念        所谓注解就是给程序看的提示信息,很多时候都用来作为轻量级配置的方式.        关于注解的知识点,参看java基础课程中java基础加强部分的内容.    2 ...

  5. 18年selenium3+python3+unittest自动化测试教程(下)

    第六章 自动化测试进阶实战篇幅 1.自动化测试实战进阶之网页单选性别资料实战 简介:讲解使用selenium修改input输入框和单选框 2.自动化测试之页面常见弹窗处理 简介:讲解使用seleniu ...

  6. Question20180106 Java环境变量的配置及为什么要配置环境变量

    Question 1  Java环境变量的配置及为什么要配置环境变量 Q1.1为什么要配置环境变量 在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PA ...

  7. requirements.txt 快速备份与安装项目所需安装包

    在查看项目时,通常会有一个requirements.txt 文件, requirements.txt 文件是用于记录所有依赖包及其精确的版本号,便于项目在其它电脑时新环境部署构建项目所需要的运行环境. ...

  8. Oracle数据库大量library cache: mutex X及latch: shared pool问题排查一例

    业务系统数据库夯住,数据库内大量的library cache: mutex X及latch: shared pool等待,alert日志信息如下 Tue Sep :: WARNING: inbound ...

  9. 纯 HTML5 APP与原生APP的差距在哪?

    纯 HTML5 APP与原生APP的差距在哪? 写过一些纯H5的APP,虽然开发起来的确很快很舒服,但和原生比起来纯H5APP还是有很多问题,主要聚集在以下几个方面: 1.动画 动画有很多种,比如侧边 ...

  10. Java的内存--存储

    0.参考资料: http://www.j2megame.org/index.php/content/view/2246/125.html 1.Java的内存机制 Java 把内存划分成两种:一种是栈内 ...