[Python]爬虫基础——urllib库

news2024/11/23 12:32:36

urllib目录

  • 一、简介
  • 二、发送请求
    • 1、urlopen()函数
    • 2、Request()函数
  • 三、异常处理
  • 四、解析URL
  • 五、分析Robots协议

一、简介

urllib库是Python内置的标准库。包含以下四个模块:
1、request:模拟发送HTTP请求;
2、error:处理HTTP请求错误时的异常;
3、parse:解析、拆分、合并URL;
4、robotparser:解析网站的robots.txt文件

案例:
爬取知乎网站的数据
首先要构造HTTP请求,然后将HTTP响应的各部分进行输出

第一步:准备工作,创建zhuhu.py文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二步:爬取菜鸟教程代码,敲入以下代码

#第一步:导入request模块
import urllib.request
#第二步:定义url字符串(菜鸟教程网站)
url = 'https://www.runoob.com/'
#第三步:构造HTTP请求,并把返回回值赋值给response
response = urllib.request.urlopen(url)
print('响应类型',type(response))
print('响应状态码',response.getcode())
print('编码方式',response.getheader('Content-Type'))
print('请求的URL',response.geturl())
#第四步:urlopen()函数获取网页,返回的网页内容数据格式为bytes类型,需要使用decode()函数解码,装换成str类型。
resp = response.read().decode('utf-8')
print('网页内容',resp)

运行结果如下:

在这里插入图片描述
结果:爬取的内容与网页内容一致,爬取网页成功
在这里插入图片描述

二、发送请求

request模块提供了基本的构造HTTP请求方法,同时可以处理授权验证(authentication)、重定向(redirection)、Cookie会话等。
使用urlopen()函数和Request()函数构造HTTP请求。
在这里插入图片描述

1、urlopen()函数

在这里插入图片描述

原型:
urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
url:请求的URL,必传。
data:请求信息,以get方式发送请求为None,以post方式发送请求时给出data参数(必须是bytes(字节流)类型)。
timeout:网络访问的超时时间。
cafile、captath、cadefault:用于实现可信任CA证书的HTTP请求很少使用。
context:实现SSL加密传输,很少使用。
注意:urlopen()函数的data参数必须是bytes(字节流)类型,如果是字典类型,可以先用urllib.parse模块的urlencode()函数编码。

调用urlopen()函数后,返回一个HTTPResponse类型的对象,以下是

HTTPResponse类型对象提供的属性和方法。

getcode():status:获取响应状态码;
get_url():获取请求的url;
getheaders():获取响应头的信息,返回二元组列表;
getheader(name):获取特定响应头信息;
info():获取响应头信息,返回字符串;
read()/readline():读取响应体。

在这里插入图片描述urlopen()函数既可以实现GET请求,也可以通过设置data参数实现POST请求。

2、Request()函数

函数原型:
Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
(1) url:请求的URL。
(2) data:请求信息,以get方式发送请求为None,以post方式发送请求时给出data参数(必须是bytes(字节流)类型)。
(3) headers:请求头信息(user_agent,cookie,host…)
(4) origin_req_host:客户端的host名称或者IP地址。
(5) unverifiable:表示请求无法验证,默认为False.
(6) method:请求方法(get/post)

当服务器有反爬虫机制时,可以通过设置headers参数伪装成浏览器去访问网站。

案例:爬取https://www.iconfont.cn/首页内容

#第一步:导入request模块
import urllib.request
#第二步:定义url字符串
url ='https://www.iconfont.cn/'
#第三步:设置headersvalue参数,伪装成浏览器
headersvalue = {
    'user-agent':' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}

#第四步:创建Request对象,并将返回的结果赋值给request
request =urllib.request.Request(url,headers=headersvalue)
#第五步:构造Http请求,并将返回结果赋值给response
response =urllib.request.urlopen(url)
#第六步:读取网页内容并解码
resp = response.read().decode('utf-8')
#第七步:输出网页内容
print("网页内容:",resp)

三、异常处理

error模块提供了request模块产生的异常处理,主要是URLError和HTTPError两个类。
1、URLError类:是error异常模块的基类,可以捕获request模块产生的异常,它具有一个reason属性(返回异常原因)。
2、HTTPError类是URLError类的子类,专门处理HTTP请求的异常,它具由3个属性,分别为reason(返回异常原因)、code(返回HTTP状态码)和headers(返回请求头)。

由于HTTPError是URLError的子类,并不能处理父类支持的异常处理,所以一般对两种异常分开捕获,可先捕获子类的异常,再捕获父类的异常。

#第一步:导入request模块
import urllib.request
#导入error模块
import urllib.error
#处理异常
try:
    # 构造HTTP请求,并将返回的结果赋值给response
    response = urllib.request.urlopen('https://www.gaoding.com/introduction')
    # 捕获HTTP请求的异常
except urllib.error.HTTPError as e:
    #输出HTTP请求的异常原因、状态码和请求头
    print('异常原因:',e.reason)
    print('状态码:',e.code)
    print('请求头:',e.headers)
except urllib.error.URLError as e:
    #捕获异常
    print(e.reason)
else:
    #如果没有异常则输出“Request Successfully”
    print('Request Successfully')




在这里插入图片描述

四、解析URL

parse模块提供解析URL方法,如下:
拆分:
urlparse(urlstring):将URL拆分为六个部分:scheme、netloc、path、params、query、fragment。
urlsplit(urlstring):将URL拆分为五部分:scheme、netloc、path、query、fragment。
合并:
urljoin(url1,url2):将基础链接uel1和新链接url2合并,分析url1的scheme、netloc、path内容,并补充url2缺失的部分。
urlunparse(parts):将可迭代对象parts合并为URL,parts长度为7。
urlunsplit(parts):将可迭代对象parts合并为URL,parts长度为6.
装换:
urlencode(query):将字典形式的数据装换为URL后面的查询字符串。
parse_qs(qs):将URL后面的查询字符串转换为字典。
parse_qsl(qs):将URL后面的查询字符串转换为列表。
quote(str):将URL中的中文字符装换为URL编码。
unquote(str):将URL编码转换为中文字符,进行编码。

案例:
解析 https://www.zhihu.com/search?type=content&q=%E7%88%AC%E8%99%AB

#导入parse模块
import urllib.parse
#定义url字符串
url = 'https://www.zhihu.com/search?type=content&q=%E7%88%AC%E8%99%AB '
#拆分url并输出结果
print("拆分结果:",urllib.parse.urlparse(url))
#合并url并输出结果
print(urllib.parse.urljoin('https://www.zhihu.com/search','?type=content&q=%E7%BD%91%E7%BB%9C'))
#定义params字符串
params={'type':'content','q':'%E7%BD%91%E7%BB%9C'}
#编码params参数,合并url并输出结果
print('https://www.zhihu.com/search?'+urllib.parse.urlencode(params))
#定义query字符串
query='type=content&q=%E7%BD%91%E7%BB%9C'
#将query转换成字典
print(urllib.parse.parse_qs(query))
#将query转换成列表
print(urllib.parse.parse_qsl(query))
#定义keyword中文字符串
keyword= 'Python语言进行网络爬虫'
#将中文字符串装换为URL编码,合并后赋值给url
url ='https://www.zhihu.com/search?type=content&q='+urllib.parse.quote(keyword)
#输出URL编码的url
print(url)
#将URL编码装换为中文字符并输出结果
print(urllib.parse.unquote(url))

运行结果:
在这里插入图片描述

五、分析Robots协议

robotparser模块提供了分析网站Robots协议的RobotFileParser类,它可以通过robots.txt文件来判断某网页是否能被爬取。
以下是RotbotFileParser类提供的方法:
(1)set_url():设置robots.txt文件的URL.
(2)read():读取robots.txt文件并进行分析。
(3)can_fetch():第一个参数为User_Agent,第二个参数为要爬取的网页的URL,判断该网页能否被爬取。
(4)parse():解析robots.txt文件中某些行的内容。
(5)mtime():返回上次抓取和分析的robots.txt文件的时间。
(6)modified():将当前时间设置为上次抓取和分析robots.txt时间。

案例:

#导入robotparser模块
import urllib.robotparser
#创建RobotsFileParser类对象response
response = urllib.robotparser.RobotFileParser()
#设置robots.txt文件的URL
response.set_url('https://www.zhihu.com/robots.txt')
#读取robots.txt文件并进行分析
response.read()
#定义爬虫名称
user_agent='zhuhupachong'
#定义知乎的发现url
url ='https://www.zhihu.com/explore'
#判断是否可以进行爬取
print("是否可以爬取知乎发现:",response.can_fetch(user_agent,url))

运行结果 :
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验六 UML建模工具应用

一、实验目的 1.掌握面向对象开发思想及实现机制 2.理解并掌握UML常用图(重点:类、对象图、用例图) 3.掌握并常见UML建模工具,并绘制UML各种图 二、实验准备与要求 1.StarUML(简称SU),是一种创建UML类图&#xff0c…

洛谷P8597 [蓝桥杯 2013 省 B] 翻硬币C语言/C++

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果…

ideaSSM医院挂号管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM医院挂号管理系统是一套完善的完整医院类型系统,结合SSM框架和bootstrap完成本系统SpringMVC spring mybatis ,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式 开发),系统具有完整的源代…

leetcode 1143. 最长公共子序列

1. dp 数组的定义 下标: 以 i - 1 和 j - 1 为结尾的子序列 值:以 i - 1 和 j - 1 为结尾的最长公共子序列的长度 2. 递推公式 if(text1[i - 1] text2[j - 1]) // 相等 dp[i][j] dp[i - 1][j - 1] 1 ; elsedp[i][j] max(dp[i - 1][j],…

【问题记录】flask开发blog

文章目录 小知识点问题1. 文章标签显示错误2. 文章状态无法回显(open)3. 用户管理页面,图标无法显示4. BuildError5. 用户管理添加用户,使用重复的用户名会报错(open)6. 添加用户,不上传头像会报错(open)7. 部分标签删除时报错&am…

设计模式 Template Method Pattern(Inheritance) vs Strategy Pattern(Delegation)

Template Method Pattern 和 Strategy Pattern 是两种常用的行为设计模式。他们分别用了继承inheritance和委托delegation两种不同的实现方法,因为上篇文章讲过了UML图,所以这篇顺便可以把两种不同模式的UML图都带出来一起说明。 Template Method Patte…

Mybatis的PageHepler用法

分页原理 分页在使用时的分类 物理分页: 在操作数据库中的表时,sql语句中使用了limit ?,?,此时sql语句返回的结果是分页结果 逻辑分页: 依赖程序的代码,其原理为:通过sql语句将数据库表中的所有数据都查询出,之后将数据保存在内存中,最终要显示的数据若涉及到分页,到内存中…

Java企业级信息系统开发01—采用spring配置文件管理bean

文章目录 一、Web开发技术二、spring框架(一)spring官网(二)spring框架优点(三)Spring框架核心概念1、IoC(Inversion of Control)和容器2、AOP(Aspect-Oriented Programm…

Golang 包使用注意事项

1)在给一个文件打包时,该包对应一个文件夹,比如这里的utils文件夹对应的包名就是utils,文件的包名通常和文件所在的文件夹名一致,一般为小写字母。 2)当一个文件要使用其它包函数或变量时,需要…

【AI聊天 | GPT4教学】 —— 微软 New Bing GPT4 申请与使用保姆级教程(免魔法)

目录 认识 New Bing 1. 下载 Microsoft Edge 浏览器 2. 注册并登录 Microsoft 账号 3. 如何免科学上网使用 New Bing? 4. 加入 WaitList 候补名单 5. 使用 New Bing! 6. 使用 Skype 免科学上网访问 New Bing! 7. 在 Chrome 浏览器中使…

gpt人工智能详细介绍

chatgpt人工智能怎么下载 OpenAI ChatGPT不是一款普通的软件,它是由OpenAI开发的一款基于人工智能技术的自然语言生成器。因此,它并不需要像普通软件一样下载和安装在您的计算机上。 作为一个云端服务,OpenAI ChatGPT可以通过您的浏览器直接…

HBASE入门 基本shell命令(一)

一、登录连接shell $HBASE_HOME/bin/hbase shell二、基本命令 2.1help命令 help创建命名空间 create_namespace bigdata;查看命名空间 list_namespace命名空间default和habase是系统自带的 三、DDL 3.1创建表 create bigdata:student, {NAME > name, VERSIONS> 5}…

每日学术速递5.6

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.AG3D: Learning to Generate 3D Avatars from 2D Image Collections 标题:AG3D:学习从 2D 图像集合生成 3D 头像 作者:Zijian Dong, Xu Chen, …

Amper Music:AI创意音乐工具

【产品介绍】 Amper Music 是一家位于美国纽约的人工智能音乐技术公司,成立于2014年。 Amper Music是一个AI创意音乐工具,能让任何人为自己的内容制作原创音乐。无论你需要为视频、播客或互动内容配乐,Amper Music都能提供一个简单而强大的解…

【PHP在线定制商城网站源码V3.0】开源的DIY在线定制商城系统+在线礼品定制

源码下载:https://download.csdn.net/download/m0_66047725/87637177 PHP在线定制商城网站源码,免费开源、免费下载。本商城基于mycncart开发。安装成功后即可浏览,你可以在后台->安装扩展功能上传安装插件,在代码调整中点击刷…

【边缘设备】yolov5训练与rknn模型导出并在RK3588部署(亲测有效)

保姆级教程,看这一篇就够用了 环境准备 将宿主机和开发板接入同一个局域网,方便开发。 宿主机 PC电脑,x86_64, 带显卡, 配置不表, 能训练和开发即可。系统: ubuntu 22.04 LTS 版本( ubuntu 18.04 LTS 以上)自带的远程软件&…

windeployqt工具打包C++ QT项目

目录 前言方法TIP 前言 使用VS编写好QT项目后,有时需要发送给他人进行测试。在此情况下,发送所有项目文件显然不可取,因为exe文件不能独立运行,故在测试前需要先配置项目环境,以确保运行所需的库文件能够完全。 因此&…

《操作系统》——计算机系统概述

前言: 在之前的【Linux】学习中,我们已经对常见指令已经开发工具等进行了详细的了解。紧接着,我们将要学习的便是关于【Linux进程】的基本知识。但是为了帮助大家更好的理解相关的知识概念,我先带领大家来学习关于《操作系统》这…

【SpringMVC】| 拦截器 | 跨域请求 | 原理详解 | 代码实操

目录 一. 🦁 前言二. 🦁 拦截器 & 跨域请求1. 拦截器Ⅰ. 拦截器和过滤器(Filter)的区别Ⅱ. 拦截器的使用步骤1. 创建SpringBoot项目,添加Spring Web依赖2. 创建控制器方法3. 创建拦截器类4. 编写JSP页面5. 配置Interceptor核心配置类6. 拦…

《理想国》读书感悟

第一卷 话题从年老谈到财富,引出了雪蒙拿的正义观:欠债还钱是正义,从而提出了“正义是什么”的探讨。 辩论中正义定义的演变: 实话实说欠债还债是正义(商人的视角)。报朋友以善,报敌人以恶是…