如何用Python采集图书馆书目信息

最近写了一个Python数据采集的程序,功能是利用某图书馆网站的书目查询系统,查找与指定关键词相关的书籍及索书号,查询结果保存为本地CSV文件。

写这个程序有两个目的:一是练习。断断续续这门学习语言有一段时间,Python语言是个人认为比较优雅的编程语言,相对C/C++而言,不需太多计算机体系结构等底层知识;相对Java而言,语法更简单,更容易上手。最吸引人的地方是Python拥有大量第三方库,而且很多都是“开箱即用”。“不要重新发明轮子”,这正是编程的乐趣之一。

但是再容易入门的编程语言,真正要想掌握,就一个字,练、练、练(重要事情说三遍)。编程界有个“十万行代码”的说法。想成为真正的高手,先写出十万行代码再说。

二是使用图书馆时的一点感受。最近为了找一本书,在本地两个大一点的图书馆网站先后检索,先查的一个馆没有,后查的一个馆有。检索过程中发现,在两个图书馆网站需要重复进行同样的操作,稍微有点麻烦。

解决这个问题,在图书馆界而言,其实就是做好联合编目。对程序员来说,首先想到的还是通过编程解决。

先说说解决思路。因为不同图书馆网站检索实现的细节可能会有所不同,所以先分别实现每一个网站的自动检索,然后再将检索结果合成。每个网站检索人工操作过程大体相同,都包括六个步骤:(1)打开检索网页,(2)输入指定关键词,(3)获取检索结果,(4)定位书目信息,(5)读取书目信息,(6)保存书目信息

了解到这些,下面需要把这五个步骤用程序实现。顺便说一句,从设计方法看,这里采用过程式设计方法,不是面向对象设计方法。

1. 打开检索页

首先找到检索页网址,分析其查询参数设计。比如:检索页地址为

2. 输入指定关键词

上以url中"?"之后的部分为参数。检索时,需向search传递以下参数:

以上参数中只需关心前两个,即searchWay和q。其中,searchWay表示检索类型,searchWay=title表示检索标题;q表示查什么。为此,我们可以构建出一个参数params:

上面参数表示,检索标题含有关键词'python'的书目。

3. 获取检索结果

这里需要用到两个库:requests、bs4,需事先安装

4. 定位书目信息

定位书目前需要先对检索输出网页进行分析。

4.1 获得查到数量。观察网页,可以看到如下检索结果:

可见,共检索出159本Python相关书目。笔者使用Firefox浏览器,用鼠标指向159,点击右键,选择“查找元素”,可以定位到网页中该行的源码:

为提取“159”,设计了函数get_book_num(),先定到

,然后获取其子标记

的内容。

再通过五次转换,将其中的数字字符串提取出来,即split(":")[2].split(" ")[1].replace(",","",3)。先用“:”切片,再用空格符切片,最后replace()将串中可能出现的“,”过滤掉。如"1,234"。

4.2 获得总页数

用同样的方法可以获得总页数,先看图:

查网页源码,可得:

设计get_total_pages()如下:

5. 读取书目信息

5.1 自动翻页

本例中一共包含16页。如何实现? 同样先观察分析,再设计代码。

从上图可见,不同页面的url仅是最后一个数字发生变化。因此,可构造出每次打开的下一页链接,如下:

有了新的网页链接,还需要重新打开,所以设计open_new_page():

5.2 获得书目信息

这里先建一个保存书目信息的列表,用了一个双重循环。外循环用来翻页,内循环用来抽取书目信息。先上图:

再查看源码:

可见这里是用一个表格形式存放书目信息,每个标记就是一本书。所以,可用以下代码获得当前网页上的所有书目。

然后,处理每一个标记,只抽取其中需要的信息,这里只提取书名和索书号。

查看源码:

再设计代码:

6. 保存书目信息

这里使用简单的CSV文件保存检索结果,需要导入csv库。CSV文件名为books.csv,以可追加方式(w+)打开。文件每一行的信息以元组形式存放,第一行为标题行,包括三个字段,即序号、索书号、书名。

7. 其他

在程序执行过程中发现,网站设置了一定的访问时间限制。为了正常读取书目信息,程序中加一行延时访问代码,经实验,连续访问控制在5秒的间隔则可以正常工作。

8. 程序执行结果

源码

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180717G1DK0Y00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励