下面是学习的网址:
【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 = 0
for price in self.shopping_list.values():
total_price += price
return 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 = 0
for price in self.shopping_list.values():
total_price += price
return total_price
'''
import unittest
from shopping_list import ShoppingList
class 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)禁止爬取!
- 涉及公民隐私、copyright、国家安全的不要爬取;
- 不要过度频繁发送请求,导致其他用户无法使用服务器(无异于DDos攻击);
- 出现明显反爬取限制就不要继续突破去爬取了;
- 可以查看网站的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 BeautifulSoup
headers = {
"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.text
soup = BeautifulSoup(html, "html.parser")
all_titles = soup.findAll("span", attrs={"class": "title"})
for title in all_titles:
title_string = title.string
if "/" 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主的视频,或者直接搜它的用法什么的。
尾声
至此此课程已经结束,后面内容比较高深我也没有精力再去深思,感觉自己还是没有什么热情来更进一步学习爬虫爬取一些什么其他内容(主要是用不到)。希望之后想要用的时候看看这些笔记能帮我回忆起一些课程中需要注意的事项吧,不要重蹈覆辙了。