‍Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记‍

由于需要也是为了督促自己学习新的东西,我原本想要尝试着写一个爬虫程序,能够在cnki上自动得将论文进行批量下载,学习过程中遇到了诸多情况,cnki也真是专业,不得不佩服cnki的强大。

下面进入正题:

学习、实验环境:ubuntu 14.04

工具:Eclipse,FireFox,FireBug,HttpFox

编程语言:python,   js,   XUL

由于我是中山大学学生,使用校园网进入cnki进行下载是不用登录的,所以我也就没进行模拟登录等方面的实现,有需要的朋友可以使用splinter进行模拟登录,也算快速便捷哈。

首先我们要实现使用python对cnki的论文实现批量下载,我们首先要对客户端和服务器之间相互传递的信息进行了解,这里我第一次使用的是wireshark,但是这个工具虽然强大,但是真不利于我们进行分析,它抓取的是我们电脑端口的信息,而不能只抓取当前网页的,在多次尝试之后我选择了HttpFox进行数据包抓取:

如图我们可以发现cnki对一个下载进行了3此redirect,我们通过对获得的数据和再一次发送的数据对比可以发现:前一次获得的url就是下一次get的url,所以我们就可以写出下载部分的核心代码,只有一点点是自己写的,许多网上一搜就有。

# -*- coding: UTF-8 -*-

import sys

import urllib2

import cookielib

import string

import re

import time

cj = cookielib.CookieJar()

cookie_support = urllib2.HTTPCookieProcessor(cj)

opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)

urllib2.install_opener(opener)

url = 'http://epub.cnki.net/kns/download.aspx?filename=MBnRwcDMudGaItiamtScHVzb2Y0ZrVWRCBjaykEVXRTOjV0QHxUcTh3KNFXbHBDTyQVMNR2cP9kYGh1SXZnQnp3b3I2YqBnbUJ3KSNnRvpEUwhWTVJjNKBDcXVnSmZUayMkRVJUdytCe1AjT1ImTYdWdth1RtlGb&tablename=CMFDLAST2013'

h = {

'Referer' : url,

'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'

}

r = urllib2.urlopen(urllib2.Request(url,headers = h))

r = urllib2.urlopen(urllib2.Request(r.geturl(),headers = h))

r = urllib2.urlopen(urllib2.Request(r.geturl(),headers = h))

r = urllib2.urlopen(urllib2.Request(r.geturl(),headers = h))

data = r.read()

print data

使用FireBug获取网页源代码,随意找几个下载图标的链接url粘贴到代码中试一试成功了。

下载部分的代码成功了,那下面就是,如何从cnki的网页中获取到下载的url了,在这部分的实现中,我原本想要使用纯python的实现,使用python写一个爬虫,直接上cnki进行抓取,但是具体实现的时候碰到了很大的问题,例如:1、爬虫网页动态生成的数据困难重重;2、cnki网页在浏览器显示的url一直都是:”;3、我们需要的网页是放在一个iframe标签里面的,这就非常蛋疼了,一直没找到获取办法

在同学的提示下,我发现了也许FireFox Extension是可行的解决方案。

学习FireFox Extension的话首先需要能至少看懂XUL代码,然后基本的模范着写,然后呢,就得学会javascript了,当然也有不用js实现的插件,例如使用python写,那使用PyXPCOM,但是我还没学会,这里页不需要哈。

(一)FF extension总体认知

FF是基于mozilla内核的,其浏览器引擎功能主要由C语言实现,但其浏览器界面及其界面上的相关操作都是由JS和XUL完成的,这就是FF的强大之处,同时它也为大家提供了很好的扩展机制。

FF扩展的开发目录结构:

可以到官网上仔细看看。

FF的工作方式:

对于任何一种新的开发语言或环境,大家通常都试图去寻找程序的入口点。可以很负责任地跟大家说,任何编译型(解释型程序)开发语言的程序都有类似C中的Main函数、Java中的主类(public static void main函数)、C#中的入口函数(static void/int Main)等作为程序入口。

这里我们呢了解这些也就够了。

这里我的目录结构是:

–chrome

–content

–overlay.js

–sample.xul

–chrome.manifest

–install.rdf

其中install.rdf代码为:

xmlns:em="http://www.mozilla.org/2004/em-rdf#">

sample@example.net

1.0

2

{ec8030f7-c20a-464f-9b0e-13a3a9e97384}

1.5

4.0.*

DownLoadPaper

A test extension

Liang

http://www.example.com/

chrome.manifest代码为

overlay chrome://browser/content/browser.xul chrome://sample/content/sample.xul

content     sample    chrome/content/

overlay.js代码为:

function getURL() {

if ( window.content.document.location.href != "  {

alert("Worng address");

} else {

var myWin = window.content.document.getElementById('iframeResult').contentWindow;

var hre = myWin.document.getElementsByClassName('brief_downloadIcon');

var path = prompt("save address","eg. //****/****");

path = path + "/test.csv";

try {

netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");

} catch (e) {

alert("no permisson...");

}

var file = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile);

file.initWithPath(path);

if ( file.exists() == false )  {

file.create( Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420 );

}

var outputStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance( Components.interfaces.nsIFileOutputStream );

outputStream.init( file, 0x04 | 0x08 | 0x20, 420, 0 );

var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"] .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);

for (var i = 0; i

converter.charset = 'UTF-8';

var convSource = converter.ConvertFromUnicode(hre[i].href+"\n");

var result = outputStream.write( convSource, convSource.length );

}

outputStream.close();

alert("File was saved in "+path);

}

}

sample.xul代码如下:

xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

至此,这个粗糙的辅助插件就编写完了,将文件打包压缩成zip格式,然后改名后缀为.xpi,再拖入FF就能安装了,这里需要修改一下FF的权限,使得插件能够修改本地文件,这样,工具栏里会多出一个工具,点击就能把论文下载的URL下载到一个test.csv的文件里了,windows下的用户就不要存到C盘里哈。

完整python文件为:

# -*- coding: UTF-8 -*-

import sys

import urllib2

import cookielib

import string

import re

import time

f = open('test.csv', 'r')

i = 1

for line in f:

print line

try:

cj = cookielib.CookieJar()

cookie_support = urllib2.HTTPCookieProcessor(cj)

opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)

urllib2.install_opener(opener)

url = line

refer = 'http://epub.cnki.net/kns/brief/brief.aspx?pagename=ASP.brief_default_result_aspx&dbPrefix=SCDB&dbCatalog=%e4%b8%ad%e5%9b%bd%e5%ad%a6%e6%9c%af%e6%96%87%e7%8c%ae%e7%bd%91%e7%bb%9c%e5%87%ba%e7%89%88%e6%80%bb%e5%ba%93&ConfigFile=SCDBINDEX.xml&research=off&t=1431252221059&keyValue=python&S=1'

h = {

'Referer' : refer,

'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'

}

r = urllib2.urlopen(urllib2.Request(url,headers = h))

r = urllib2.urlopen(urllib2.Request(r.geturl(),headers = h))

r = urllib2.urlopen(urllib2.Request(r.geturl(),headers = h))

r = urllib2.urlopen(urllib2.Request(r.geturl(),headers = h))

data = r.read()

if data[:8] == '[TARGET]':

with open(str(i)+".caa", "wb") as up:

up.write(data)

up.close

else:

with open(str(i)+".caj", "wb") as up:

up.write(data)

up.close

print str(i)+' '+'succeed'

time.sleep(2)

except:

print str(i)+' '+'failed'

i = i + 1

这样,将test.csv与python文件放于相同目录下,运行python文件就可以下载了。

python 批量下载知网(cnki)论文_Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记 顶...相关推荐

  1. python 批量下载知网(cnki)论文_Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记...

    ‍Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记‍ 由于需要也是为了督促自己学习新的东西,我原本想要尝试着写一个爬虫程序,能够在cnki上自动得将论文进行批量 ...

  2. 知网博士论文校外查找下载方法

    校外查找下载知网博士论文的方法如下: 1.首先使用文献党下载器(wxdown.org)进入知网,在文献党下载器资源库双击"知网"名称即可进入知网 2.进入知网,输入关键词.篇名.作 ...

  3. python 批量下载知网(CNKI)论文

    1.目的: 朋友找我去知网帮他下载点相关论文,发现老是要去点击文章.点击下载,显得很麻烦,百度一下,别人的方法太复杂,所以自己写了一个python脚本自动下载知网论文. 2.前期准备 1)安装pyth ...

  4. 在家里免费下载知网内的论文方法

    方法1 点击进入 http://www.cn-ki.net/ 输入要搜索的论文题目 通过微信扫描二维码,关注后,并且发送XZM. 将获取的下载码输入后,就可以下载知网论文. 亲测可行 -------- ...

  5. 知网学术论文下载caj格式转换 caj转pdf

    文章目录 前言 一.海外版知网 二.Zotero用户,使用Zotero Connector便可以直接在非海外版知网下载PDF格式,不论文期刊论文还是硕博论文 三.知网油猴脚本 前言 知网学术论文,特别 ...

  6. 利用 Python 和 Selenium 自动下载知网期刊文件

    利用Selenium自动下载知网期刊文件 1 下载 Chrome 的 Webdriver 2 代码 2.1 导入相关的包 2.2 设置 WebDriver 2.3 找到期刊名在网页上对应元素 2.4 ...

  7. 论文必备-五大学术文献资料推荐网站+免费下载知网、万方的论文资料

    五大学术文献资料推荐网站 国家哲学社会科学文献中心 http://www.ncpssd.org 提供免费下载,提供各类哲学社会科学文献. 搜索功能强大,提供分类搜索.提名/关键词等搜索,也可以输入关键 ...

  8. 『重磅』免费无限量下载知网/万方/维普等数据库文献的正规渠道

    本文链接("因果关系推断"微信公众号) 疫情期间迟迟不能返校,科研汪们都渴望可以像以前在学校那样,依旧自由地下载知网/万方/维普文献.今天就向大家推荐一种**『免费无限量』下载学术 ...

  9. 使用校园网,下载知网资料

    [此法无需下载app,但是访问流程比较复杂] 问题描述:大家都知道,学校的校园网是可以免费下载 知网,方正数据等数据库的论文资料的,但是如果我们过年回家,在外实习,即不在校园网的情况下,如果获取论文资 ...

最新文章

  1. SAP QM中阶执行事务代码QDB1,报错- Inspection severity 001 AQL 0.650 not in sampling schema A01-
  2. 从零开始学习jQuery (五) 事件与事件对象【转】
  3. linux驱动之I2C
  4. 6张信用卡欠款10000到47000不等,会被起诉坐牢吗?
  5. java制作图形界面数据库_java图形界面以及链接数据库
  6. zookeeper源码-分布式锁
  7. mysql 列 随机数_MySQL的指定范围随机数函数rand()的使用技巧
  8. 去中心化交易所如何“惊世骇俗”?
  9. 20200728每日一句
  10. Kepware OPC与服务器通讯
  11. ZJ-在线取色器的使用(RGB值转HSV值)
  12. Webstorm汉字乱码时
  13. 笔记本进入pe却看不到计算机硬盘,一些笔记本进WINPE后找不到硬盘的解决办法...
  14. github snap android,轻量级的viewpager指示器
  15. Python买家具(类)
  16. H5网页涂鸦canvas
  17. 冷门但实用的Word技巧
  18. mongoDB常用查询更新删除语句
  19. URL 重写模块导致 IIS7 应用程序池自动关闭
  20. 求矩阵的特征根和特征向量

热门文章

  1. ICLR2022:基于积分梯度的迁移对抗攻击
  2. vivaldi浏览器使用技巧:
  3. 金融科技的下半场:服务边界的“进化论”
  4. ijkplayer 参数说明文档 --个人使用
  5. ER图连接线上加个圆圈什么意思_如何拿链家网的租房数据做些有意思的事情?...
  6. python自增_python的自增
  7. ubuntu20.04 网络配置
  8. 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测
  9. 2023软件测试面试题及答案
  10. 负债累累只因创业失败,郑州42岁餐饮老板创业之殇