概述
·前言
·代码实现
·爬取结果
·后记
前言
近日可谓十分匆忙,北京的最低温已达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