项目目的:因为柯宝除了在CSDN写博客这一爱好外,还比较喜欢追番剪辑,尤其是柯南,想到了爬取这个!!参考Github大佬,原项目链接:
原作者Githubhttps://github.com/LorentzForceWorkEnzyme/PythonSpiderDemo/blob/master/1.4%E5%90%8D%E4%BE%A6%E6%8E%A2%E6%9F%AF%E5%8D%97%E5%89%A7%E9%9B%86%E4%BF%A1%E6%81%AF%E8%A1%A8%E7%88%AC%E5%8F%96/readme.md项目功能:从一个网页(这里是《名侦探柯南》各集列表的百度百科页面)抓取数据,并将这些数据以特定的格式写入到一个文本文件中。
目标网页:
名柯剧集百度百科https://baike.baidu.com/item/%E5%90%8D%E4%BE%A6%E6%8E%A2%E6%9F%AF%E5%8D%97%E5%90%84%E9%9B%86%E5%88%97%E8%A1%A8/49823770
目标效果:
实现代码:
#codeing = utf-8
#@author: kebaozuishuai
import requests # 导入requests库,用于发送HTTP请求
from bs4 import BeautifulSoup # 导入BeautifulSoup库,用于解析HTML和XML文档
import os # 导入os库,用于操作系统相关的操作(但在这段代码中未使用)
import sys # 导入sys库,用于与Python解释器交互(但在这段代码中未使用)
import time # 导入time库,用于时间相关的操作(但在这段代码中未使用)
import random # 导入random库,用于生成随机数(但在这段代码中未使用)
import webbrowser # 导入webbrowser库,用于控制Web浏览器(但在这段代码中未使用)
import pandas # 导入pandas库,用于数据处理和分析
# 定义目标网页的URL
url = 'https://baike.baidu.com/item/%E5%90%8D%E4%BE%A6%E6%8E%A2%E6%9F%AF%E5%8D%97%E5%90%84%E9%9B%86%E5%88%97%E8%A1%A8/49823770'
# 定义请求头,用于模拟浏览器访问
headers = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}
# 发送GET请求到目标URL,并带上请求头
req = requests.get(url, headers=headers)
# 使用BeautifulSoup解析返回的HTML内容(但实际上这步后面没有用到,因为后面直接使用pandas来解析表格)
bs = BeautifulSoup(req.content, 'html.parser')
# 注释掉的代码是建议使用下载的静态网页进行测试,而不是直接访问网络
# bs = BeautifulSoup('名侦探柯南各集列表_百度百科.html', 'html.parser')
# 设置pandas的显示选项,以便在控制台中更好地显示DataFrame
pandas.set_option('display.max_rows', None)
pandas.set_option('display.unicode.ambiguous_as_wide', True)
pandas.set_option('display.unicode.east_asian_width', True)
pandas.set_option('max_colwidth', 100)
pandas.set_option('expand_frame_repr', False)
# 从URL读取表格数据,并尝试通过属性选择特定的表格(但这里的attrs可能不准确)
df = pandas.read_html(url, attrs={"log-set-param" : "table_view"})
# 删除最后一个DataFrame(假设它是参考资料)
df.pop(len(df)-1)
# 定义表头列表
th = ['集数', '标题', '原创', '登场']
# 标记变量,用于识别第二个DataFrame
flag = 0
# 遍历所有的DataFrame
for each in df:
# 将NaN值替换为0
each.fillna(value=0, inplace=True)
# 如果是第二个DataFrame,进行特殊处理
flag += 1
if flag == 2:
# 将列名全部设置为空字符串
each.columns = [''] * len(each.columns)
# 删除前两行(假设第一行是年份,第二行是标题)
each.drop([0, 1], inplace=True)
continue # 跳过后续处理,继续下一个循环
# 对于其他DataFrame,只删除第一行(年份)
each.drop(0, inplace=True)
# 只保留需要的列
each = each.loc[:, th]
# 将DataFrame转换为字符串并写入文件
with open('优化的表格.txt', 'a+', encoding='utf-8') as f:
f.write(str(each) + '\n')
# 在控制台中打印出处理后的DataFrame(用于测试)
print(str(each))
运行报错:找不到表格,请Python大佬指教