360图书馆医案数据的采集

背景:做科研需要基础数据,其中一部分只能到网上爬取。
任务:获取360图书馆里面某一个用户下有价值的医案数据,并保存到access数据库中,至于为何用access数据库,是因为后期查看、导出数据方便。
1 数据库表
360图书馆医案数据的采集
文章图片

用pyodbc驱动连接数据库。其官方文档在:http://mkleehammer.github.io/pyodbc/
里面的文档比较详细,直接用官方推荐代码就可以。注意,最后cusr.execute(sql) 后别忘了需要conn.commit()提交。
当时还遇到一个问题:系统安装的是绿色版office2016,odbc数据源中没有access的驱动(通过cmd中运行odbcad32调出数据源窗口查看),后来折腾又给安装了一个office2013,又去搞激活,各种杂事一通,真浪费时间,有时候想想,国人的软件之路真需要努力啊。
360图书馆医案数据的采集
文章图片

2 爬取页面内容
这部分很久前就爬取过类似的单页文档,比较简单,不过需要根据每个页面的特征进行提取。
3 列表获取
因为要爬取的栏目有1000多个页面内容,所有放在多个页面中,每个页面默认呈现10条记录。如何获取这个url的列表是关键内容。
参考了:https://www.cnblogs.com/cokefentas/p/14731920.html
这位仁兄把思路过程描述的很清楚,只需要按照思路,根据当前的内容进行分析就可以了。以为因为自己前端弄的少,尤其是js这部分不是很熟,于是把这部分在浏览器的调试模式下再现了一遍,确实最后得到的sign是一模一样的。
注意事项:
python中之心js代码,用到了execjs模型,需要如下安装:
pip install PyExecJS
然后再运行如下语句:
print(execjs.get().name)
如果结果是:JScript,说明用的Windows模型的js编译环境,需要安装node.js。
解决办法:
安装nodejs,下载地址:https://nodejs.org/zh-cn/down...
默认安装,默认配置环境变量即可
关闭PyCharm
再次执行上述execjs.get().name命令,发现已经变为 Node.js (V8)
但是,又遇到了新的问题,在调试模式中保存的js文件,后来用记事本打开,再复制了生成sign的那段JavaScript代码保存,这时候在文件头带了一个特殊标记字符\ufeff,导致总是编码报错:
360图书馆医案数据的采集
文章图片

这个解决办法有多种:
第一,可以参考https://blog.csdn.net/u011045...这篇文章,用notepad++打开后,再以无bom头的模式保存。
第二,可以把读取文件的编码格式由utf-8,改为utf-8-sig。

utf-8与utf-8-sig两种编码格式的区别:
As UTF-8 is an 8-bit encoding no BOM is required and anyU+FEFF character in the decoded Unicode string (even if it’s the firstcharacter) is treated as a ZERO WIDTH NO-BREAK SPACE.
UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一様的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。
关于 \ufeff 的一些资料(引自维基百科):
字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。
360图书馆医案数据的采集
文章图片

4 ip被封
在爬取到34页(每一页10条)的时候,ip被封了,访问不了360doc。其实还是做了延时,但是header没有更换,不知道其判断的机理是怎么样的,目前来看是单位时间内的访问次数超过,也有可能是header设置不合理。
他人关于爬虫突破封禁的方法:https://www.cnblogs.com/junro...
https://cloud.tencent.com/dev...
【360图书馆医案数据的采集】没有办法,只能把每一页设置为50条,在调试模式中拿到json数据,手工去构建url_list。

    推荐阅读