这是一个关于爬取古诗文的Python3 API。
此库请求了古诗文网(https://www.gushiwen.cn/),并下载诗词信息。
建议到古诗文网上创建账号,并使用此库提供的模拟登录API,可以避免请求频繁。
首先,我们需要在python中安装pygushi:
使用pip:
pip install pygushi
使用git:
git clone https://github.com/stripepython/pygushi
cd pygushi
python setup.py install
进入古诗文网“我的”页面,并创建一个账号:
创建账号的页面为https://so.gushiwen.cn/user/register.aspx。
现在,我们将获取一些“绝句”有关的诗歌。
首先,导入pygushi:
import pygushi
接下来,使用模拟登录API进行登录(其实这一步没有也可以,但建议添加,以免不必要的BUG):
import pygushi
login_bot = pygushi.LoginBot('刚才注册的手机号码或电子邮箱', '你的密码')
session = login_bot.login()
然后,调用搜索API,获取与“绝句”有关的诗词ID:
import pygushi
login_bot = pygushi.LoginBot('刚才注册的手机号码或电子邮箱', '你的密码')
session = login_bot.login()
poetries = pygushi.PoetryBot.search('绝句', session)
接下来,依次遍历,将它们输出在控制台,这就是这一demo的完整代码:
import pygushi
login_bot = pygushi.LoginBot('刚才注册的手机号码或电子邮箱', '你的密码')
session = login_bot.login()
poetries = pygushi.PoetryBot.search('绝句', session)
for pbot in poetries:
text = pbot.get().prettify()
print(text)
绝句
杜甫
两个黄鹂鸣翠柳,一行白鹭上青天。
窗含西岭千秋雪,门泊东吴万里船。
江南春
杜牧
千里莺啼绿映红,水村山郭酒旗风。
南朝四百八十寺,多少楼台烟雨中。
夏日绝句
李清照
生当作人杰,死亦为鬼雄。
至今思项羽,不肯过江东。
绝句二首
杜甫
迟日江山丽,春风花草香。
泥融飞燕子,沙暖睡鸳鸯。
江碧鸟逾白,山青花欲燃。
今春看又过,何日是归年。
绝句
志南
古木阴中系短篷,杖藜扶我过桥东。
沾衣欲湿杏花雨,吹面不寒杨柳风。
(其余省略)
接下来的内容是更详细的介绍。
pygushi使用了面向对象的结构。
pygushi的整体代码(不含注释)仅仅只有200多行。
因此,它调用了许多API。
其中的验证码识别使用了ONNX模型,这种模型在Mac上不太适用。
这是一个namedtuple,其具有major, minor, micro三个属性。
如下是一个简单实例:
from pygushi import version
assert version >= (1, 2, 0)
这是一个作者数据类,它的初始化方法如下:
Author(
name: str,
brief_introduction: Optional[str] = None,
image: Optional[PIL.Image.Image] = None
)
这是一个诗词数据类,它的初始化方法如下:
Poetry(
title: str,
content: str,
translation: Optional[str] = None,
notes: Optional[str] = None,
author: Optional[Union[Author, str]] = None
)
Poetry.sentences(
self,
split_chars: Sequence[str] = _DEFAULT_SPLITS,
filter_notes: bool = False
) -> List[str]
获取此诗词的句子列表。
split_chars: 一个序列,遇到哪些字符算作一句,默认为中文的句号、问号、叹号和分号。filter_notes: 当此参数为True时,将忽略()内的注释内容。Poetry.prettify(
self,
split_chars: Sequence[str] = _DEFAULT_SPLITS,
filter_nodes: bool = True,
fill_length: int = 7
) -> str
获取这一诗词的可视化形式。你可以将它输出在控制台。
split_chars: 一个序列,遇到哪些字符算作一句,默认为中文的句号、问号、叹号和分号。filter_notes: 当此参数为True时,将忽略()内的注释内容。fill_length: 自适应的填充间距。在不同的格式和字体下该参数需要自行调整。from pygushi import PoetryBot
bot = PoetryBot('c35a60c1a8e2')
print(bot.get().prettify())
输出:
静夜思
李白
床前明月光,疑是地上霜。
举头望明月,低头思故乡。
模拟登录API类。初始化方法:
LoginBot(
email_or_telephone_number: str,
password: str,
use_gpu: bool = False,
device_id: int = 0
)
email_or_telephone_number: 在古诗文网上注册的邮箱/手机号,手机号仅支持移动、联通和电信的11位手机号password: 在古诗文网上注册的密码use_gpu: 是否使用GPU识别验证码device_id: 识别验证码的设备号,默认为0LoginBot.login(
session: Optional[requests.Session] = None
) -> requests.Session
进行模拟登录,返回登录状态的session
session: requests.Session类型,用于爬虫。如果为None则新建一个session作者信息API类。
AuthorBot(author_id: str)
author_id: 作者ID号。b90660e3e492就是作者ID号
Note: 一般来说,本API不会让您使用ID号。
获取作者信息。
get(
self,
session: Optional[requests.Session] = None,
parser: str = 'html.parser'
) -> Author:
session: requests.Session类型,用于爬虫。如果为None则新建一个sessionparser: beautifulsoup4解析器parser说明:
| 值 | 意义 | 优点 | 缺点 |
|---|---|---|---|
html.parser |
使用python标准解析器 |
速度适中,不需要其他依赖 | 容错能力稍差 |
lxml |
使用lxml解析器 |
速度快 | 需要安装C库和lxml扩展 |
html5lib |
使用html5lib解析器 |
容错能力很强 | 需要html5lib扩展,速度慢 |
一个静态构造方法,通过古诗文网的API搜索作者信息并返回。如果没有这一作者,其将返回None.
@staticmethod
search(
name: str,
session: Optional[requests.Session] = None,
parser: str = 'html.parser'
) -> Optional[AuthorBot]
name: 作者姓名session: requests.Session类型,用于爬虫。如果为None则新建一个sessionparser: beautifulsoup4解析器诗词信息API类。
PoetryBot(poetry_id: str)
poetry_id: 诗词IDPoetryBot.get(
self,
session: Optional[requests.Session] = None,
parser: str = 'html.parser',
get_author: bool = True
) -> Poetry
获取诗词信息,进行实际爬虫请求。
session: requests.Session类型,用于爬虫。如果为None则新建一个sessionparser: beautifulsoup4解析器,详细说明见文档get_author: 是否自动爬取作者信息。当此项为True时,返回值的author属性是一个Author类的实例。否则,author属性是一个字符串,表示作者ID一个静态构造方法,通过古诗文网的API搜索诗词信息并返回。返回一个由PoetryBot类实例构成的可变列表。
@staticmethod
PoetryBot.search(
name: str,
session: Optional[requests.Session] = None,
parser: str = 'html.parser'
) -> List[PoetryBot]
name: 诗词名称session: requests.Session类型,用于爬虫。如果为None则新建一个sessionparser: beautifulsoup4解析器,详细说明见文档返回PoetryBot类实例(与诗词名称相关的诗词ID)列表。