问题提出
2022 年已过了六分之一,马上要上班投入新的战斗,好久没写代码,手有些痒,准备提前热热身,又正好瞄到一篇微信公众号文章,里面汇总了所有学科的北大核心期刊投稿方式,有邮箱,投稿系统的网址,还有纸质稿件的接收地址。考虑先在本地保存成 Excel 表格后,分析下哪些杂志社的信息化程度较高或更重成本而轻效率,另外说不定哪天自己想投文章了,也方便查阅比较。
放上源信息和本地数据文件截图做对比,对代码和原理不感兴趣的同学,直接跳到文末,关注微信公众号“乐享 Python”,回复"北大核心",获取所有投稿联系方式的数据。
设计思路
简单说,常规的思路分为三步:请求,解析,保存。主要用到Python中的爬虫知识和丰富的第三方库。有关爬虫的学习资源,强烈推荐一个在线电子书 https://python3webspider.cuiqingcai.com/
- 请求库通常有requests ,Selenium ,PhantomJS 等。
- 解析库有lxml ,html5lib,Beautiful Soup,pyquery 等。本文选择html5lib,中文容错能力强。
- 保存方式有txt,csv,xlsx,各种关系数据库等。本文选择轻小简便的csv文件存储。
既然上面讲的是常规爬虫设计思路,本文又要一句代码实现,所以上面介绍的工具大都不用,只用到html5lib和Pandas。Pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。
具体实现
- 安装第三方库(html5lib和Pandas)。
直接用上pip,现在想起十年前初学Python时,为安装一个简单的package,用easy_install折腾一个下午,满眼都是泪。
pip install pandas html5lib
- 利用pandas的 read_html 函数解析url中表格,更全的read_html用法请参考https://mp.weixin.qq.com/s/eJl97IzSkao7CaQu4oEsqg,最后用to_csv方法保存。
import pandas as pd
dfs = pd.read_html(url, flavor="html5lib")
concat_df = pd.concat(dfs)
concat_df.to_csv("submit-table.csv", encoding="utf-8-sig", index=None, header=None)
-
read_html(url, flavor=“html5lib”)
- 参数一:url,除了可以接受含有表格table的网址url,可以接受含有table标签的字符串,还可以是本地文件。
- 参数二:flavor,表示指定的解析器类型,默认是lxml,这些都需要事先通过pip命令安装。返回的结果是DataFrame组成的list
-
concat函数
- 参数一:args是必需的,表示参与拼接的pandas对象,如列表或字典,本代码中指的是dfs。
- 参数二:axis表示在哪些轴方向上(行或列)进行数据拼接,其值0是行,1是列。由于本文实现相同字段的表首尾相拼接,所以采用默认值axis=0。当axis = 1的时候,concat就是行对齐,表示横向表拼接。
-
to_csv(“submit-table.csv”, encoding=“utf-8-sig”, index=None, header=None)
- 参数一:"submit-table.csv"表示将Dataframe对象保存为csv的文件名。
- 参数二:encoding=‘utf-8-sig’,表示指定文件的编码,为了防止用Office Excel打开含中文字符的csv时出现乱码,这里指定utf-8-sig表示带有签名的 utf-8(UTF-8 with BOM)。
- 参数三:index=None 不需要csv中每行的第一列中出现索引数字列。
- 参数四:设置header=None,因为表格中已含有中文表头(学科,期刊刊名,投稿地址),所以不需出现起始0的数字表头。
为了便于阅读,严格说用了四行代码。一行代码应该是这个样子。
pd.concat(pd.read_html(url, flavor="html5lib")).to_csv(
"submit-table.csv", encoding="utf-8-sig", index=None, header=None
)
结论
赠人玫瑰手有余香。
后期再分享一篇汇总了所有期刊的版面费和审稿费信息,其原理都一样,只是换个网址url即可。关注公众号 “乐享Python”,定期分享教育资源干货。