Open starjason opened 7 years ago
运行前请保证你已在 mysql 数据库中建立了相应的表结构(在三个 .sql 文件中)
如下:
CREATE TABLE IF NOT EXISTS `articles` (
`id` int(11) NOT NULL,
`title` varchar(500) DEFAULT NULL,
`author` varchar(500) DEFAULT NULL,
`abstract` text,
`keywords` varchar(500) DEFAULT NULL,
`dbcode` varchar(50) DEFAULT NULL,
`sid` varchar(300) DEFAULT NULL,
`filename` varchar(200) DEFAULT NULL,
`type` int(11) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
`href` varchar(500) DEFAULT NULL,
`toname` varchar(200) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=11092 DEFAULT CHARSET=utf8;
并且,在文件 spider_cnki.py 的 main 中修改你的数据库相关配置信息(库名、用户名、密码):
def main():
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='', db='cnki_py_db', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)
@zyt01 感谢!已经能够爬取出来数据了 但是有一个问题是,每次运行 数据量都会不停的增加 是怎么回事?
每次运行 数据量都会不停的增加 是怎么回事?
不停的增加 具体是指?
(我昨天应该是更新了部分代码,你看看 pull 下是不是最新的,感谢指出问题,才发现之前传上来的代码里有些步骤,测试时给注释掉了。。。)
我是使用 in.txt 里面的文章链接作为爬虫的入口,每一个链接都会引发一棵引文树,采集的多了互有交叉就形成了一个引文网。
具体的流程:
文章链接入口 -> 引文列表 -> 遍历文章链接 ->...
如图:
循环次数通过 spider_cnki.py 中的全局变量 times 设置,这里我设置的是 5,即循环 5 次。
times = 5
in.txt 下链接数目酌情增减,我跑这个花了几十分钟吧(还是一两个小时?具体忘了)
需求量小的话可以改少一点链接入口,也可以改小全局循环次数,需求大的相反。
1、在in.txt里只放一个连接。 2、执行python spider_cnki.py 抓取数据。得到的数据如下: 1)第一次执行得到 139条。 2)再次执行得到278条。 3)第3次执行得到417条。 ……
具体查看数据,发现很多数据都有重复,是否就是每次再次执行脚本,导致数据量不断增加的原因?
嗯,对,应该是我没有做重复检查的原因,我会找个时间加上检查并忽略插入的步骤。 |・ω・`)
对了,我重复实验时发现,照我上面给出的创建表代码,每个表创建完后还有主键没有设置,我当时是直接导出 sql 文件的,不知道为什么导出的代码里没有设置上。
你可以自己设置上,也可以加上这两句(三个表都设置,sql 语句里替换相应的表名)。
ALTER TABLE `articles` ADD PRIMARY KEY(`id`);
ALTER TABLE `articles` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT;
确保 id 为主键且自增。
3张表都要建立吗?我现在只建立了一张articles表。
如果你只是单纯地想抓数据,这一张表就够了~
后面的表是为了得到 slink.net 这个文献引用网络图。
网络图怎么生成的?
cnki 的文献不都是引用的关系么,即每一个文章下有许多引用文章的链接。
抓到这篇文章的信息后,再以引用列表的文章链接为新入口,挨个再次抓取一遍信息,接着再找新的引用文章列表里的链接,循环次数的设置在上面我提过。(你可以看第四条)
在 get_slink.py 里,我是针对 article 表里的 (filename, title) 以及 toname 字段作为连接关系抽取得到 slink 表的。
如:
1、我想问的是如何将数据可视化,比如生成网状图,或者树形关系图。 2、同一篇文章被其他文章引用,并且多次引用这个如何处理的。即,a文章被b文章引用,b文章又被c文章引用,c文章被a文章引用……
1 get_slink.py 生成 .net 文件后,直接用 Gephi 打开就行。其他可视化可以选择 D3js 也不错,不过需要自己构建。
2 所以最后会生成一个平均入度和出度都比较高的网络图,而不是树形图。(不过你这个说法 a、b、c 在时间上不成立吧。。。毕竟只能后发表的引用前发表的,前发表的不可能引用后发表的)
应该是这样: a被b引用 b被c引用 c被d引用 a被c引用 a被d引用 b被d引用 ……
执行python spider_cnki.py
有如下报错: