python的urllib模块和http模块

打印 上一主题 下一主题

主题 1029|帖子 1029|积分 3087

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.python的urllib库用于操作网页,并对网页内容进行处置处罚
urllib包有如下模块:
        urllib.request:打开和读取URL
        urllib.error:     包含urllib.request抛出的非常
        urllib.parse:   解析URL
       urllib.robotparser: 解析robots.txt文件
urllib的request模块

urllib.request定义了一些打开URL的函数和类,包含授权验证、重定向、浏览器cookies等
urllib.request可以模拟浏览器的一个哀求发起过程
我们可以利用urllib.request的urlopen方法来打开一个URL,语法格式如下
urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)
url:url地址
data:发送到服务器的其他数据对象,默认为None
timeout:设置访问超时时间
cafile和capath:cafile为CA证书,capath为CA证书的路径,利用HTTPS必要用到
cadefault:已经被启用
context:ssl.SSLContext类型,用来 指定SSL设置
read来读取全部内容
  1. import urllib.request
  2. myurl=urllib.request.urlopen('http://www.baidu.com')
  3. print(myurl.read()) #read用来读取网站的所有内容
复制代码
可以指定长度,指定长度为300个字符
  1. import urllib.request
  2. myurl=urllib.request.urlopen('http://www.baidu.com')
  3. print(myurl.read(300))
复制代码
通过readline读取一行内容
  1. import urllib.request
  2. myurl=urllib.request.urlopen('http://www.baidu.com')
  3. print(myurl.readline())
复制代码
readlines来读取文件的全部内容,读取到的内容赋值给一个列表变量
  1. from urllib.request
  2. myurl=urllib.request.urlopen('http://www.baidu.com')
  3. print(myurl.readlines())
复制代码
判断网页是否可以正常访问

  1. import urllib.request
  2. myurl=urllib.request.open('http://www.baidu.com')
  3. print(myurl.getcode())  #返回问的状态码是多少
  4. try:
  5.     myurl2=urllib.request.urlopen('http://www.baidu.com/no.html')
  6. except urllib.error.HTTPError as e:
  7.        if e.code==404
  8.             print(404)
复制代码
抓取网页生存到本地
  1. from urllib.request
  2. myurl=urllib.request.urlopen('http://www.baidu.com')
  3. f=open('1.html','wb')
  4. context=myurl.read()
  5. f.write(context)   
  6. f.close()
复制代码
url编码和解码可以利用quote和unquote方法
  1. import urllib.request
  2. encode=urllib.request.quote('http://www.baidu.com')  #对字符进行编码
  3. print(encode)
  4. decode=urllib.request.unquote(encode)  #对变量encode进行解码
  5. print(decode)
  6. 结果为:
  7. https%3A//www.runoob.com/
  8. https://www.runoob.com/
复制代码
模拟头部信息:
我们抓取网页一样平常必要对header(网页头部信息)进行模拟,必要用到urllib.request.Request类
  1. class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
  2. url:url地址
  3. data:发送到服务器其他数据对象,默认为None
  4. headers:http请求的头部信息,字典格式
  5. origin_req_host:请求的主机地址,ip或者域名
  6. unverifiable:少用参数,用于设置网页是否需要验证,默认为False
  7. method:请求方法,GET,POST,DELETE,PUT等
复制代码
实例1-1
  1. import urllib.request
  2. import urllib.parse
  3. url='https://www.runoob.com/s=' #这个是菜鸟的搜索网址
  4. keyword='java教程'  #这个是搜索的内容
  5. keycode=urllib.request.quote(keyword)  #对请求进行编码
  6. urlall=url+keycode  
  7. header={
  8.     'User-Agent':'Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
  9. }
  10. #这里reqeust对象通过Request类来构建http亲贵
  11. request=urllib.request.Request(urlall,headers=header)
  12. #这里请求了request这个对象,然后结果赋值到了response里
  13. response=urllib.reqeust.urlopen(request)
  14. print(response.read())
复制代码
执行以上代码会打印出来菜鸟教程中搜刮java教程后的页面代码
实例1-2   利用POST传递数据

1.先定义一个POST的html页面
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <form action="" type="text" name="myform">
  10.         Nmae:<input type="text" name="name"><br>
  11.         Pass:<input type="text" name="pass"><br>
  12.         <input type="submit" value="提交">
  13.     </form>
  14.     <hr>
  15.     <?php
  16.         if(isset($_POST['name']) &&$_POST['pass']){
  17.             echo 'hello word!';
  18.         }
  19.     ?>
  20. </body>
  21. </html>
复制代码
利用urllib来提交数据,看回显源码
  1. import urllib.request
  2. import urllib.parse
  3. url='https://www.runoob.com/try/py3/py3_urllib_test.php'  #提交到表单页面
  4. data={'name':'RUNOOB','tag':'菜鸟教程'}   #提交数据
  5. header={
  6.     'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
  7. }
  8. data=urllib.parse.urlencode(data).encode() #对参数进行编码,解码使用urllib.parse.urldecode()
  9. request=urllib.request.Request(url,data,header)
  10. response=urllib.request.urlopen(request).read()
  11. print(response.decode())
复制代码
源码如下,通过1.html来打开就可以看到网站回显了
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>菜鸟教程(runoob.com) urllib POST  测试</title>
  6. </head>
  7. <body>
  8. <form action="" method="post" name="myForm">
  9.     Name: <input type="text" name="name"><br>
  10.     Tag: <input type="text" name="tag"><br>
  11.     <input type="submit" value="提交">
  12. </form>
  13. <hr>
  14. RUNOOB, 菜鸟教程</body>
  15. </html>
复制代码
urllib的error模块

1.urllib.error模块为urllib.request所引发的非常定义了非常类,基础非常类是URLError
urlib.error包含了两个方法,URLError和HTTPError
URLError是OSError的一个子类,用于处置处罚程序在遇到问题会引发此非常,包含的属性reason为引发非常的原因,
HTTPError是URLError的一个子类,用于处置处罚特殊HTTP错误,比方作为认证哀求的时间,包含的属性code为HTTP的状态码,reason为引发非常的原因,headers为导致HTTPError的特定http哀求的http响应头
实例1-1:对不存在的页面抓取并处置处罚非常

  1. import urllib.request
  2. import urllib.error
  3. myURL1 = urllib.request.urlopen("https://www.runoob.com/")
  4. print(myURL1.getcode())   # 200
  5. try:
  6.     myURL2 = urllib.request.urlopen("https://www.runoob.com/no.html")
  7. except urllib.error.HTTPError as e:
  8.     if e.code == 404:
  9.         print(404)   # 404
复制代码
urllib的parse模块

urllib.parse模块用于解析URL,格式如下
  1. urllib.parse.urlparse(urlstring,scheme='',allow_fragments=True)
  2. urlstring    字符串的URL地址,scheme为协议类型
  3. allow_fragments   参数为false,则无法识别片段标识符,他们被解析为路径,参数或者查询组件的一部分,并fragments在返回值中设置为空字符串
复制代码
实例1-1
  1. from urllib.parse import urlparse
  2. o=urlparse("https://www.runoob.com/?s=python+%E6%95%99%E7%A8%8B")
  3. print(o)
  4. 返回结果:
  5. ParseResult(scheme='https', netloc='www.runoob.com', path='/', params='', query='s=python+%E6%95%99%E7%A8%8B', fragment='')
复制代码
从以上可以看出,内容是一个元组,包含6个字符串:协议,位置,路径,参数,查询,判断
我们可以直接读取协议:
  1. from urllib.parse import urlparse
  2. o=urlparse('https://www.runoob.com/?s=python+%E6%95%99%E7%A8%8B')
  3. print(o.scheme)  #schema是协议
  4. 返回结果为:
  5. https   
  6. 说明用的是https协议
复制代码
urlparse模块的解释
  1. 属性        索引        值                        值(如果不存在)
  2. scheme       0         URL协议                    scheme参数
  3. netloc       1         网络位置                   空字符串
  4. path         2         分层路劲                   空字符串
  5. params       3         最后路径元素的参数          空字符串
  6. query        4         查询组件                   空字符串
  7. fragment     5         片段识别                   空字符串
  8. username               用户名                     None
  9. password               密码                       None
  10. hostname               主机名(小写)              None
  11. port                  端口号为整数(如果存在)       None
复制代码
http包简介:

http包提供了利用HTTP协议的一些功能,其重要模块如下:
  1. http.client    底层的http协议客户端,可以为urllib.request模块所用
  2. http.server    提供了基于http协议客户端,可以为urllib.request模块所用
  3. http.cookies   coolies的管理工具
  4. http.cookiejar  提供了cookies的持久化支持
  5. 在http.client模块中用于客户端的类如下所示,
  6. HTTPConnection    基于HTTP协议的访问客户端
  7. HTTPSConnection   基于HTTPS协议的访问客户端
  8. HTTPResponse      基于HTTP协议的服务端响应
  9. HTTPConnection构造方法原型如下:
  10. HTTPConnection(host,port=None,[timeout,]source_address=None)
  11. 参数意义如下:
  12. host    服务器的地址
  13. port    用来指定访问的服务器端口,不提供则从host中提取,否则使用80端口
  14. timeout    指定超时秒数
  15. HTTPConnection对象的主要方法如下
  16. request(method,url,body,headers)
  17. method    发送的操作,一般为GET或POST
  18. url       进行操作的URL
  19. body      发送的数据
  20. headers   发送的HTTP头
  21. 当服务器发送请求后,可以使用HTTPConnection对象的getresponse()方法返回一个HTTPResponse对象,使用HTTPConnection对象的close()方法可以关闭服务器的连接,除了使用 request方法以外,还可以使用以下方法向服务器发送请求
  22. putrequest(request,selector,skip_host,skip_accept_encoding)
  23. putheader(header,argument,...)
  24. endheaders()
  25. send(data)
  26. putrequest方法的参数如下
  27. request    所发送的操作,如POST,GET,PUT
  28. selector   进行操作的URL
  29. skip_host  可选参数,若为真,禁止自动发送'HOST”
  30. skip_accept_encoding    可选参数,若为真,禁止自动发送Accept-Encoding:headers
  31. putheader方法的参数含义如下
  32. header    发送的HTTP头
  33. argument    发送的参数
  34. send方法的含义
  35. data    发送的数据
复制代码
实例1-1  利用http.client.HTTPConnection对象访问网站,
  1. from http.client import HTTPConnection
  2. mc=HTTPConnection('www.baidu.com')  #定义基于http的访问客户端对象
  3. mc.request('GET','/')  #请求方法为GET,url为根目录
  4. res=mc.getresponse()  #获取服务器响应
  5. print(res.status,res.reason)  #status返回状态码,reason返回对应状态码的短语OK
  6. print(res.read().decode())  #读取通过第4行响应的所有内容,内容进程字节串解码
复制代码
代码阐明:进本的访问示例,实例化http.client.HTTPConnection对象,指定哀求方法为GET,最后利用getresponse()方法取得访问的网页,打印出响应的状态与网页

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表