Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 爬虫库 urllib 使用详解,真的是总结的太到位了!!

Python 爬虫库 urllib 使用详解,真的是总结的太到位了!!

作者头像
用户6888863
发布于 2023-03-01 12:21:32
发布于 2023-03-01 12:21:32
2.1K00
代码可运行
举报
文章被收录于专栏:AI篮球与生活AI篮球与生活
运行总次数:0
代码可运行

Python urllib库

Python urllib库用于操作网页URL,并对网页的内容进行抓取处理。

urllib包 包含以下几个模块:

  • urllib.request - 打开和读取URL
  • urllib.error - 包含urllib.request抛出的异常。
  • urllib.parse - 解析URL
  • urllib.robotparser - 解析robots.txt文件。

需要用的就是每个模块的内置方法和函数。大概方法如下图:

urllib.request模块

urllib.request定义了一些打开URL的函数和类,包含授权验证、重定向、浏览器cookies等。

urllib.request可以模拟浏览器的一个请求发起过程。

这里主要介绍两个常用方法,urlopenRequest

urlopen函数

语法格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
  • urlurl地址。
  • data:发送到服务器的其他数据对象,默认为None
  • timeout:设置访问超时时间。
  • cafilecapathcafileCA证书,capathCA证书的路径,使用HTTPS需要用到。
  • cadefault:已经被弃用。
  • contextssl.SSLContext类型,用来指定SSL设置。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import urllib.request
#导入urllib.request模块
url=urllib.request.urlopen("https://www.baidu.com")
#打开读取baidu信息
print(url.read().decode('utf-8'))
#read获取所有信息,并decode()命令将网页的信息进行解码

运行结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="
html{color:#000;overflow-y:scroll;overflow:-moz-scrollbars}
body,button,input,select,textarea{font-size:12px;font-family:Arial,sans-serif}  
h1,h2,h3,h4,h5,h6{font-size:100%}                  
em{font-style:normal}
small{font-size:12px}
ol,ul{list-style:none}
a{text-decoration:none}
a:hover{text-decoration:underline}
legend{color:#000}
fieldset,img{border:0}
button,input,select,textarea{font-size:100%} 
...

response对象是http.client.HTTPResponse类型,主要包含readreadintogetheadergetheadersfileno等方法,以及msgversionstatusreasondebuglevelclosed等属性。

常用方法:

  • read():是读取整个网页内容,也可以指定读取的长度,如read(300)。获取到的是二进制的乱码,所以需要用到decode()命令将网页的信息进行解码。
  • readline(): 读取文件的一行内容。
  • readlines(): 读取文件的全部内容,它会把读取的内容赋值给一个列表变量。
  • info():返回HTTPMessage对象,表示远程服务器返回的头信息。
  • getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到。
  • geturl():返回请求的链接。

Request 类

我们抓取网页一般需要对headers(网页头信息)进行模拟,否则网页很容易判定程序为爬虫,从而禁止访问。这时候需要使用到urllib.request.Request类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
  • urlurl地址。
  • data:发送到服务器的其他数据对象,默认为None
  • headersHTTP请求的头部信息,字典格式。
  • origin_req_host:请求的主机地址,IP域名
  • unverifiable:很少用整个参数,用于设置网页是否需要验证,默认是False
  • method:请求方法, 如 GETPOSTDELETEPUT等。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import urllib.request
#导入模块
url = "https://www.baidu.com"
#网页连接
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
}
#定义headers,模拟浏览器访问
req = urllib.request.Request(url=url,headers=headers)
#模拟浏览器发送,访问网页
response = urllib.request.urlopen(req)
#获取页面信息
print(response.read().decode("utf-8"))

urllib.error模块

urllib.error模块为urllib.request所引发的异常定义了异常类,基础异常类是URLError

urllib.error包含了两个方法,URLErrorHTTPError

URLErrorOSError的一个子类,用于处理程序在遇到问题时会引发此异常(或其派生的异常),包含的属性reason为引发异常的原因。

HTTPErrorURLError的一个子类,用于处理特殊HTTP错误例如作为认证请求的时候,包含的属性codeHTTP的状态码,reason为引发异常的原因,headers为导致HTTPError的特定HTTP请求的HTTP响应头。

区别:

  • URLError封装的错误信息一般是由网络引起的,包括url错误。
  • HTTPError封装的错误信息一般是服务器返回了错误状态码。

关系:

  • URLErrorOSERROR的子类,HTTPErrorURLError的子类。

URLError 示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib import request
from urllib import error

if __name__ == "__main__":
    #一个不存在的连接
    url = "http://www.baiiiduuuu.com/"
    req = request.Request(url)
    try:
        response = request.urlopen(req)
        html = response.read().decode('utf-8')
        print(html)
    except error.URLError as e:
        print(e.reason)

返回结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Errno -2] Name or service not known

此错误的原因。它可以是一个消息字符串或另一个异常实例。

HTTPError示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib import request
from urllib import error

if __name__ == "__main__":
    #网站服务器上不存在资源
    url = "http://www.baidu.com/no.html"
    req = request.Request(url)
    try:
        response = request.urlopen(req)
        html = response.read().decode('utf-8')
        print(html)
    except error.HTTPError as e:
        print(e.code)

output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
404

URLErrorHTTPError混合使用

注意:由于HTTPErrorURLError的子类,所以捕获的时候HTTPError要放在URLError的上面。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib import request
from urllib import error

if __name__ == "__main__":
    #网站服务器上不存在资源
    url = "http://www.baidu.com/no.html"
    req = request.Request(url)
    try:
        response = request.urlopen(req)
 #       html = response.read().decode('utf-8')
    except error.HTTPError as e:
        print(e.code)
    except error.URLError as e:
        print(e.code)

如果不用上面的方法,可以直接用判断的形式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib import request
from urllib import error

if __name__ == "__main__":
    #网站服务器上不存在资源
    url = "http://www.baidu.com/no.html"
    req = request.Request(url)
    try:
        response = request.urlopen(req)
 #       html = response.read().decode('utf-8')
    except error.URLError as e:
        if hasattr(e, 'code'):
            print("HTTPError")
            print(e.code)
        elif hasattr(e, 'reason'):
            print("URLError")
            print(e.reason)

output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTTPError
404

urllib.parse模块

模块定义的函数可分为两个主要门类:URL解析和URL转码。

urlparse()

urllib.parse用于解析URL,格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

urlstring为字符串的url地址,scheme为协议类型。

allow_fragments参数为false,则无法识别片段标识符。相反,它们被解析为路径,参数或查询组件的一部分,并fragment在返回值中设置为空字符串。

标准链接格式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scheme://netloc/path;params?query#fragment

对象中包含了六个元素,分别为:协议(scheme)、域名(netloc)、路径(path)、路径参数(params)、查询参数(query)、片段(fragment)。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib.parse import urlparse

o = urlparse("https://docs.python.org/zh-cn/3/library/urllib.parse.html#module-urllib.parse")

print('scheme  :', o.scheme)
print('netloc  :', o.netloc)
print('path    :', o.path)
print('params  :', o.params)
print('query   :', o.query)
print('fragment:', o.fragment)
print('hostname:', o.hostname)

output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
scheme  : https
netloc  : docs.python.org
path    : /zh-cn/3/library/urllib.parse.html
params  :
query   :
fragment: module-urllib.parse
hostname: docs.python.org

以上还可以通过索引获取,如通过

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(o[0])
...
print(o[5])

urlunparse()

urlunparse()可以实现URL的构造。(构造URL

urlunparse()接收一个是一个长度为6的可迭代对象,将URL的多个部分组合为一个URL。若可迭代对象长度不等于6,则抛出异常。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib.parse import urlunparse
url_compos = ['http','www.baidu.com','index.html','user= test','a=6','comment']
print(urlunparse(url_compos))

output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://www.baidu.com/index.html;user= test?a=6#comment

urlsplit()

urlsplit()函数也能对 URL进行拆分,所不同的是,urlsplit()并不会把 路径参数(params) 从 路径(path) 中分离出来。

URL中路径部分包含多个参数时,使用urlparse()解析是有问题的,这时可以使用urlsplit()来解析.

urlunsplit()urlunparse()类似,(构造URL),传入对象必须是可迭代对象,且长度必须是5。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib.parse import urlunsplit
url_compos = ['http','www.baidu.com','index.html','user= test','a = 2']
print(urlunsplit(url_compos))urlunsplit()

output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://www.baidu.com/index.html?user= test#a = 2

urljoin()

同样可以构造URL

传递一个基础链接,根据基础链接可以将某一个不完整的链接拼接为一个完整链接.

注:连接两个参数的url, 将第二个参数中缺的部分用第一个参数的补齐,如果第二个有完整的路径,则以第二个为主。

URL 转码

python中提供urllib.parse模块用来编码和解码,分别是urlencode()unquote()

编码quote(string)

URL转码函数的功能是接收程序数据并通过对特殊字符进行转码并正确编码非ASCII文本来将其转为可以安全地用作URL组成部分的形式。它们还支持逆转此操作以便从作为URL组成部分的内容中重建原始数据,如果上述的URL解析函数还未覆盖此功能的话

语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urllib.parse.quote(string, safe='/', encoding=None, errors=None)

使用%xx转义符替换string中的特殊字符。字母、数字和 '_.-~' 等字符一定不会被转码。在默认情况下,此函数只对URL的路径部分进行转码。可选的safe形参额外指定不应被转码的ASCII字符 --- 其默认值为 '/'。

string可以是strbytes对象。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib import parse

url = "http://www.baidu.com/s?wd={}"
words = "爬虫"

#quote()只能对字符串进行编码
query_string = parse.quote(words)
url = url.format(query_string)
print(url)

执行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

编码urlencode()

quote()只能对字符串编码,而urlencode()可以对查询字符串进行编码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入parse模块
from urllib import parse

#调用parse模块的urlencode()进行编码
query_string = {'wd':'爬虫'}
result = parse.urlencode(query_string)

# format函数格式化字符串,进行url拼接
url = 'http://www.baidu.com/s?{}'.format(result)
print(url)

output

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB

解码 unquote(string)

解码就是对编码后的url进行还原。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from urllib import parse
string = '%E7%88%AC%E8%99%AB'
result = parse.unquote(string)
print(result)

执行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
爬虫

urllib.robotparser模块

(在网络爬虫中基本不会用到,使用较少,仅作了解)

urllib.robotparser用于解析robots.txt文件。

robots.txt(统一小写)是一种存放于网站根目录下的robots协议,它通常用于告诉搜索引擎对网站的抓取规则。

Robots协议也称作爬虫协议,机器人协议,网络爬虫排除协议,用来告诉爬虫哪些页面是可以爬取的,哪些页面是不可爬取的。它通常是一个robots.txt的文本文件,一般放在网站的根目录上。

当爬虫访问一个站点的时候,会首先检查这个站点目录是否存在robots.txt文件,如果存在,搜索爬虫会根据其中定义的爬取范围进行爬取。如果没有找到这个文件,搜索爬虫会访问所有可直接访问的页面。

urllib.robotparser提供了RobotFileParser类,语法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class urllib.robotparser.RobotFileParser(url='')

这个类提供了一些可以读取、解析robots.txt文件的方法:

  • set_url(url) - 设置robots.txt文件的URL
  • read() - 读取robots.txt URL并将其输入解析器。
  • parse(lines) - 解析行参数。
  • can_fetch(useragent, url) - 如果允许useragent按照被解析robots.txt文件中的规则来获取url则返回True
  • mtime() - 返回最近一次获取robots.txt文件的时间。这适用于需要定期检查robots.txt文件更新情况的长时间运行的网页爬虫。
  • modified() - 将最近一次获取robots.txt文件的时间设置为当前时间。
  • crawl_delay(useragent) - 为指定的useragentrobots.txt 返回Crawl-delay形参。如果此形参不存在或不适用于指定的useragent 或者此形参的robots.txt条目存在语法错误,则返回None
  • request_rate(useragent) -以 named tuple RequestRate(requests, seconds)的形式从robots.txt返回Request-rate形参的内容。如果此形参不存在或不适用于指定的useragent或者此形参的robots.txt条目存在语法错误,则返回None
  • site_maps() - 以list()的形式从robots.txt返回Sitemap形参的内容。如果此形参不存在或者此形参的robots.txt条目存在语法错误,则返回None
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 关于数据分析与可视化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】《Python网络爬虫从入门到精通》003-请求模块urllib
在进行网络编程和数据抓取的过程中,如何高效地发送请求和处理响应是每个开发者必须掌握的技能。而在Python中,urllib模块作为标准库的一部分,提供了强大而灵活的功能,让我们能够轻松地与互联网进行交互。
愚公搬代码
2025/07/11
820
Python 系列文章 —— 爬虫小案例
Example_Request # 采用 HTTP GET 请求的方法模拟谷歌浏览器访问网站,输出响应上下文 from urllib import request,parse url = 'http://www.python.org' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/
玩转编程
2022/01/13
2980
【python】urllib库之四大模块
【前言】 有好一段时间都没敲py了, 今天将urllib库算是较全的学习了一下老实说还是敲py比较舒服,当然还有requests,Beautiful库,正则表达式这些对于进行对爬去文章的处理都是不可避免的。
全栈程序员站长
2022/11/15
1.1K0
Python爬虫urllib详解
学习爬虫,最初的操作便是模拟浏览器向服务器发出请求,那么我们需要从哪个地方做起呢?请求需要我们自己来构造吗?需要关心请求这个数据结构的实现吗?需要了解 HTTP、TCP、IP 层的网络传输通信吗?需要知道服务器的响应和应答原理吗?
仲君Johnny
2024/02/05
4070
Python爬虫urllib详解
Python自带爬虫库urllib使用大全
这篇文章主要来讲解下Python自带的爬虫库urllib常见用法,主要围绕urllib定义、urllib的常用模块和urllib+lxml爬虫案例三个部分进行展开。
Python进阶者
2020/12/17
8500
【测试开发】python系列教程:urllib
大家都熟知的爬虫,爬虫就是请求网页,进行网页的抓取,那么如何进行网页的抓取呢,今天呢,给大家分享一个能够请求网页,进行数据抓取的库,python自带的urllib。
雷子
2023/08/25
2980
【测试开发】python系列教程:urllib
接口测试 | urllib篇 18 urllib介绍
概述 本文基于Python3分享urllib模块的源码分享,所以不要拿这python2来问我为什么找不到对应的源码。 在python3中urllib由以下几个模块构成: parse request response robotparser error 下面对这个几个模块进行一一分享。 parse模块 parse模块定义了统一的接口并实现了URL解析和引用功能。 简单的理解:parse模块可以把url进行拆分或组合,下面我们看下示例: #-*- coding:utf-8 -*- __author__ = "
苦叶子
2018/04/09
7870
Urllib库的基本用法
统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
全栈程序员站长
2022/07/09
4850
python爬虫从入门到放弃(三)之 Urllib库的基本使用
 官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库 包括以下模块 urlli
coders
2018/01/04
1.7K0
python爬虫从入门到放弃(三)之 Urllib库的基本使用
python爬虫常用库之urllib详解
这是日常学python的第10篇原创文章 以下为个人在学习过程中做的笔记总结之爬虫常用库urllib urlib库为python3的HTTP内置请求库 urilib的四个模块: urllib.request:用于获取网页的响应内容 urllib.error:异常处理模块,用于处理异常的模块 urllib.parse:用于解析url urllib.robotparse:用于解析robots.txt,主要用于看哪些网站不能进行爬取,不过少用 1 urllib.request urllib.request.url
sergiojune
2018/04/04
9160
Python基础教程(二十七):urllib模块
在Python中,urllib模块是一组用于处理URLs的标准库,它提供了发送网络请求、解析URLs、处理重定向和错误等功能。对于进行Web爬虫开发、数据抓取和API调用等任务,urllib模块是非常实用的工具。本文将深入探讨urllib模块的各个组成部分,包括urllib.request, urllib.parse和urllib.error,并通过具体案例帮助你掌握如何使用这些模块进行网络请求和数据处理。
用户11147438
2024/06/22
2290
Python3 Urllib库的基本使用
  将结合Urllib的官方文档进行说明。首先是urllib.request模块:
py3study
2020/01/10
1.3K0
python3爬虫urllib
在 Python 中有两种方式可以发送 HTTP 请求,分别是自带的 urllib 库和第三方的 requests 库。
AngelNH
2020/05/25
1.3K0
python3网络爬虫一《使用urllib.request发送请求》
在Python2版本中,有urllib和urlib2两个库可以用来实现request的发送。而在Python3中,已经不存在urllib2这个库了,统一为urllib。Python3 urllib库官方链接
全栈程序员站长
2022/08/02
5580
Python之urllib爬虫-request模块和parse模块详解
urllib是Python中用来处理URL的工具包,源码位于/Lib/下。它包含了几个模块:用于打开及读写的urls的request模块、由request模块引起异常的error模块、用于解析urls的parse模块、用于响应处理的response模块、分析robots.txt文件的robotparser模块。
唔仄lo咚锵
2022/05/08
1.2K0
Python之urllib爬虫-request模块和parse模块详解
Python-数据挖掘-urllib库
urllib 库是 Python 内置的 HTTP 请求库,它可以看作处理 URL 的组件集合。
小团子
2019/07/18
6610
Python-数据挖掘-urllib库
比较基础的urllib库来了解一下
在Python2.x中,这个库叫做urllib2,在Python3.x里,urllib2改名为urllib,被分成了三个子模块:
爱吃西瓜的番茄酱
2018/07/25
6010
Python爬虫之urllib库—进阶篇
urllib库除了一些基础的用法外,还有很多高级的功能,可以更加灵活的适用在爬虫应用中,比如,用HTTP的POST请求方法向服务器提交数据实现用户登录、当服务器检测出频繁使用同一IP而发出禁令时,如何使用代理IP来应对,如何设置超时,以及解析URL方法上的一些处理,本次将会对这些内容进行详细的分析和讲解。
Python数据科学
2018/08/06
5660
Python爬虫之urllib库—进阶篇
初识urllib
request:  是最基本的 HTTP 请求模块,可以用来模拟发送请求,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程了。
py3study
2020/01/20
7090
Python(十二)
本篇开始,将会学习有关 Python 爬虫的相关知识,通过几篇的介绍,完整学习 Python 爬虫的方方面面。
1ess
2021/11/01
5510
相关推荐
【愚公系列】《Python网络爬虫从入门到精通》003-请求模块urllib
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验