ISEE小语
“每个人都有属于自己的一片森林,也许我们从来不曾走过,但它一直在那里,总会在那里。迷失的人迷失了,相逢的人会再相逢。”
前言:
最近在想历史上的今天都发生了什么?有什么样的故事?在搜索的时候发现了一个网站,叫 jintian.160,小栈就出现一个想法:
将某一天的所有历史信息都拿出来,生成一个以【某一天】为单位的电子书,这样的话本地电脑、手机上也可方便的离线看了!
话不多说,我们直接开始。
环境:
Pycharm
Python 3.9.16
三方库:
beautifulsoup4==4.12.3
pillow==10.4.0
python-docx==1.1.2
pypandoc==1.14
(左右滑动查看完整代码)
如果没有,请通过pip install 自行安装
导入:
import os
import pypandoc
import requests
from PIL import Image
from bs4 import BeautifulSoup
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
(左右滑动查看完整代码)
所需要的环境和库准备好,那么就可以开始核心操作了!
1 网站地址
首先,先确定网站地址
http://jintian.160.com/
看一下页面是这样的:
2 获取大事记页数
小栈看了一下页面,发现历史上今天大事记的页数在页面并不能直接获取,需要根据页面的显示数据和返回的总数算一下,如:
# 获取历史上今天大事记信息的页数
base_url = "http://jintian.160.com" # 网站地址
month = 10 # 月
day = 16 # 日
url = f"{base_url}/ashx/GreatThing.ashx?act=getgreatthinglist&page=1s&m=%s&d=%s&c=" % (month, day)
data = requests.get(url)
record_count = data.json()["recordCount"] # 总数
page = int(record_count / 14) + 1
print(f"获取历史上今天大事记信息的页数:{page}")
(左右滑动查看完整代码)
3 获取大事记信息列表
我们获取指定日期的大事记信息列表,在获取的过程中发现两个小问题,需要特别处理:
a. 将带特殊码的空格替换为普通空格
# 将带特殊码的空格替换为普通空格
parts = li.text.lstrip('·')
title_text = parts.replace('\xa0', ' ').strip() if parts else ""
(左右滑动查看完整代码)
b. 将与当前日期不符的信息过滤掉
# 将与当前日期不符的信息过滤掉
if new_day == f"{month}月{day}日":
part_result['day'] = new_day
part_result['href'] = href
part_result['title'] = title_text
(左右滑动查看完整代码)
# 获取大事记信息列表
result_ = []
for i in range(1, page + 1):
url = f"{base_url}/ashx/GreatThing.ashx?act=getgreatthinglist&page=%s&m=%s&d=%s&c=" % (str(i), month, day)
data = requests.get(url)
data_content = data.json()["data"]
if data_content:
html = BeautifulSoup(data_content, 'html.parser')
data_li = html.find_all("li")
for li in data_li:
part_result = dict()
a_tag_content = li.find("a")
href = a_tag_content['href'] if a_tag_content else ''
# 将带特殊码的空格替换为普通空格
parts = li.text.lstrip('·')
title_text = parts.replace('\xa0', ' ').strip() if parts else ""
title_text_ = title_text.split(" ")
new_day = title_text_[0].split("年")[1]
# 将与当前日期不符的信息过滤掉
if new_day == f"{month}月{day}日":
part_result['day'] = new_day
part_result['href'] = href
part_result['title'] = title_text
result_.append(part_result)
print(f"获取大事记信息列表:{result_}")
(左右滑动查看完整代码)
结果:
4 大事记写入Word文档
在大事记获取的过程中,下载的图片有可能是转码问题,无法写入Word,这里就需要做一下处理,将下载的图片转成统一的jpeg格式
# 将下载的图片转成统一的jpeg格式
with Image.open(image_path) as img:
img.save(image_path, format='JPEG')
(左右滑动查看完整代码)
写入Word的操作,前面文章有分享,有兴趣可以浏览
python对Word文档内容的增、删、改、查操作,独立封装版
九月de云,公众号:九月de云python对Word文档内容的增、删、改、查操作,独立封装版
完成代码:
# 创建一个新的Word文档
doc = Document()
doc_name = f"{month}月{day}日"
for ic in result_:
title = ic.get('title')
part_url = ic.get('href')
if not part_url:
# 添加标题
title_ = doc.add_heading(title, level=1)
# 设置样式
title_.style.font.bold = True
title_.style.font.shadow = True
title_.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph()
doc.add_paragraph('无详细介绍')
doc.add_paragraph()
continue
url = base_url + ic.get('href')
html_content = requests.get(url).content
# 解析HTML
soup = BeautifulSoup(html_content, 'html.parser')
# 添加标题
title = soup.find(id="gTitle").get_text()
title_ = doc.add_heading(title, level=1)
# 设置样式
title_.style.font.bold = True
title_.style.font.shadow = True
title_.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph()
# 获取内容并添加到文档
content_div = soup.find(id="gContent")
for element in content_div.children:
if element.name == 'p':
# 添加文本段落
doc.add_paragraph(element.get_text())
if element.contents:
for content in element.contents:
if content.name == 'img':
# 下载并添加图片
img_url = content.attrs['src']
response = requests.get(base_url + img_url)
image_path = "temp_image.jpg"
with open(image_path, 'wb') as f:
f.write(response.content)
with Image.open(image_path) as img:
img.save(image_path, format='JPEG')
doc.add_picture(image_path)
last_ = doc.paragraphs[-1]
last_.alignment = WD_ALIGN_PARAGRAPH.CENTER
os.remove(image_path)
doc.add_paragraph()
# 保存文档
doc.save(f'{doc_name}.docx')
(左右滑动查看完整代码)
结果:
打开看一下内容:
5 将Word转为电子书
我们这里是将docx转换为epub格式
这里需要用到三方库pypandoc
# 将docx转换为epub
doc_name = f"{month}月{day}日"
format_name = 'epub'
ebook_name = f"{month}月{day}日大事记"
ebook = pypandoc.convert_file(f'{doc_name}.docx', format_name, outputfile=f'{ebook_name}.epub')
(左右滑动查看完整代码)
结果:
通过电子书阅读器打开电子书
这个效果还可以
当然,无论是Word文档,还是epub电子书,只是一个保存的格式,都可以在PC或手机端打开阅览,看个人爱好即可!
6 其他日期的抓取
历史的今天,不是指现在,可以指定日期
只需要修改月、日即可
month = 10 # 月
day = 16 # 日
(左右滑动查看完整代码)
这part不是废话哟,只是单纯的说可以抓取任何日期
7 总结
整个制作过程下来,发现这个网站更新并不及时,在内容上也有一些小的瑕疵,希望它后续可以优化吧。
但这不影响小栈的抓取和制作,如果同学有发现更好的关于历史事记的网站,期望给小栈留言,告知小栈。
以上实例仅限个人观点,学习使用
完整的代码已经整理
后台回复“history_today”即可获取源码!
寄语:世间三美,明月,清风,眼前……
看到这儿的朋友帮点个“赞”和“在看”,谢谢支持~!
文章就分享到这儿,喜欢就点个赞吧!