精华内容
下载资源
问答
  • 中国知网爬虫

    万次阅读 多人点赞 2019-11-21 14:51:25
    中国知网爬虫 一、知网介绍 提起中国知网,如果你曾经写过论文,那么基本上都会与中国知网打交道,因为写一篇论文必然面临着各种查重,当然翟博士除外。但是,本次重点不在于写论文跟查重上,而在于我们要爬取知...

    中国知网爬虫

    一、知网介绍

    提起中国知网,如果你曾经写过论文,那么基本上都会与中国知网打交道,因为写一篇论文必然面临着各种查重,当然翟博士除外。但是,本次重点不在于写论文跟查重上,而在于我们要爬取知网上一些论文的数据,什么样的数据呢?我们举一个例子来说,在知网上,搜索论文的方式有很多种,但是对于专业人士来说,一般都会使用高级检索,因为直接去查找作者的话,容易查找到很多重名作者,所以我们本次的爬虫也是使用了高级检索(泛称)的爬虫,再具体就是专业检索,有助于我们唯一定位到作者。

    二、常规步骤—页面分析

    1.来到高级检索页面,以【AU=王长峰 AND FU=71271031】为例检索,结果如下:

    2.利用Xpath语法尝试获取这些数据,却发现一无所获。

    3.按照常理来说,即使是动态网页也可以利用Xpath语法提取到数据,只是在Python里面获取不到而已,所以在这里存在我们所不知道的问题。

    三、知网反爬虫机制

    常见的反爬虫机制一般有两种:

    第一种是请求头反爬虫,这个也是最简单的,如果你不给定请求头,对方服务器就不会理你。需要设置的参数有User-Agent、Referer和Cookie。

    第二种是动态网页,利用Ajax技术使用js接口来传递数据。

    毫无疑问,对于数据非常金贵的中国知网来说,肯定使用了以上两种反爬方式,并且中国知网的js接口非常复杂,虽说复杂,但是只要你的内功要是足够强的话,还是能够分析得出来,但是对于不懂js以及web开发的朋友来说,这将是一个非常困难的事情,所以使用selenium来进行爬虫将是一件相对来说比较容易的事情。

    另外,知网也不是仅仅只有这两层反爬虫机制,还有第三层,那就是iframe,由于很多朋友并没有做过网站开发,所以不太清楚了这是什么东西,导致即使发现自己的Xpath语法正确,也无法正确获取数据,从而怀疑人生,实际上,iframe比较常见的一种反爬虫机制,不过,如果你不知道这个东西,那么你就基本上无缘爬取中国知网了。

    四、什么是iframe?

    了解iframe前,你首先得知道一个网页是什么,没错,一个网页就是一个html页面。接下来我们从感性和源码两个方面来认识一下iframe.

    1.感性认知。

    一句话:一个完整的网页内部又嵌套了多个完整的网页,嵌套的页面就叫做iframe。

    2.网页源码认识。

    比如一个非常简单的html页面(如下图所示),一个html页面是拥有一个完整的html标签的,也就是起始html【<html>】和闭合html【</html>】,而iframe则是在这一个完整的html标签里面又嵌套了一个完整的html标签。

    <html>
    <body>
    
    <p>Python伊甸园</p>
    
    </body>
    </html>

    3.看一下中国知网的源码,发现果然存在一个iframe,所以这个就是中国知网的第三种反爬虫机制。

    五、最后给出中国知网的爬虫

    1.ways.py

    import pandas as pd
    #AU=王长峰 AND FU=71271031
    def get_data():
        data_list = pd.read_excel(r"C:\Users\wwb\Desktop\科学基金.xls",
                                  encoding='utf8')
        leaders = data_list.leader.values.tolist()
        codes = data_list.code.tolist()
        results = []
        for leader,code in zip(leaders,codes):
            result = "AU={} AND FU={}".format(leader,code)
            results.append(result)
        return results
    
    #results = get_data()
    #print(results)
    

    2.main.py

    from selenium import webdriver
    from lxml import etree
    import time
    from ways import get_data
    import random
    
    def pasre_page(driver):
        html = etree.HTML(driver.page_source)
        trs = html.xpath('//tr[@bgcolor]')
        for tr in trs:
            title = tr.xpath('./td//a[@class="fz14"]/text()')[0]
            authors = tr.xpath('./td[@class="author_flag"]/a[@class="KnowledgeNetLink"]//text()')
            authors = "|".join(authors)
            source = tr.xpath('./td//a[@target="_blank"]/text()')[1]
            times = tr.xpath('./td[@align="center"]/text()')[0].strip()
            database = tr.xpath('./td[@align="center"]/text()')[1].strip()
            counted = tr.xpath('./td//span[@class="KnowledgeNetcont"]/a/text()')
            if len(counted) == 0:
                counted = 0
            else:
                counted = counted[0]
            downloadCount = tr.xpath('./td//span[@class="downloadCount"]/a/text()')
            if len(downloadCount) == 0:
                downloadCount = 0
            else:
                downloadCount = downloadCount[0]
            data = {
                    "title":title,
                    "authors":authors,
                    "source":source,
                    "times":times,
                    "database":database,
                    "counted":counted,
                    "downloadCount":downloadCount,
                    }
            datas.append(data)
            print(title)
        time.sleep(random.uniform(2,4))
        driver.switch_to.parent_frame()
        search_win = driver.find_element_by_id('expertvalue')
        search_win.clear()
        time.sleep(random.uniform(2,4))
        
    
    driver_path = r"C:\Users\wwb\Desktop\chromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    url = "https://www.cnki.net/"
    driver.get(url)
    
    home_page = driver.find_element_by_id('highSearch')
    home_page.click()
    driver.switch_to_window(driver.window_handles[1])
    search_page = driver.find_element_by_id('1_3')
    search_page.click()
    datas = []
    results = get_data()
    for result in results:
        search_win = driver.find_element_by_id('expertvalue')
        search_win.send_keys(result)
        search_btn = driver.find_element_by_id('btnSearch')
        search_btn.click()
        iframe = driver.find_element_by_id('iframeResult')
        driver.switch_to.frame(iframe) 
        time.sleep(random.uniform(2,4))
        pasre_page(driver)

    3.部分结果展示:


    扫描二维码即可参与该课程,解锁更多爬虫知识:

     

     

     

    展开全文
  • python知网爬虫

    2017-04-28 18:01:41
    python知网爬虫,根据作者,爬取所有paper信息
  • 知网爬虫

    千次阅读 2019-03-03 18:33:10
    主要是联系了urlib库的使用,通过parse进行解析数据。 实名感谢opensourceChina # -*- coding: UTF-8 -*- __author__ = 'zy' __time__ = '2019/3/1 21:05' #//*[@id="ctl00"]/table/tbody/tr[2]/td/...

     主要是联系了urlib库的使用,通过parse进行解析数据。

    实名感谢
    opensourceChina

    # -*- coding: UTF-8 -*-
    __author__ = 'zy'
    __time__ = '2019/3/1 21:05'
    #//*[@id="ctl00"]/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]/a/text()
    from lxml import etree
    def clean(text):
        text=text.replace('\r' ,'')
        text =text.replace('\n' ,'')
        text =text.replace('\r\n', '')
        text =text.replace("space","")
        #text =text.replace('; ','')
        text =text.strip()
        return text
    from urllib import parse
    def get_detail_url(url):
        urldata=parse.urlparse(url)
        result=parse.parse_qs(urldata.query)
        f_n=result['FileName'][0] #由于返回的是数组
        d_c=result['DbCode'][0]
        d_n=result['DbName'][0]
        #拼接url也有更好的方法
        #query = {"name": "walker", "age": 99}   d = parse.urlencode(query)
        data={
            'dbcode':d_c,
            'dbname':d_n,
            'filename':f_n
        }
        detail_url='http://kns.cnki.net/KCMS/detail/detail.aspx?'+parse.urlencode(data)
        #detail_url='http://kns.cnki.net/KCMS/detail/detail.aspx?dbcode='+d_c+'&dbname='+d_n+'&filename='+f_n
        return detail_url
    
    html = etree.parse('try_zhiwang.html', etree.HTMLParser())
    
    all_paper='//table[@class="GridTableContent"]//tr'
    
    nu_xpath='//table[@class="GridTableContent"]//tr[{num}]/td[1]/text()'
    tm_xpath='//table[@class="GridTableContent"]//tr[{num}]/td[2]/a//text()'
    au_xpath='//table[@class="GridTableContent"]//tr[{num}]/td[3]//text()'#''.join(ls2)
    or_xpath='//table[@class="GridTableContent"]//tr[{num}]/td[4]/a/text()'
    ti_xpath='//table[@class="GridTableContent"]//tr[{num}]/td[5]/text()'
    da_xpath='//table[@class="GridTableContent"]//tr[{num}]/td[6]/text()'
    url_xpath='//table[@class="GridTableContent"]//tr[{num}]/td[2]/a/@href'
    pages=html.xpath(all_paper)
    print(len(pages))
    Data1=[]
    Data2=[]
    Data3=[]
    Data4=[]
    Data5=[]
    Data6=[]
    Data7=[]
    for i in range(len(pages)):
        if i!=0:
            i=i+1
            #print(i)
            nu=html.xpath(nu_xpath.format(num=i))
            #print(nu[0])
            Data1.append(nu[0])
            tm=html.xpath(tm_xpath.format(num=i))
            tm = ''.join(tm)
            Data2.append(tm)
            #print(tm_xpath.format(num=i))
            au = html.xpath(au_xpath.format(num=i))
            au=''.join(au)#孬孬思考,这个是不是可以统一的进行的进行粘接然后再进行除了按clean处理呢
            print(clean(au))
            Data3.append(clean(au))
            or_ = html.xpath(or_xpath.format(num=i))
            Data4.append(or_[0])
            ti = html.xpath(ti_xpath.format(num=i))
            Data5.append(clean(ti[0]))
            da = html.xpath(da_xpath.format(num=i))
            Data6.append(clean(da[0]))
            url = html.xpath(url_xpath.format(num=i))
    
            Data7.append(get_detail_url(url[0]))
            #print('抓取文献{j}个'.format(j=i)+'序号为'+nu[0]+'题名为'+tm[0]+'作者为'+clean(au)+'来源'+or_[0]+'时间'+ti[0]+'数据库'+da[0])
    
    
    import pandas as pd
    import xlwt
    #http://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CJFQ&dbname=CJFDTEMP&filename=XDQB201903007
    #<a class="fz14" href="/kns/detail/detail.aspx?QueryID=2&amp;CurRec=1&amp;recid=&amp;FileName=ZJJG20190301004&amp;DbName=CAPJLAST&amp;DbCode=CJFQ&amp;yx=Y&amp;pr=&amp;URLID=33.1273.Z.20190301.1555.002" target="_blank">目的论命名的“神话”特征及其背后的历史动因</a>
    url_details='http://kns.cnki.net/KCMS/detail/{details}.html'#33.1273.Z.20190301.1555.002
    df1 = pd.DataFrame({'Data1': Data1,
                        'Data2': Data2,
                        'Data3': Data3,
                        'Data4': Data4,
                        'Data5': Data5,
                        'Data6': Data6,
                        'Data7': Data7})
    # df2 = pd.DataFrame({'Data2': Data2})
    # df3 = pd.DataFrame({'Data3': Data3})
    # df4 = pd.DataFrame({'Data4': Data4})
    # df5 = pd.DataFrame({'Data5': Data5})
    # df6 = pd.DataFrame({'Data6': Data6})
    #All = pd.DataFrame[df1,df2,df3,df4,df5,df6]
    
    df1.to_excel('a.xls',encoding='utf-8', index=False, header=False)
    # writer=pd.ExcelWriter('testk.xlsx')
    # df1.to_excel(writer,sheet_name='Data1',startcol=0,index=False)
    # df2.to_excel(writer,sheet_name='Data1',startcol=1,index=False)
    #df3.to_excel(writer,sheet_name='Data1')
    # create a Pandas Excel writer using xlswriter
    
    
    #tr[position()>1] 这个是排序
    

     

    展开全文
  • 个人认为这个作为一个练手的爬虫小项目还是不错的,于是写了主要的步骤,代码放在我的github,有需要的朋友可以去看看或者有改进的地方指点我一下,github链接我的github——知网爬虫 。 1. 爬虫知网的爬虫首先要...

    前几天帮朋友做了个知网的爬虫,爬取了“新闻传播”主题下的文章标题及发表时间;自己拖拖拉拉写了2天才写完,自己还是太弱了。个人认为这个作为一个练手的爬虫小项目还是不错的,于是写了主要的步骤,代码放在我的github,有需要的朋友可以去看看或者有改进的地方指点我一下,github链接我的github——知网爬虫

     

    1. 爬虫知网的爬虫首先要找到合适的知网爬虫入口,建议从这个链接进入知网入口 ;

    2. 输入要抓取的主题,进行搜索,观察url的变化,这时候看到的URL并没有太长的后缀,继续往下看;

    3. 下面就进行翻页,看URL的变化,发现每页只有15个文章标题,只异步加载15条信息,于是我们构造翻页的函数pagenext();

    4. 打开开发者工具,找打文章标题文本的标签 ,观察标签中的文本,发现被分开了,所以只能找这两个标题所在的上一级标签或者上上级标签,通过BeautifulSoup选中并get_text()提取文本,我这里选取了h3标签;

    5.  接着我们要选取每篇文章的发表日期,这就需要我们点击进入到每一篇文章里面去选取日期,通过BS选取font标签,find找到color=“#0080ff”的标签,提取文本,就能确定发表时间了;

    6. 然而抓取的过程中,我们发现每篇文章的URL是不一样的,甚至有些URL 进去根本就没有文章,于是我就观察url的构成,发现总共有三类,只有2类URL是可以使用的,于是我用正则表达式去匹配可以使用的标签,再进行请求提取文章的发表时间;

    if re.match(r"""http://youxian.cnki.com.cn/yxdetail.aspx\?filename=[0-9a-zA-Z]+&dbname=[a-zA-Z]+""",text_url) or re.match(r'http://www.cnki.com.cn/Article/[a-zA-Z]+-[0-9a-zA-Z-]+.htm',text_url):
        # print(text.find('a')['href'])
        text_date = datespider(text_url)

    7.  抓取的数据保留好,然后写入到excel中,就完成了知网的爬取;

    下面贴上源代码:

    import requests
    from bs4 import BeautifulSoup as bs
    import time
    import xlwt
    import openpyxl
    import re
    
    
    def pagenext():
    	base_url = 'http://search.cnki.com.cn/search.aspx?q=%E6%96%B0%E9%97%BB%E4%BC%A0%E6%92%AD&rank=relevant&cluster=Type&val=I141&p='
    	L = range(0,840) # 最尾巴的数不计入
    	All_Page = []
    	for i in L[::15]:
    		next_url = base_url+str(i)
    		# print(next_url)
    		print("第 ",i/15+1," 页的数据")
    		page_text = spider(next_url)
    		time.sleep(10)
    		for page in page_text:
    			All_Page.append(page)
    	# print(All_Page)
    	write_excel('xlsx论文筛选.xlsx','info',All_Page)
    
    
    def datespider(date_url):
    	# 因为跳转的链接类型不一样,所以我们要判断这两种链接是哪一种并且选择不一样的解析find方法
    	response_try = requests.get(date_url,{'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'})
    	# print(response_try.text)
    	response_tree = bs(response_try.text,'html.parser') 
    	# 根据两个不同的链接返回不一样的值
    	if re.match(r'http://www.cnki.com.cn/Article/[0-9a-zA-Z\_]+',date_url):
    		res_date = response_tree.find("font",{"color":"#0080ff"})
    		if res_date == None:
    			response_date = None
    		else:
    			response_date = res_date.get_text().replace('\r','').replace('\n','')
    	else:
    		response_date = response_tree.find("title").get_text()[-8:]
    	return response_date
    
    
    def write_excel(path,sheet_name,text_info):
    	index = len(text_info)
    	workbook = openpyxl.Workbook()
    	sheet = workbook.active
    	sheet.title = sheet_name
    	for i in range(0,index):
    		for j in range(len(text_info[i])):
    			sheet.cell(row= i+1,column = j+1,value = str(text_info[i][j]))
    	workbook.save(path)
    	print("xlsx格式表格写入数据成功!")
    
    
    def spider(url):
    	response = requests.get(url,{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'})
    	res = response.content
    	html = str(res,'utf-8')
    	html_tree = bs(html,'lxml')
    	# 找打h3标签下的内容
    	html_text = html_tree.find_all("h3")
    	All_text = []
    	# 隔一个才是文章的标题
    	for text in html_text[1:-2:]:
    		one_text = []
    		text_title = text.get_text().replace('\xa0','').replace('\n','')# 得到论文的标题
    		# print(text.get_text())
    		text_url = text.find('a')['href'] # 选取了当前文章的链接
    		# 用正则表达式匹配我们需要的链接
    		if re.match(r"""http://youxian.cnki.com.cn/yxdetail.aspx\?filename=[0-9a-zA-Z]+&dbname=[a-zA-Z]+""",text_url) or re.match(r'http://www.cnki.com.cn/Article/[a-zA-Z]+-[0-9a-zA-Z-]+.htm',text_url):
    			# print(text.find('a')['href'])
    			text_date = datespider(text_url)
    			one_text.append(text.get_text().replace('\xa0','').replace('\n','')) # text.get_text是得到文章的标题
    			if text_date == None:
    				one_text.append(None)
    			else:
    				if int(text_date[:4])>=2014:
    					one_text.append(text_date.replace('\t','').replace('\r','').replace('\n','').replace(' ',''))
    				else:
    					continue
    			All_text.append(one_text)
    		# print(text.find('a')['href'])
    
    	# print(All_text)
    	return All_text
    	# write_excel(All_text)
    	
    
    
    if __name__ =='__main__':
    	pagenext()
    	

     

    展开全文
  • 知网爬虫.ipynb

    2020-09-10 13:51:14
    python 爪巴虫爪巴知网。 selenium 通过模拟鼠标点击,自动实现:选择检索词的类别、输入检索词、选择精确还是模糊查找、逻辑关系、点击检索按钮等一系列动作
  • 中国知网爬虫(CNKI) 批量下载PDF格式的论文

    千次阅读 多人点赞 2020-02-12 18:56:05
    中国知网爬虫 爬取PDF格式的论文 [之前的文章](https://blog.csdn.net/weixin_45352617/article/details/104186490)爬取了知网的查询页面的内容,这篇文章介绍时如何依据之前的内容,获取pdf格式的论文的。 在知网...

    之前的文章爬取了知网的查询页面的内容,这篇文章介绍时如何依据之前的内容,获取pdf格式的论文。
    在知网页面的html中有下载链接,复制到搜索栏,确实是可以下载论文的,只需要获得作者,时间,题目以及下载链接就可以用循环结构批量下载论文。
    当然前提是,您本来就可以下载论文,不管是用VPN还是校园网。
    上次爬取了页面,里面其实已经包含了我们想要的上述信息,下面只需要解析出来即可。我选择的方法是正则搜索,有点笨,但是好在不管是什么信息,只要想搜索,总可以搜索到。

    总的思路:

    首先,获取源码,库:selenium,time ,用webdriver搜索按钮和输入栏,提交等等,遇到验证码手动输入即可,笔者输入了8次验证码,获取6000条论文
    其次,从源码中解析出作者,时间,Title,下载链接,储存到Excel中留存,日后可能有用,用到re,pandas
    再次,利用pandas,读取论文的链接,Title,用requests获取论文,利用open函数储存到pdf格式,在实践中发现,如果直接用解析的链接获取,下载得到的往往是caj格式文件,但是把url中的 ’;' 换为 ’&‘ 就可以正常下载pdf格式的文件了。 用到 re,pandas
    有了总的思路,相信各位也可以自己写出定制的爬虫

    1、得到页面的html,这是解析的前奏

    from selenium import webdriver
    import time
    import pandas as pd
    
    url = r'http://new.gb.oversea.cnki.net/kns/brief/result.aspx?dbprefix=CJFQ' #给出链接
    driver = webdriver.Firefox()
    driver.get(url)
    
    blank_ISSN = driver.find_element_by_id('magazine_value1') 
    #找到输入框。  id是我手动打开html,查看输入框源代码找到的,想提交别的条件一样操作即可
    
    blank_ISSN.send_keys('0577-9154') #输入内容,期刊得SSN号码
    buttom_search = driver.find_element_by_id('btnSearch') #找到搜索按钮
    buttom_search.click() #点击搜索
    
    time.sleep(2) #停一小会儿
    
    driver.switch_to.default_content()  #找到子页面
    driver.switch_to.frame('iframeResult')  #切换到iframe
    
    #选择50个论文在一面显示
    button_50=driver.find_element_by_xpath(r'/html/body/form/table/tbody/tr[1]/td/table/tbody/tr[1]/td/table/tbody/tr/td[2]/div[2]/a[3]')
    button_50.click()
    
    htmls = []  #遍历所有子页面,储存到这个列表
    b = 1      #
    while True:
        try:        
            soup = BeautifulSoup(driver.page_source,'html.parser')
            htmls.append(soup)
            #储存好,点击下一页
            time.sleep(random.randint(3,6))  #暂停一小会儿,这样封IP的概率会小一点,也少输入几次验证码
            button_next = driver.find_element_by_id('Page_next')
            button_next.click()
            
        except  :
            print('Error{}'.format(b))
            time.sleep(60)
            b = b+1
    

    2、上面的操作得到了源码,下面开始解析

    一个tr标签的结构如下,其包含了一篇文章的全部信息:
    在这里插入图片描述

    transfer_list=[]   #存储html源码的中转列表
    for soups in htmls:
        text = str(soups)
        for i in soups.find_all('tr')[7:57]:   #在soup搜索出来的tr标签中,列表头尾都有冗余信息,删掉不要
        	transfer_list.append(i)
    
    len(htmls)  #看一下爬出来多少的html,我的结果是135个html页面
    
    raw_paper_infos = []  #用re匹配的思路是,第一步先缩小范围,第二步,精确搜索并删除多余的字符,下面是第一步
    for i in transfer_list:    #遍历transfer_list中的每一个tr标签,其结构:[[一个tr标签包含的源码],[].……]
        o=[]  #中转列表,储存第一步搜索出来的title,authors,发布时间,下载链接四个大致的匹配结果
        paper = str(i)   #下面正则的表达式,都是我自己试出来的,有更好的方法欢迎留言
        title = re.findall('target="_blank">.*</a>',paper)
        authors = re.findall('target="knet">.*</a>',paper)
        pub_year = re.findall('....-..-..',paper)
        download_url = re.findall('briefDl_D" href=".*pdfdown',paper)  
        quoted_num1 = re.findall('scrollbars=yes.*</span',paper)
        download_num = re.findall('οnclick="SubCountDownLoad.*</a>',paper)  
        o=[title,authors,pub_year,download_url,quoted_num1,download_num]
        raw_paper_infos.append(o)  #初步储存了全部的搜索信息
    
    

    初步搜索出来的结果:

    raw_paper_infos[7]   #结构:[[trs],[],……]
    [['target="_blank">消费行为在个人信用风险识别中的信息含量研究</a>'],
     ['target="knet">王正位</a>; <a class="KnowledgeNetLink" href="/kns/popup/knetsearchNew.aspx?sdb=CJFQ&amp;sfield=%e4%bd%9c%e8%80%85&amp;skey=%e5%91%a8%e4%bb%8e%e6%84%8f&amp;scode=08239051%3b34827180%3b08822321%3b08186170%3b" target="knet">周从意</a>; <a class="KnowledgeNetLink" href="/kns/popup/knetsearchNew.aspx?sdb=CJFQ&amp;sfield=%e4%bd%9c%e8%80%85&amp;skey=%e5%bb%96%e7%90%86&amp;scode=08239051%3b34827180%3b08822321%3b08186170%3b" target="knet">廖理</a>; <a class="KnowledgeNetLink" href="/kns/popup/knetsearchNew.aspx?sdb=CJFQ&amp;sfield=%e4%bd%9c%e8%80%85&amp;skey=%e5%bc%a0%e4%bc%9f%e5%bc%ba&amp;scode=08239051%3b34827180%3b08822321%3b08186170%3b" target="knet">张伟强</a>'],
     ['2020-01-16'],
     ['briefDl_D" href="../download.aspx?filename=4kXaYNFW0VEa4UzTFZXdJVlSvB3cHdXWrU0cKZ0VXllatB3ZaZVeUdESlxEePJHV3clQuVneGNkQSRXSKdHMvklS6Vzbv9WVwQWaENTdXJ0aOpFd4FzUSRGd3okW0Z1dx90SGljM5JVRwczRTdnSVl3Z3ImMrlVM&amp;tablename=CAPJLAST&amp;dflag=pdfdown'],
     [],
     ['οnclick="SubCountDownLoad(0,this)">264</a>']]
    

    接下来继续完成匹配工作:精确匹配和删除多余字符:

    papers = []   #干净的匹配结果存放处
    ilegal_word = ['/','\',''',':','|','?','*']   #考虑到后续下载时,保存文件会有一些非法字符导致文件名生成失败(windows不允许这些字符出现在文件名中)
    for i in raw_paper_infos:
        if not i == [[], [], [], [], [], []]:   #初步搜索时候,会有一些tr标签不是我们的论文标签,不符合初步搜索的要求,其结果就是空列表,过滤掉
            raw_title = i[0][0].strip('target="_blank>~</a>')
            chars = []
            for x in raw_title:
                if not x in ilegal_word:
                    chars.append(x)
            title2 = ''.join(c for c in chars)
            authors2 = ','.join(j for j in re.findall('[\u2E80-\u9FFF]+',str(i[1])))   #在join里面加一个符号就可以用这个符号链接加入进来的各个str了,nice try!
            pub_year2 = i[2][0]
            download_url2 = (i[3][0].strip('briefDl_D" href="..')).replace(';','&')   #按照';'连接就是caj格式的,'&'连接就是pdf格式的
            if i[4] == []:
                quoted_num2 = int(0)
            else:
                quoted_num2 = int(re.findall(r'>.*</a',str(i[4][0]))[0].strip('></a'))
                #被引次数对于发表不久的论文,可能没有这一项,所以对于没有这一项的给0
            
            download_num2 = int(re.findall(r'>.*<',i[5][0])[0].strip('><'))  #论文得下载次数
            papers.append([title2,authors2,pub_year2,download_url2,quoted_num2,download_num2])
    
    #到此为止,我们有了全部的所需要的信息
    #储存到excel,以待候用
    pd.DataFrame(papers).to_excel(root+r'\JJYJ论文信息汇总.xlsx')
    

    上述结果的excel:
    注:和代码部分有一点不一样,笔者自行输入了标题行,并且按照发表日期排序
    在这里插入图片描述
    注意:下载链接不完整,下载时需要在前面加: ’http://new.gb.oversea.cnki.net/kns’

    下面给出下载论文的代码

    import pandas as pd
    import requests,os
    
    content = pd.read_excel(content_JJYJ) 
     #读取excel
    content = content.drop(columns = ['Unnamed: 0','作者','被引次数','下载次数','截止日期:2020-2-6',"要下载论文,链接前接:'http://new.gb.oversea.cnki.net/kns'"]) 
    #只保留title和下载链接,其余删掉
    
    for i in range(len(content['题目'])):   #这是DataFrame中列的访问方式
    	title = content['题目'][i]  #第i篇论文的题目
    	text = requests.get(content['下载链接'][i]) #下载第i个论文
    	with open(root + '\\' + title + '.pdf' ,'wb') as f:  #给出保存地址以及open的模式是wb,写入字节
    		#因为下载的是字节,所以写入字节:wb
    		f.write(text.content)
    		f.close()
    	
    	size = float(os.path.getsize(save_path))
                    kb = size/1024                 #判断是不是下载成功了,小于7字节应该就是没下载到论文而是别的东西
                    if kb<7:
                        os.remove(save_path) #如果是,删除,以备后面重新下载
                        print('封IP了,暂停10min')
                        exceptions.append(paper)
                        time.sleep(300)  #下载失败的原因是封ip了,这时候暂停5-10min比较好
             
    
    

    #下载论文的主体部分就是这些了,后面可以加入try/except结构、跳过已经下载的论文等功能,但是程序主体就是这些,文章已经很长,再长不大好,所以写到这里,更多功能请大家依据需求添加。

    若有不清楚地方,欢迎留言,再修改

    展开全文
  • 首先感谢一下作者Python伊甸园提供的思路:中国知网爬虫,本文也是基于高级检索进行筛选和相关信息的爬取,但在实际操作过程中发现知网的框架有所变化,所以在原代码的基础上进行了一些修改和针对性优化,此篇文章...
  • 在爬取知网论文的关键词时,使用了以下代码: <code class="language-python">for k in soup.find('p', attrs={"class":"keywords"}).find_all('a', target=...
  • python 爬虫简单项目 import requests from bs4 import BeautifulSoup import time from urllib import parse import bs4 search_url = 'https://link.springer.com/search/page/' base_url = '...
  • 中国知网爬虫(转)

    2019-12-12 17:23:18
    https://blog.csdn.net/weixin_42830697/article/details/103181039
  • 记第一次知网爬虫实践

    万次阅读 2016-11-19 21:09:10
    由于工作原因,需要下载大量知网上的统计数据,便学习了用python写爬虫,之后效率提高了n倍,代码如下: # -*- coding: utf-8 -*- import urllib.request from bs4 import BeautifulSoup import requests import ...
  • 新建一个目录文件 开启命令行进入该文件夹下 输入命令: scrapy startproject mySpider 创建的项目目录如下: zhiwang/ scrapy.cfg zhiwang/ __init__.py ...zhiwang/spiders/: 存储爬虫代码目录
  • 3.制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页 4.存储内容 ( pipelines.py ):设计管道存储爬取内容 环境背景:win10,python2.7(一下操作windows与linux无区别) 环境搭建 以下均为命令行指令 ...
  • 关于知网爬虫

    2019-04-29 17:21:13
    关于知网爬虫
  • 知网专利爬虫

    千次阅读 2017-10-11 10:06:32
    知网专利爬虫最近需要爬取知网专利的数据,时间限定为2014年。一番折腾以后,发现知网爬虫非常严重。几经研究,最后还是鼓捣了出来。项目GitHub地址知网专利检索结果列表页反爬虫非常严格,仔细抓包分析以后,发现...
  • 知网 爬虫 selenium webdriver 出于一些需求,需要从知网爬取pdf格式论文以及论文的详细信息,毕竟正文里面不包括下载次数发表时间等等,或者分离出这些信息需要重复工作,所以写了两个爬虫。这里记录论文详细信息...
  • 知网统计年鉴爬虫

    2016-11-19 21:17:17
    知网的统计数据爬虫

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 834
精华内容 333
关键字:

知网爬虫

爬虫 订阅