Python获取历史上的今天,每一天都是一本书(附源码)

文摘   科技   2024-10-16 16:38   广东  

ISEE小语


“每个人都有属于自己的一片森林,也许我们从来不曾走过,但它一直在那里,总会在那里。迷失的人迷失了,相逢的人会再相逢。”

——村上春树《挪威的森林》



前言:

最近在想历史上的今天都发生了什么?有什么样的故事?在搜索的时候发现了一个网站,叫 jintian.160,小栈就出现一个想法:

将某一天的所有历史信息都拿出来,生成一个以【某一天】为单位的电子书,这样的话本地电脑、手机上也可方便的离线看了!

话不多说,我们直接开始。



环境:

Pycharm

Python 3.9.16



三方库:

beautifulsoup4==4.12.3pillow==10.4.0python-docx==1.1.2pypandoc==1.14

(左右滑动查看完整代码)

如果没有,请通过pip install 自行安装




导入:

import osimport pypandocimport requests
from PIL import Imagefrom bs4 import BeautifulSoupfrom docx import Documentfrom 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) + 1print(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转换为epubdoc_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”即可获取源码!



寄语:世间三美,明月,清风,眼前……



看到这儿的朋友帮点个“”和“在看”,谢谢支持~!

     

文章就分享到这儿,喜欢就点个吧!




往期推荐  点击标题可跳转


ISEE小栈
没有花里胡哨,简单才是王道。
 最新文章