当前位置: 首页 > news >正文

Python - 爬虫-网页抓取数据-库urllib

urllib库是Python内置的HTTP请求库。无需额外安装,可以直接使用。urllib库包含以下四个模块。

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

1、request:最基本的HTTP请求模块,可以模拟请求的发送。只需给该库方法传入URL以及对应的参数,就可以模拟浏览器发送请求了

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

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

4、robotparser:主要用来识别网站的robot.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 设置。

推荐一个测试网站,用于提交各种请求:http://httpbin.org/,该网站的更多的用法自行搜索

r = urllib.request.urlopen('http://httpbin.org/get')
# 读取response内容
text = r.read()
# http返回状态码和msg
print("http返回状态码:%s;返回msg:%s"%(r.status,r.msg)) # http返回状态码:200;返回msg:OK
r.close()

read() 是读取整个网页内容 

除了 read() 函数外,还包含以下两个读取网页内容的函数:

  • readline() - 读取文件的一行内容

from urllib.request import urlopen

myURL = urlopen("https://www.baidu.com/")
print(myURL.readline()) #读取一行内容
  • readlines() - 读取文件的全部内容,它会把读取的内容赋值给一个列表变量。

from urllib.request import urlopen

url= urlopen("https://www.baidu.com/")
lines = url.readlines()
for line in lines:
    print(line) 
import urllib
import json
from urllib import robotparser

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

print('--------返回状态码和msg---------')
r = urllib.request.urlopen('http://httpbin.org/get')
# 读取response内容
text = r.read()
# http返回状态码和msg
print("http返回状态码:%s;返回msg:%s"%(r.status,r.msg)) # http返回状态码:200;返回msg:OK
r.close()


print('--------error---------')
url = urllib.request.urlopen("https://www.baidu.com/")
print(url.getcode())   # 200

try:
    url = urllib.request.urlopen("https://www.baidu.com/index11.html")
except urllib.error.HTTPError as e:
    if e.code == 404:
        print(404)   # 404

print('--------load函数加载的Json内容---------')
# load函数加载json格式内容
obj = json.loads(text)
print(f"load函数加载的Json内容: {obj}") # load函数加载的Json内容: {'args': {}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6a7-273842674fbc43b01cdc3fba'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get'}


print('--------headers参数---------')
# r.headers是一个HTTPMessage对象
print(r.headers)
# Date: Sat, 08 Feb 2025 02:51:19 GMT
# Content-Type: application/json
# Content-Length: 274
# Connection: close
# Server: gunicorn/19.9.0
# Access-Control-Allow-Origin: *
# Access-Control-Allow-Credentials: true
for key,value in r.headers._headers:
    print('header每行参数-%s:%s' %(key,value))
    # header每行参数-Date:Sat, 08 Feb 2025 02:51:19 GMT
    # header每行参数 - Content - Type: application / json
    # header每行参数 - Content - Length: 274
    # header每行参数 - Connection: close
    # header每行参数 - Server: gunicorn / 19.9.0
    # header每行参数 - Access - Control - Allow - Origin: *
    # header每行参数 - Access - Control - Allow - Credentials: true


print('--------headers参数---------')
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
# 添加自定义的头信息
req = urllib.request.Request('http://httpbin.org/user-agent')
req.add_header('User-Agent', ua)
# 接受一个urllib.request.Request对象
r = urllib.request.urlopen(req)
resp = json.loads(r.read())
# 打印httpbin网站返回信息里的user-agent
print('网站返回的user-agent:', resp["user-agent"]) # 网站返回的user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3


print('--------auth验证登录---------')
auth_handler = urllib.request.HTTPBasicAuthHandler()
auth_handler.add_password(realm='httpbin auth',
                          uri='/basic-auth/admin/admin123',
                          user='admin',
                          passwd='admin123')
opener = urllib.request.build_opener(auth_handler)
urllib.request.install_opener(opener)
r = urllib.request.urlopen('http://httpbin.org')
print(r.read().decode('utf-8'))


print('--------GET参数---------')
params = urllib.parse.urlencode({'name': 'admin', 'password': 'admin123'})
url = 'http://httpbin.org/get?%s'%params
with urllib.request.urlopen(url) as r:
    print(json.load(r)) # {'args': {'name': 'admin', 'password': 'admin123'}, 'headers': {'Accept-Encoding': 'identity', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6a9-78e0111069464ef205e85476'}, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/get?name=admin&password=admin123'}


print('--------POST参数---------')
data = urllib.parse.urlencode({'name': 'admin', 'password': 'admin123'})
data = data.encode()
with urllib.request.urlopen('http://httpbin.org/post', data) as r:
    print(json.load(r)) # {'args': {}, 'data': '', 'files': {}, 'form': {'name': 'admin', 'password': 'admin123'}, 'headers': {'Accept-Encoding': 'identity', 'Content-Length': '28', 'Content-Type': 'application/x-www-form-urlencoded', 'Host': 'httpbin.org', 'User-Agent': 'Python-urllib/3.13', 'X-Amzn-Trace-Id': 'Root=1-67a6c6aa-3d49564d145ee67e2d47dd95'}, 'json': None, 'origin': '58.241.18.10', 'url': 'http://httpbin.org/post'}


print('--------代理IP请求远程URL---------')
proxy_handler = urllib.request.ProxyHandler({'http': 'http://127.0.0.1:8080'})
# proxy_auth_handler = urllib.request.ProxyBasicAuthHandler()
opener = urllib.request.build_opener(proxy_handler)
# r = opener.open('http://httpbin.org/ip')
# print(r.read())


print('--------urlparse模块---------')
o = urllib.parse.urlparse('http://httpbin.org/get')
print(o) # ParseResult(scheme='http', netloc='httpbin.org', path='/get', params='', query='', fragment='')


print('--------robotparser模块---------')
# 在 Python 3 中,robotparser 是一个独立的模块,而不是 urllib 的一个属性
# 使用 import robotparser 来直接导入 robotparser 模块。
# 或者使用 from urllib import robotparser 来从 urllib 包中导入 robotparser
rp = robotparser.RobotFileParser()
rp.set_url("http://httpbin.org/robots.txt")
print(rp.read())

二、urllib.error

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

urllib.error 包含了两个方法,URLError 和 HTTPError。

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

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

url = urllib.request.urlopen("https://www.baidu.com/")
print(url.getcode())   # 200

try:
    url = urllib.request.urlopen("https://www.baidu.com/index11.html")
except urllib.error.HTTPError as e:
    if e.code == 404:
        print(404)   # 404

三、urllib.parse

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

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

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

o = urllib.parse.urlparse('http://httpbin.org/get')
print(o) # ParseResult(scheme='http', netloc='httpbin.org', path='/get', params='', query='', fragment='')

完整内容如下:

属性

索引

值(如果不存在)

scheme

0

URL协议

scheme 参数

netloc

1

网络位置部分

空字符串

path

2

分层路径

空字符串

params

3

最后路径元素的参数

空字符串

query

4

查询组件

空字符串

fragment

5

片段识别

空字符串

username

用户名

None

password

密码

None

hostname

主机名(小写)

None

port

端口号为整数(如果存在)

None

四、urllib.robotparser

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

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

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

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) -为指定的 useragent 从 robots.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

在 Python 3 中,robotparser 是一个独立的模块,而不是 urllib 的一个属性;

使用 import robotparser 来直接导入 robotparser 模块;

或者使用 from urllib import robotparser 来从 urllib 包中导入 robotparser

# 在 Python 3 中,robotparser 是一个独立的模块,而不是 urllib 的一个属性
# 使用 import robotparser 来直接导入 robotparser 模块。
# 或者使用 from urllib import robotparser 来从 urllib 包中导入 robotparser
rp = robotparser.RobotFileParser()
rp.set_url("http://httpbin.org/robots.txt")
print(rp.read())

相关文章:

  • 机器视觉之光源选型
  • 微服务的简单认识
  • JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南
  • 算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】
  • 标准化与归一化的区别
  • [python] next
  • 01-03手写持久层框架-JDBC问题与框架实现思路
  • NVIDIA工业设施数字孪生中的机器人模拟
  • 嵌入式仿真实验教学平台的核心优势再解析:对比Proteus的技术与教学价值突破
  • GCC RISCV 后端 -- 控制流(Control Flow)的一些理解
  • 【渗透测试】Vulnhub靶机-FSoft Challenges VM: 1-详细通关教程
  • IROS 2025将于杭州举办,开启中国机器人发展与国际交流新契机
  • 第2.6节 iOS生成全量和增量报告
  • 前沿技术有哪些改变生活
  • 最新企业ERP进销存管理系统源码 基于PHP+MySQL 含完整图文部署教程
  • java 启动jar将日志每天输入
  • HDMI接口设计
  • TCP-IP模型
  • 深度学习——深入解读各种卷积的应用场景优劣势与实现细节
  • 如何应对Google Play卡审的问题?
  • 毕业设计做购物网站/输入搜索内容
  • 广州淘宝网站建设/金华seo扣费
  • 潍坊企业网站模板/网站批量查询
  • 网站建设?首选百川互动/百度seo是什么
  • 怎么建设营销型网站/企业网站制作价格
  • 手机网站建设的企业/竞价代运营外包公司