zyt01 / Spider_CNKI

Spider CNKI in python
2 stars 2 forks source link

问题反馈! #1

Open starjason opened 7 years ago

starjason commented 7 years ago

执行python spider_cnki.py

有如下报错:

select error
Traceback (most recent call last):
  File "spider_cnki.py", line 321, in <module>
    main()
  File "spider_cnki.py", line 316, in main
    reorder_data(conn)
  File "spider_cnki.py", line 95, in reorder_data
    for row in select_cur:
  File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 277, in fetchone
    self._check_executed()
  File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 76, in _check_executed
    raise err.ProgrammingError("execute() first")
zyt01 commented 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)
starjason commented 7 years ago

@zyt01 感谢!已经能够爬取出来数据了 但是有一个问题是,每次运行 数据量都会不停的增加 是怎么回事?

zyt01 commented 7 years ago

每次运行 数据量都会不停的增加 是怎么回事?

不停的增加 具体是指?

(我昨天应该是更新了部分代码,你看看 pull 下是不是最新的,感谢指出问题,才发现之前传上来的代码里有些步骤,测试时给注释掉了。。。)

我是使用 in.txt 里面的文章链接作为爬虫的入口,每一个链接都会引发一棵引文树,采集的多了互有交叉就形成了一个引文网。

具体的流程:

文章链接入口 -> 引文列表 -> 遍历文章链接 ->...

如图:

qq20161013-0

循环次数通过 spider_cnki.py 中的全局变量 times 设置,这里我设置的是 5,即循环 5 次。

times = 5

in.txt 下链接数目酌情增减,我跑这个花了几十分钟吧(还是一两个小时?具体忘了)

需求量小的话可以改少一点链接入口,也可以改小全局循环次数,需求大的相反。

starjason commented 7 years ago

1、在in.txt里只放一个连接。 2、执行python spider_cnki.py 抓取数据。得到的数据如下: 1)第一次执行得到 139条。 2)再次执行得到278条。 3)第3次执行得到417条。 ……

具体查看数据,发现很多数据都有重复,是否就是每次再次执行脚本,导致数据量不断增加的原因?

zyt01 commented 7 years ago

嗯,对,应该是我没有做重复检查的原因,我会找个时间加上检查并忽略插入的步骤。 |・ω・`)

对了,我重复实验时发现,照我上面给出的创建表代码,每个表创建完后还有主键没有设置,我当时是直接导出 sql 文件的,不知道为什么导出的代码里没有设置上。

你可以自己设置上,也可以加上这两句(三个表都设置,sql 语句里替换相应的表名)。

ALTER TABLE `articles` ADD PRIMARY KEY(`id`);
ALTER TABLE `articles` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT;

确保 id 为主键且自增。

starjason commented 7 years ago

3张表都要建立吗?我现在只建立了一张articles表。

zyt01 commented 7 years ago

如果你只是单纯地想抓数据,这一张表就够了~

后面的表是为了得到 slink.net 这个文献引用网络图。

starjason commented 7 years ago

网络图怎么生成的?

zyt01 commented 7 years ago

cnki 的文献不都是引用的关系么,即每一个文章下有许多引用文章的链接。

qq20161014-0

抓到这篇文章的信息后,再以引用列表的文章链接为新入口,挨个再次抓取一遍信息,接着再找新的引用文章列表里的链接,循环次数的设置在上面我提过。(你可以看第四条)

在 get_slink.py 里,我是针对 article 表里的 (filename, title) 以及 toname 字段作为连接关系抽取得到 slink 表的。

如:

qq20161014-1

starjason commented 7 years ago

1、我想问的是如何将数据可视化,比如生成网状图,或者树形关系图。 2、同一篇文章被其他文章引用,并且多次引用这个如何处理的。即,a文章被b文章引用,b文章又被c文章引用,c文章被a文章引用……

zyt01 commented 7 years ago

1 get_slink.py 生成 .net 文件后,直接用 Gephi 打开就行。其他可视化可以选择 D3js 也不错,不过需要自己构建。

2 所以最后会生成一个平均入度和出度都比较高的网络图,而不是树形图。(不过你这个说法 a、b、c 在时间上不成立吧。。。毕竟只能后发表的引用前发表的,前发表的不可能引用后发表的)

starjason commented 7 years ago

应该是这样: a被b引用 b被c引用 c被d引用 a被c引用 a被d引用 b被d引用 ……