B站python爬虫课程笔记(Q16-19结束)

  下面是学习的网址:

​​​​​​【Python+爬虫】

目录

16、捕捉异常try&except语句的一些问题

1)一些常见的异常类型

2)try&except的使用

 17、测试Bug的一些问题

1)assert断定函数的使用

2)unittest单元测试库的一些问题

18、爬虫操作的一些问题

1)爬虫步骤

2)禁止爬取!

3)HTTP请求的三点知识

 4)python代码请求伪装成浏览器请求

5)Beautiful Soup库的使用

6)爬取豆瓣250电影

7)精进爬虫

19、HTML的一些问题

 1)网页三要素

2)HTML常用标签

尾声


16、捕捉异常try&except语句的一些问题

1)一些常见的异常类型

IndexError索引错误ZeroDivisionError除零错误
FileNotFindError找不到文件错误TypeError类型错误
KeyError键错误ValueError值错误
IndentationError缩进错误ImportError导入模型错误
ArithmeticError计算错误SyntaxError语法错误
AttributeError属性错误............

对于我这个初学者,出现最多的应该是SyntaxError语法错误了,不是忘记冒号,就是忘记语法应该怎么用了。

2)try&except的使用

我也贴上我自己有注释的代码:

try:  # 下面缩进写可能会出现错误的地方user_weight = float(input("请输入您的体重(单位:斤):"))user_height = float(input("请输入您的身高(单位:厘米):"))user_BMI = (user_weight / 2) / ((user_height / 100) ** 2)
except ValueError:  # except后面直接加可能出现的错误类型,这个错误类型必须显示为一个独特的颜色,这里为值错误类型print("输入不为合理数值,请重新运行程序,并输入正确的数字。")
except ZeroDivisionError:  # 此处为除零错误类型print("身高不能为零,请重新运行程序,并输入正确的数字。")
except:print("发生了未知错误,请重新运行程序。")
else:print("您的BMI值为" + str(user_BMI))  # 都没有错误的话输出BMI值
finally:print("程序运行结束")# 无论是否有错误,最终输出都会打印这一句话

 对于第三个except后面没有跟错误类型,PyCharm是会有警告的,但是没有影响,因为它默认后面是需要填一个错误类型的。

 17、测试Bug的一些问题

1)assert断定函数的使用

"assert + 布尔值表达式",用这种方法来测试用例,但是缺点是一行报错就会中止(AssertionError断言错误),后面的用例也就不能测试了。

2)unittest单元测试库的一些问题

下图是unittest。TestCase类的常见测试方法:

 !!!这一部分实在是太难了,建议多看看原视频,我贴上UP主的代码。

# 这是实现代码
class ShoppingList:"""初始化购物清单,shopping_list是字典类型,包含商品名和对应价格例子:{"牙刷": 5, "沐浴露": 15, "电池": 7}"""def __init__(self, shopping_list):self.shopping_list = shopping_list"""返回购物清单上有多少项商品"""def get_item_count(self):return len(self.shopping_list)"""返回购物清单商品价格总额数字"""def get_total_price(self):total_price = 0for price in self.shopping_list.values():total_price += pricereturn total_price
# 这是测试代码
'''
注意:此文件是针对以下类的测试文件。
你可以在此文件同一文件夹下新建shopping_list.py,并复制以下内容到该文件:class ShoppingList:"""初始化购物清单,shopping_list是字典类型,包含商品名和对应价格例子:{"牙刷": 5, "沐浴露": 15, "电池": 7}"""def __init__(self, shopping_list):self.shopping_list = shopping_list"""返回购物清单上有多少项商品"""def get_item_count(self):return len(self.shopping_list)"""返回购物清单商品价格总额数字"""def get_total_price(self):total_price = 0for price in self.shopping_list.values():total_price += pricereturn total_price
'''import unittest
from shopping_list import ShoppingListclass TestShoppingList(unittest.TestCase):def setUp(self):self.shopping_list = ShoppingList({"纸巾": 8, "帽子": 30, "拖鞋": 15})def test_get_item_count(self):self.assertEqual(self.shopping_list.get_item_count(), 3)def test_get_total_price(self):self.assertEqual(self.shopping_list.get_total_price(), 55)

 要测试的时候需要在终端输入: python -m unittest 回车。

此处的shopping_list实现代码的文件名Shoppinglist是需要测试的对象,如定义的函数等。

为了避免后面重复编写相同的开头测试语句,在定义类的第一个函数运用了setUp(self)

18、爬虫操作的一些问题

1)爬虫步骤

第一步、获取网页内容(python的Requests请求优雅地发送HTTP请求);

第二步、解析网页内容(python的Beautiful Soup库解析获得的HTML内容);

第三步、存储(数据库)或是分析(可视化)数据。

2)禁止爬取!

  1. 涉及公民隐私、copyright、国家安全的不要爬取;
  2. 不要过度频繁发送请求,导致其他用户无法使用服务器(无异于DDos攻击);
  3. 出现明显反爬取限制就不要继续突破去爬取了;
  4. 可以查看网站的robots.txt文件,哪些路径搜索是允许爬取的/不被允许的。

3)HTTP请求的三点知识

我不生产知识,我只是 知识的搬运工!哈哈哈

下面我贴出三张图,分别代表User_Agent的类型及表示意思HTTP请求能够接受的格式HTTP响应的状态码及对应信息

 

HTTP请求操作涉及requests.get , requests.status_code , requests.ok ,requests.text 操作,UP主演示代码如下:

import requests
head = {"User_Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"}  # 浏览器类型及版本和操作系统信息等等
response = requests.get("http://books.toscrape.com/", headers=head)
print(response)
print(response.status_code)
if response.ok:print(response.text)
else:print("请求错误")

需要注意的是requests需要首字母大写, 这个单词是复数

 4)python代码请求伪装成浏览器请求

有些网址限制代码请求,只允许浏览器请求,伪装的操作只需要在requests第一行添加一个开头header,此开头head为字典,里面的键值对可以输入你想要输入的User_Agent的相关信息及其他信息。如:

head = {"User_Agent": "Mozilla/5.0(Windows NT 10.0; Win 64; X64)"}  # 浏览器类型及版本和操作系统信息等等

User_Agent的信息如何获取:打开浏览器搜索任意网站--鼠标右击打开检查--网络--刷新一下--打开任意一个请求--展开Request_Headers--复制User_Agent后面冒号的内容即可。like this:

5)Beautiful Soup库的使用

手动解析HTML内容效率低,使用Beautiful Soup库来像树状结构分类来解析自己想要的部分。

 UP主给出的安装bs4库(pip install bs4)安装成功信息是:

Successfully installed beautifulsoup4-4.12.3 bs4-0.0.2 soupsieve-2.5

 网友说的安装方式(pip install beautifulsoup4)我也试过,应该是同一个东西,只不过PyChram版本不一样,所以安装指令不一样。我再允许这个指令终端提示我已经安装成功了:

(.venv) PS F:\pycharm\project_for_begginer\pythonProject> pip install beautifulsoup4
Requirement already satisfied: beautifulsoup4 in f:\pycharm\project_for_begginer\pythonproject\.venv\lib\site-packages (4.12.3)
Requirement already satisfied: soupsieve>1.2 in f:\pycharm\project_for_begginer\pythonproject\.venv\lib\site-packages (from beautifulsoup4) (2.5)

findAll()函数:根据标签、属性等找出所有符合要求的元素。第一个元素为找到HTML的标签如p为文本段落标签,第二个元素如class属性的值是price_color。

all_prices = soup.findAll("p", attrs={"class", "price_color"}) 

由于此课程是解析HTML的内容,所以Beautiful Soup的第二个可选参数解析器要选择“ html.parser ”。

 下面是分别爬取书单价格书单名称的代码:

# 爬取当前网址页面(http://books.toscrape.com/)的书单价格
from bs4 import BeautifulSoup
import requests
head = {"User_Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"}  # 浏览器类型及版本和操作系统信息等等
content = requests.get("http://books.toscrape.com/", headers=head).text
soup = BeautifulSoup(content, "html.parser")
# all_prices = soup.findAll("p", attrs={"class", "price_color"})
all_prices = soup.find_all("p", attrs={"class", "price_color"})  # findAll和find_all在这里运行的结果都一样,返回一个可迭代对象
for price in all_prices:print(price.string[2:])
# 爬取当前网址页面(http://books.toscrape.com/)的书单名称
from bs4 import BeautifulSoup
import requests
head = {"User_Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"}  # 浏览器类型及版本和操作系统信息等等
content = requests.get("http://books.toscrape.com/", headers=head).text
soup = BeautifulSoup(content, "html.parser")
all_titles = soup.findAll("h3")
for title in all_titles:all_links = title.findAll("a")for link in all_links:print(link.string)

需要注意的是content为 .text的格式文件。 

6)爬取豆瓣250电影

直接给出UP主代码:

import requests
from bs4 import BeautifulSoupheaders = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}
for start_num in range(0, 250, 25):response = requests.get(f"https://movie.douban.com/top250?start={start_num}", headers=headers)html = response.textsoup = BeautifulSoup(html, "html.parser")all_titles = soup.findAll("span", attrs={"class": "title"})for title in all_titles:title_string = title.stringif "/" not in title_string:print(title_string)

哈哈哈,我现在爬取出来的250名不是我爱你而是燃情岁月了。

需要注意的是for和range结合的更新网址索引开头的代码,不然只会给你爬取特定网页页面的内容,而有许多内容是分很多页的。

这里需要把豆瓣250电影排名的地址stat=0修改成?start={start_num} 

7)精进爬虫

  • python正则表达式库 re :使用更加精简代码爬取内容;
  • python多线程库 threading :顾名思义,让不同线程同时爬取多个页面,增加爬虫的效率,缩短爬取大量网页所需要花费的时间

19、HTML的一些问题

鼠标右键检查,点击左上角那个鼠标可以查看当前页面任意部位的HTML源代码,太厉害了。

 1)网页三要素

网页包括三要素,这些都是属于前端的内容了:

  • HTML 定义网页的结构和信息(骨架);
  • CSS 定义网页的样式(衣服);
  • JavaScript 定义用户和网页的交互逻辑(动作)。

 最简单的HTML代码:

<!DOCTYPE HTML>  #文件类型为html
<html>           #开始标识
</html>          #结束标识     

中间还能添加许多其他标签在里面,用CSS进行美化,用JavaScript进行交互。师傅领进门,修行靠个人!

2)HTML常用标签

CSDN有很多人整理出来了,不知道要用什么的可以直接去他们的博文看看(推荐一个传送门🚪:HTML常用标签--整理篇),至于具体怎么用可以看看B站UP主的视频,或者直接搜它的用法什么的。

尾声

至此此课程已经结束,后面内容比较高深我也没有精力再去深思,感觉自己还是没有什么热情来更进一步学习爬虫爬取一些什么其他内容(主要是用不到)。希望之后想要用的时候看看这些笔记能帮我回忆起一些课程中需要注意的事项吧,不要重蹈覆辙了。

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

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

相关文章

学生综合考评管理系统|jsp+ Mysql+Java+ (可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

微服务鉴权的几种实现方案

1.Token 1.1 Token透传&#xff08;不推荐&#xff09; 刚开始接触微服务时网上给的方案大都数是通过透传Token做鉴权&#xff0c;但我认为这种方式不是很妥当。接着往下看&#xff1a; 这种方式通过透传Token使得各微服务都能获取到当前登录人信息&#xff0c;在代码编写上确…

RK3568平台 网络唤醒

一.什么是网络唤醒 网络唤醒(Wake-on-LAN&#xff0c;WOL)是一种计算机局域网唤醒技术&#xff0c;使局域网内处于关机或休眠状态的计算机&#xff0c;将状态转换成引导(Boot Loader)或运行状态。无线唤醒(Wake-on-Wireless-LAN&#xff0c;WoWLAN)作为 WOL 的补充技术&#x…

SpringBoot整合MyBatisPlus实现增删改查

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合MyBatisPlus实现增删改查 📚个人知识库: Leo知识库,欢迎大家…

【QT入门】 Qt实现自定义信号

往期回顾&#xff1a; 【QT入门】图片查看软件(优化)-CSDN博客 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号 一、为什么需要自定义信号 比如说现在一个小需求&#xff0c;我们想要实现跨ui通信&a…

优化选址问题 | 基于鹈鹕算法求解基站选址问题含Matlab源码

目录 问题代码问题 鹈鹕算法(Pelican Optimization Algorithm, POA)是一种相对较新的启发式优化算法,模拟了鹈鹕鸟觅食的行为。这种算法通常用于解决复杂的优化问题,如函数优化、路径规划、调度问题等。基站选址问题通常是一个复杂的优化问题,需要考虑覆盖范围、干扰、成…

阿里云ECS服务器u1通用算力型CPU性能如何?

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

LAMP架构与搭建论坛

目录 1、LAMP架构简述 2、各组件作用 3、构建LAMP平台 3.1编译安装Apache httpd服务 3.1.1关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 3.1.2安装环境依赖包 3.1.3配置 设置安装目录、安装模块 3.1.4编译安装 3.1.5优化配置文件路径 3.1.6启动apache…

北航计算机软件技术基础课程作业笔记【1】

为白成刚老师的课程&#xff0c;简单做一个记录&#xff0c;内容偏基础&#xff0c;自己仅保留认为有用的部分 L1&#xff1a;算法概论 课程简单介绍了复杂度、算法的概念 1.作业 计算下列各片断程序中xx1的执行次数 (1) for (i1; i<n; i)for (j1; i<n; j)for (k1; …

牛客小白月赛89补题1(ABCD)(偏难)

评价&#xff1a; 高情商&#xff1a;收获很大 &#xff0c;让自己进一步认清自己。 低情商&#xff1a;题目难&#xff0c;自己太菜了。 今天还有一些其他事&#xff0c;剩下的题明天再补。 我们从a题开始吧&#xff1a; A.签到 我们只要看看其中的max与min是否不符合即可…

Android14之selinux报错:ERROR: end of file in comment(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

项目成功秘诀:高效管理策略确保按时交付v2

一、项目成功的重要性 在当今竞争激烈的商业环境中&#xff0c;项目的成功对于企业的生存和发展具有至关重要的意义。项目的成功不仅意味着企业能够达成既定的业务目标&#xff0c;还能提升企业的市场地位、增强品牌影响力&#xff0c;并为企业的可持续发展奠定坚实基础。我们…

中型企业网络路由器配置(ensp)实验

vlan、vlan间路由、ospf协议等来实现三层交换机和单臂路由之间的通信 拓扑图&#xff1a; 1. 配置三层交换机vlan和vlan间路由 SW1 #进入视图 sys sysn sw1 undo info-center enable#配置vlan vlan batch 10 20 30 40 50 60#配置access口 int g0/0/1 port link-type access …

视觉信息处理和FPGA实现第6次作业-Matlab实现灰度图像的亮度调节

一、代码 close all;clear all;clc; pic imread("cameraman.tif"); [M,N] size(pic); disp("Contrast Ajust Demo"); value input("Please input number of value, range: 0~2\n"); while value>2 || value<0disp("The number is in…

python--for循环

for循环&#xff1a; python中的for循环是用来迭代容器中的每一个元素的&#xff0c;而不是c,java中理解那个循环&#xff1b; for 零时变量 in 容器&#xff1a; print&#xff08;零时变量&#xff09; #每一个迭代出的元素 range 全局函数&#xff1a; …

P6技巧:修改P6 Professional标题/标签名称/字体

前言 P6 Professional作为P6的客户端工具其本身具有一定的改造属性&#xff0c;通过修改其安装程序文件&#xff0c;可以实现对部分功能菜单/标签文字名称的修改/重定义 如以下标识的信息&#xff0c;都可对齐改名 方法 以下介绍的方法只可对本机有效&#xff0c;这里已修改…

开学考核复现

不要尝试爆破哟!(misc) 下载图片&#xff0c;解析图片 拿到密码&#xff0c;解压压缩包&#xff0c;生成图片 扫描二维码 留个后门(misc) D盾扫描 打开文件寻找 师姐的旅游照片(misc) 随波逐流&#xff0c;然后base64解码 修改后缀为zip&#xff0c;解压 修改高度 Fuck! (C…

Matlab之已知2点绘制长度可定义的射线

目的&#xff1a;在笛卡尔坐标系中&#xff0c;已知两个点的位置&#xff0c;绘制过这两点的射线。同时射线的长度可以自定义。 一、函数的参数说明 输入参数&#xff1a; PointA&#xff1a;射线的起点&#xff1b; PointB&#xff1a;射线过的零一点&#xff1b; Length&…

Redis入门到实战-第四弹Strings 篇

Redis实战热身Strings 篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…