返回顶部
首页 > 资讯 > 后端开发 > Python >初识urllib
  • 475
分享到

初识urllib

urllib 2023-01-30 22:01:02 475人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

使用urllibrequest:  是最基本的 Http 请求模块,可以用来模拟发送请求,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程了。error:  异常处理模块,如果出现请求错误, 可以捕获这些异

使用urllib

request:  是最基本的 Http 请求模块,可以用来模拟发送请求,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程了。

error:  异常处理模块,如果出现请求错误, 可以捕获这些异常,然后进行重试或其它操作以保证程序不会意外终止。

parse:  工具模块,提供了许多 URL 处理方法,比如拆分、解析,合并等。

robotparser:  主要是用来识别网站的robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬,用得较少。


发送请求

使用urllib的request模块,可以实现请求的发送并得到响应

具体用法:

urlopen()

urllib.request 模块提供了最基本的构造 HTTP请求的方法, 利用它可以模拟浏览器的一个请求发起过程, 同时它还带有处理授权验证( authenticaton )、重定向( redirection 、浏览器 Cookies 及其他内容

以百度为例,把网页抓下来

#!/usr/bin/env pythoncoding: utf-8
import urllib.request

response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode('utf8'))

运行结果如下:

blob.png

这里只用了两行代码,便完成了百度首页的抓取,显示了网页的源代码,得到了源代码之后呢?想要的链接,图片地址,文本信息就可以从中提取出来。


利用type()函数查看response的数据类型

import urllib.request

response = urllib.request.urlopen("http://www.baidu.com")
print(type(response))

输出结果如下:

<class 'http.client.HTTPResponse'>

它是一个HTTPResponse类型的对象,主要包含read(),readinto(),getheader(name),getheaders(name),fileno()等方法以及msg,version,status,reason,debuglevel,closed等属性


调用read()方法可以得到返回的网页内容,调用status属性可以得到返回结果的状态码,如200代表请求成功,404代表网页未找到等。

实例如下:

#!/usr/bin/env Python
# coding: utf-8
import urllib.request

response = urllib.request.urlopen("http://www.baidu.com")
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))

运行结果如下:

blob.png


利用最基本的urlopen()方法,可以完成最基本的简单网页GET请求抓取。还可以传递一些参数,源码如下:

blob.png

除了第一个参数可以传递URL之外,还可以传递其它内容,data(附加数据),timeout(超时时间)等....


参数详情介绍

data参数

data 参数是可选的。如果要添加该参数,并且如果它是字节流编码格式的内容,即 bytes 类型,则需要通过 bytes()方法转化。另外,如果传递了这个参数,则它的请求方式就不再是 GET 方式,而是POST方式.

实例:

#!/usr/bin/env python
# coding: utf-8
import urllib.request
import urllib.parse

data = bytes(urllib.parse.urlencode({'test': 'hello world'}), encoding='utf8')
response = urllib.request.urlopen("http://httpbin.org/post", data=data)
print(response.read().decode('utf8'))

运行结果如下

blob.png

注释:上面传递了一个字典,键为test,值为hello wrod,传递过程中需要被转码为bytes(字节流)类型,类型转换用到了bytes()方法,该方法的第一个参数需是str(字符串)类型,而上面传的是一个字典类型,这个时候需要用urllib.parse模块里的urlencode()方法将字典转化成字符串;第二个参数指定编码格式为utf8。

http://httpbin.org/post,这个链接可以用来测试POST请求,传递的参数出现在form字段中,表示模拟了表单提交的方式,以POST方式传递数据。


timeout参数

timeout参数用于设置超时时间,单位为秒,意思就是超过设定的时间,还没有得到响应,就会抛出异常,不指定,使用全局默认时间,支持http,https,ftp请求。

实例:

#!/usr/bin/env python
# coding: utf-8
import urllib.request

response = urllib.request.urlopen("http://httpbin.org/get", timeout=1)
print(response.read().decode('utf8'))

运行结果如下:

blob.png

注释:这里设置超时时间为1秒,1秒后没有响应,就会抛出异常,异常属于urllib.error模块

因此,可以通过设置这个超时时间来控制一个网页如果长时间未响应,就跳过它抓取,可以利用try except语句来实现,代码如下:

#!/usr/bin/env python
# coding: utf-8
import urllib.request
import urllib.error
import Socket

try:
    response = urllib.request.urlopen("http://httpbin.org/get", timeout=0.1)
except urllib.error.URLError as e:
    if isinstance(e.reason, socket.timeout):
        print("Time out")

运行结果如下:

Time out

注释:这里请求了http://httpbin.org/post测试连接,设置了超时时间为0.1秒,然后捕获了URLError异常,接着判断异常是socket.timeout类型(超时异常),得出确实是超时报错,最后打印Time out, 按照常理0.1秒内不可能得到服务器响应,所有超时,通过设置timeout这个参数来实现超时处理,还是很有用的


其它参数

除了 data 参数和 timeout 参数外,还有 context 参数,它必须是 ssl.SSLContext 类型,用来指定SSL设置, 此外,cafile和capath 这两个参数分别指定 CA 证书和它的路径,这个在请求 HTTPS 链接时会有用,若需要更加详细的文档信息,可以找到python的安装目录,找到Doc目录,下面会有一个pythons354.chrm文档,如下:

blob.png


Request

利用urlopen()方法可以实现最基本请求的发起,但这个几个简单的参数并不足以构建一个完整的请求,如果请求中需要加入Headers等信息,就可以利用更强大的Request类来构建

Request用法实例:

#!/usr/bin/env python
# coding: utf-8
import urllib.request

request = urllib.request.Request('http://www.baidu.com')
response = urllib.request.urlopen(request)
print(response.read().decode('utf8'))

注释:依旧是用urlopen()方法来发送这个请求,不过这次该方法的参数不再是URL,而是一个Request类型的对象。通过构造这个数据结构,一方面我们可以将请求独立成一个对象,另一方面可更加丰富和灵活地配置参数。


Request构造源码如下:

blob.png

第一个参数url用于请求URL,这是比传参数,其它都是可选

第二个参数data,如果需要传,必须传bytes(字节流)类型的。如果是字典,先用urllib.parse模块里的urlencode()编码

第三个参数 headers 是一个字典,它就是请求头, 在构造请求时通过 headers 参数直接构造,也可以通过调用请求实例的 add_header()方法添加。添加请求头最常用的用法就是通过修改 User-Agent 来伪装浏览器,默认的 User-Agent是Python-urllib,可以通过修改它来伪装成浏览器。

第四个参数 origin_req_host 指的是请求方的 host 名称或者 IP 地址。

第五个参数unverifiable 表示这个请求是否是无法验证的,默认是 False ,意思就是说用户没有足够权限来选择接收这个请求的结果。例如,请求一个HTML 文档中的图片,但是没有自动抓取图像的权限,这时 unverifiable 的值就是 True。

第六个参数method是一个字符串 ,用来指示请求使用的方法,比如 GET, POST, PUT等


实例,传入多个参数构建请求:

#!/usr/bin/env python
# coding: utf-8
from urllib import request,parse

url = 'http://httpbin.org/post'
headers = {
    'User-Agent': 'Mozilla/4.0 (compatible; MSIE S. S; windows NT)',
    'Host': 'httpbin.org',
}
dict = {
    'name': 'zhangsan'
}

data = bytes(parse.urlencode(dict), encoding='utf8')
req = request.Request(url=url, data=data, headers=headers, method='POST')
response = request.urlopen(req)
print(response.read().decode('utf8'))

运行结果如下;

blob.png

注释:通过4个参数构造了一个请求,其中url即请求URL,headers中指定了User-Agent和Host,参数data用urloncode()和bytes()方法转成字节流,还指定了请求的方式为POST


通过上面的结果可以看出,成功设置了data,headers和method,另外headers也可以用add_header()方法来添加

req = request.Request(url=url, data=data, method='POST')

req .add_header('User-Agent', 'Mozilla/4 .0 (compatible; MSIE 5.5; Windows NT )')

这样更加方便地构造请求,实现请求的转发


--结束END--

本文标题: 初识urllib

本文链接: https://lsjlt.com/news/179187.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 初识urllib
    使用urllibrequest:  是最基本的 HTTP 请求模块,可以用来模拟发送请求,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程了。error:  异常处理模块,如果出现请求错误, 可以捕获这些异...
    99+
    2023-01-30
    urllib
  • redis初识
    redis介绍 redis是什么 redis是一种基于键值对的NOsql数据库,与很多键值对数据库不同,redis中的值string,hash,list,set,zset,geo等多种数据机构和算法组成,因为redis会将所有的数...
    99+
    2015-08-13
    redis初识
  • 初识Redis
    初识Redis NoSQL是什么? 数据库: 用来存储数据的仓库 NoSQL: 不仅仅是SQL,是许多非关系型数据库的统称,但本质上还是存储数据的仓库 为什么需要NoSQL? 解决了高并发的读写问题 解决了海量数据的高效率存储和...
    99+
    2019-03-22
    初识Redis
  • 初识Node.js
    1、Node.js是什么 [1]Node是一个服务器端 JavaScript 解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅...
    99+
    2022-06-04
    Node js
  • 初识Android.bp
               初识Android.bp 前言    最近在捣鼓Android 9 和10的build系统,看到一篇比较好的博...
    99+
    2022-06-06
    Android
  • 初识EXPDP
    EXPDP介绍 使用dump文件集导入数据和元数据的工具。dump文件集只能被IMPDP导入。dump文件集是由表数据,数据库对象元数据,控制信息组成。由专用的二进制格式编写。这些dump文件由server...
    99+
    2024-04-02
  • 初识MySQL
    💕与其抱怨生活的不公,不如积极行动改变它。💕 🐼作者:不能再留遗憾了🐼 🎆专栏:MySQL学习🎆 &...
    99+
    2023-09-01
    mysql 数据库 postgresql
  • 初识Java
    一、Java语言概述 1.1 Java是什么 Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义 不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署...
    99+
    2023-10-24
    java 开发语言
  • html初识
    web标准web准备介绍:w3c:万维网联盟组织,用来制定web标准的机构(组织)web标准:制作网页遵循的规范web准备规范的分类:结构标准、表现标准、行为标准。结构:html。表示:css。行为:Javascript。web准备总结:结...
    99+
    2023-01-30
    html
  • 初识django
    HTTP协议   超文本传输协议 四大特性:   1.基于TCP/IP作用在应用层上的协议   2.基于请求响应   3.无连接   4.无状态 数据格式之请求   请求首行   请求头(一堆k,v键值对)   /r/n   请求体 数据...
    99+
    2023-01-31
    django
  • 初识Tornado
    引言 回想Django的部署方式 以Django为代表的python web应用部署时采用wsgi协议与服务器对接(被服务器托管),而这类服务器通常都是基于多线程的,也就是说每一个网络请求服务器都会有一个对应的线程来用web应用(如Dja...
    99+
    2023-01-31
    Tornado
  • 初识Flask
    Flask简介       Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。默认情况下,Flask 不包含数据库抽...
    99+
    2023-01-31
    Flask
  • Python初识
    1.python介绍 python是一门先编译后解释的语言 动态脚本语言 PyCodeObject和pyc文件 pyCodeObject是python编译器真正的编译成的结果。当python程序运行时,编译的结果是保存在位于内存中的PyCo...
    99+
    2023-01-31
    Python
  • 初识P3P
    Google 标签: P3P, 第三方cookie, 隐私策略, http head P3P主要应用于网站跨域访问方面,全称为隐私偏好设定平台(platform for privacy preference, P3P)。而谈到P3P就不得不...
    99+
    2023-01-31
    P3P
  • 初识Linux_3
    1,find 目录 条件 [处理命令]-默认是print操作2,find d6 -name "*cpp" -exec rm{} ";"(或者‘;’或者/;都是Ok的),这条命令的含义是找到d6文件夹中所有以.cpp结尾的文件然后将其进行删除...
    99+
    2023-01-31
  • 初识Python
      Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。  Python是纯粹的自由软件,源代码和解释器CPython遵循GPL(GNU Gene...
    99+
    2023-01-31
    Python
  • 初识 Python
    1.源码安装 ipython 1.2.1[root@Client-1]# tar -xf ipython 1.2.1.tar.gz[root@Client-1]cd ipython 1.2.1[root@Client-1 ipython-1...
    99+
    2023-01-31
    Python
  • SpringAOP初识——初学者向
    Spring中最重要的两个部分         1.IOC 控制反转         2.AOP面向切面编程       博主之前有一篇文章是关于SpringIOC的理解:关于SpringIOC的理解有需要的小伙伴可以自行跳转。      ...
    99+
    2023-08-31
    mybatis java mysql
  • 01.初识MySQL
    MySQL理论 1. 数据库 数据: 数据就是一种符号,记录人类认为有价值的东西,例如图片、视频、文字、表格等 从计算机角度来看,就是二进制、16进制的文件 数据库的分类: RDBMS:关系型数据库管理系统 二维表结构,有清楚的...
    99+
    2016-05-23
    01.初识MySQL
  • 初识MongoDB(1)
    基本简介 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,语法有点类型javascript面向对象的查询语言,它是一个买你想几核的,模式自由的文档型数据库。实现类似关系数...
    99+
    2015-03-31
    初识MongoDB(1)
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作