爬取中国知网CNKI引证文献

概述

·前言

·代码实现

·爬取结果

·后记

前言

近日可谓十分匆忙,北京的最低温已达3度,被窝的温暖让人留恋。

昨日在思考信息计量小组的选题时,突然意识到一个问题:我们计量分析的数据如引证文献应该从哪获取、怎么获取?是能直接在网站打包下载嘛?

记得老师上课提到的关于诺贝尔奖作者发文前后的实证研究,如科学界的马太效应的实证研究。遂去中国知网CNKI检索了作者为2015年诺贝尔生理学或医学奖得主屠呦呦的文献。

点击进入被引量最高的“青蒿素(Arteannuin)的结构和反应”文献详细页面。结果如下图所示,网站似乎没有提供引证文献的导出,就有了通过爬虫获取引证文献的想法,也就有了这篇记录。(Web of Science可以导出)

“青蒿素(Arteannuin)的结构和反应”引证文献(部分)

起初以为通过requests+beautifulsoup方式就能轻松爬取到数据,但发现该方法并不可行,毕竟都是同行。遇到的困难主要有以下几点:

1.知网的主体页面使用ASP

2.检索结果页面代码里有嵌套

3.知网通过cookie跟踪用户行为

4.检索式的提交和文献详细页面的url都是经过后台处理,不能直接请求,否则会重新定向回知网首页

对于1,3两点,一些博客用这个链接以及飞掠模式来搜索文献,但可能与知网本身搜索出的结果有一些差异,详细引文界面的url也是经过后台处理的(点击进去貌似是旧版的知网);对于第4点,知网对引文页面没用处理,展示引证文献详细页面的url是可以直接访问的。所以决定使用selenium+chromedriver爬取到所有引证文献的url并保存,再使用requests请求将这些url访问并用lxml操作保存相关数据。

代码实现

(爬取每篇文献的引证文献页面url部分的代码)

获取检索框并输入文字等定位都是selenium的常规操作,最重要的是通过浏览器自带的开发者工具抓包发现检索结果请求的url是什么。

比如这次是要检索作者为屠呦呦的文献,按F12打开Chrome的开发者工具,点击network,随后按下检索请求,筛查后发现下图中的url才是真正的请求,这可真够长的。里面显示的正是检索结果页面iframe框架下的内容。剩下逐个点击检索结果文献并返回该文献引证文献的url就是常规操作了。

抓取url

from selenium import webdriver
import time
from lxml import etree
from urllib import request


#进入文献详细页面并获取该文献的引证文献
def get_paper(page,index):
    html_parse=etree.HTML(page) #构造了XPath解析对象并对HTML文本进行自动修正
    ul=html_parse.xpath('//div[@class="essayBox"]/ul')[index] #进入引证文献,包括中国学术期刊网络出版总库、中国博士学位论文全文数据库、中国优秀硕士学位论文全文数据库等
    li_list=ul.findall('li'#找到所有的引证文献
    for li in li_list:
        a_list=li.findall('a'#找到引证文献的页面链接
        for index in range(0,len(a_list)):
            print(a_list[index].text)
            if index==0:
                print(a_list[index].tail)   

#在知网的查询框中选中作者并输入作者姓名,获得cookieessayBox
def get_cookie():
    driver.get('http://kns.cnki.net/kns/brief/default_result.aspx')
    time.sleep(2)
    driver.find_element_by_name('txt_1_value1').send_keys('屠呦呦')
    driver.find_element_by_xpath('//select[@id="txt_1_sel"]//option[@value="AU$=|"]').click()
    driver.find_element_by_id('btnSearch').click()   #点击搜索按钮
    time.sleep(2)

#缺少paperid
#点击论文列表中的论文,进入到论文的页面,获得引证论文的url
def get_url(num):
    #因为检索结果第一行是题名、作者、来源等,所以要添加bgcolor来定位文献
    elements=driver.find_elements_by_xpath('//table[@class="GridTableContent"]//tr[@bgcolor]')
    for element in elements:
        try:
            a=element.find_element_by_xpath('td/a[@class="fz14"]')
            print(a.get_attribute('href')) #得到检索结果文献的链接
            paper_info=element.text.replace('\n',' ').split(' '#文献标题过长而导致的换行显示
            paper_title=element.find_element_by_xpath('td[2]').text #获取文献的标题
            author = element.find_element_by_xpath('td[3]').text
            date = element.find_element_by_xpath('td[5]').text
            reference = element.find_element_by_xpath('td[7]').text
            if reference == ''#若无被引的话,知网会显示为空
                reference = 0
            print(paper_title,author,date,reference)
            insert_info=(str(num),paper_title,author,date,reference,a.get_attribute('href'))
            if reference != 0:
                a.click()
                windows = driver.window_handles
                driver.switch_to.window(windows[-1]) #将浏览器页面改为文献刚点击的详情页
                time.sleep(5)
                i=0
                driver.find_element_by_xpath('//*[@id="rl3"]').click()
                time.sleep(3)
                url0_list=[]
                url1_list=[]
                url2_list=[]
                html_parse=etree.HTML(driver.page_source)
                url=driver.find_element_by_xpath('//div[@class="yzwx"]/a').get_attribute('href')

                if(url!=None):          
                    print(url)
                    driver.get(url)
                    html_parse=etree.HTML(driver.page_source)
                    a0_list=html_parse.xpath('//span[@id="CJFQ"]//a')#中国学术期刊网络出版总库
                    a1_list=html_parse.xpath('//span[@id="CDFD"]//a')#中国博士学位论文全文数据库
                    a2_list=html_parse.xpath('//span[@id="CMFD"]//a')#中国优秀硕士学位论文全文数据库
                    for a in a0_list:
                        url0_list.append(a.attrib['href'])

                    for a in a1_list:
                        url1_list.append(a.attrib['href'])

                    for a in a2_list:
                        url2_list.append(a.attrib['href'])
                    if len(a0_list) == 0 or len(a1_list) == 0 or len(a2_list) == 0:
                        url0_list.append(url)
                db.insert_info(insert_info,url0_list,url1_list,url2_list) #插入
                num=num+1
                driver.close()
                driver.switch_to_window(windows[0])
        except Exception as arg:
            print (arg)
        time.sleep(2)
    return num


if __name__=="__main__":
    options = webdriver.ChromeOptions()
    prefs = {
        'profile.default_content_setting_values' :
            {
            'notifications' : 2
             }
    }
    options.add_experimental_option('prefs',prefs)
    driver = webdriver.Chrome(chrome_options = options) #屏蔽谷歌浏览器弹出通知
    driver.maximize_window()
    get_cookie()
    db=dbmanager_paper('root','12345678','127.0.0.1','zhiwang')#连接本地数据库
    num=1
    now_page=1
    #通过chrome抓包得到iframe中的url,由于selinium有cookie,所以我们可以直接访问
    driver.get('http://kns.cnki.net/kns/brief/brief.aspx?pagename=ASP.brief_default_result_aspx&isinEn=1&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=1570876294474&keyValue=%E5%B1%A0%E5%91%A6%E5%91%A6&S=1&sorttype=')
    #尝试爬取一页论文
    while(now_page<2):
        num=get_url(num)
        a_list=driver.find_elements_by_xpath('//div[@class="TitleLeftCell"]//a')
        for a in a_list:
            if(a.text=='下一页'):
                a.click()
                break
        now_page=now_page+1
        time.sleep(2)

selenium运行的过程

检索结果的文献及其“假的”url

爬取结果(部分)

将爬取的引证文献url用requests请求lxml处理即可,使用mysql.connect可以将结果insert into mysql。

检索结果第一页被引不为0的文献(本地数据库)

编号为6的文献的所有被引文献(本地数据库)

知网上显示的编号为6的文献的所有引证文献

对比爬取下来的6号文献——《青蒿化学成份及其与青蒿素伍用对鼠疟的药效学研究》的14篇引证文献已全部爬取并保存到本地数据库中。

后记

只能说算是一个新网站爬取尝试吧,希望、假如小组作业需要使用时能不出现bug,将引证文献通通爬下来~天啊,我还有两篇综述要写,马上又要比赛了,溜了溜了T.T

print("谢谢观看")
echo "我心累"

2019年10月13号于学校文史楼

关于JQuery引用及基本用法

在JQuery文件中下载,并将其引入html文件。在使用jQuery之前,我们需要到jQuery的官方网站:“”

把下载好的文件放到工程根目录下,然后在这个根目录下创建index.html文件。最后,将下载的JQuery文件引入index.html文件,其代码如下:






Document





1234567891011121314151617181920212223242526272829复制代码类型:[html]

通过引入script标签,JQuery被引入到subject的subject中,subject是:

接下来,我们将研究JQuery的基本语法,并对其进行一些介绍。

示例1:$("div").hide();此行表示隐藏div元素;

例子2:$(".box1").hide();这行代码意味着class属性隐藏在box1的元素中;

示例3:$("#wrap").hide();这行代码表示隐藏元素id的值为wrap;

示例4:$("hide.box1").hide();这一行代码意味着,隐藏带有box1的cycle属性的hv元素;

从上面的例子中可以看出,JQuery语法非常简单,只需要一个美元符号$,后面跟着一个html的元素选择符(与我们之前学到的css选择符高度一致),然后在后面加上JQuery的方法,例如hide(show等等)。

无论显示或隐藏元素时,都需要一个事件来触发该动作,我们常用的触发方式是鼠标点击,比如你用鼠标点击一个按钮,然后页面上就会弹出一个提示框,通过点击来触发效果,我们称之为“事件”。点击JQuery中事件的书写方式为:$("div").click(function(){...}),此代码意味着在div标签被点击之后触发事件,具体事件内容以函数形式写入。除单击事件外,JQuery还可以通过鼠标移动事件、双击事件、元素获取焦点事件等方式进行学习,后面我们将一一介绍,并查看JQuery如何使用。




Document





1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253复制代码类型:[html]

在以上代码中,我们定义了一个button元素,一个div元素,然后点击按钮button,这个div元素就会被隐藏起来,各位同学可以尝试一下。在代码的最后一部分,包含了一段script标签,这段是JavaScript代码,所有的JavaScript代码都将被放置在script标签中以执行。

接下来是代码的第一句话:$(document).ready(function){...},这是JQuery的固定写法,意思是页面加载后立即执行,执行代码被写入function函数的方法中(即{}内)。我们已经看到了这一方法。

$("#btn1").click(函数){

$(".box1").hide();

})

这个代码就是我们前面提到的click事件,当单击id值为btn1的按钮时,会引发一个click元素的隐藏事件,click元素的名字叫做box1。

本站内容来自用户投稿,如果侵犯了您的权利,请与我们联系删除。联系邮箱:835971066@qq.com

本文链接:http://news.xiuzhanwang.com/post/2696.html

友情链接: