精华内容
下载资源
问答
  • Python爬取知网论文信息,包含数据爬取、数据分析、数据可视化代码,直接输入关键词即可获取相关数据信息
  • 爬取并解析知网双语例句 if __name__ == "__main__": # 用来获取检索关键字的文本 data_file = r"E:/大四下/数据/例句/知网例句/关键词2.txt" # 英语例句存放的文件 en_save_file = r"E:/大四下/数据/例句/...
  • 使用python爬虫技术爬取知网的标题和摘要信息。使用了多线程,爬取的数据存储在mysql数据库中。
  • 这是一个爬取知网的社科基金项目的代码,用python语言写的,这个代码参考了其他人写的代码。最终能够实现爬取社科基金项目信息的功能,在pycharm3.6下开发,需要替换成你自己的浏览器的cookie。
  • 使用Python爬取知网信息 import requests from urllib import request from lxml import etree import re import csv, time from w3lib.html import remove_tags def write_data(name): #timenow = time.strftime...

    使用Python爬取知网信息

    import requests
    from urllib import request
    from lxml import etree
    import re
    import csv, time
    from w3lib.html import remove_tags
    
    
    def write_data(name):
        #timenow = time.strftime("%Y-%m-%d-%H%M%S", time.localtime())
        file = name
        with open(file, 'a+', encoding='utf-8-sig', newline='') as f:
            writer_f = csv.writer(f)
            writer_f.writerow(['题目','作者','单位','所属期刊','发表时间','下载数','摘要','关键词','专题','分类号'])
        return file
    def get_one(year):
        data = {
            'IsSearch': 'true',
            #CO33_1,_2
            'QueryJson': '{"Platform":"","DBCode":"CJFQ","KuaKuCode":"","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":4,"Items":[],"ChildItems":[]},{"Key":"ControlGroup","Title":"","Logic":1,"Items":[],"ChildItems":[{"Key":".extend-tit-checklist","Title":"","Logic":1,"Items":[{"Key":0,"Title":"SCI","Logic":2,"Name":"SI","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"EI","Logic":2,"Name":"EI","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"北大核心","Logic":2,"Name":"HX","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"CSSCI","Logic":2,"Name":"CSI","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"CSCD","Logic":2,"Name":"CSD","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""}],"ChildItems":[]}]},{"Key":"NaviParam","Title":"","Logic":1,"Items":[{"Key":"navi","Title":"","Logic":1,"Name":"专题子栏目代码","Operate":"=","Value":"C033_8?","ExtendType":13,"ExtendValue":"","Value2":"","BlurType":""}],"ChildItems":[]},{"Key":"MutiGroup","Title":"","Logic":1,"Items":[],"ChildItems":[{"Key":"3","Title":"","Logic":1,"Items":[{"Key":"'+year+'","Title":"'+year+'","Logic":2,"Name":"年","Operate":"","Value":"'+year+'","ExtendType":0,"ExtendValue":"","Value2":"","BlurType":""}],"ChildItems":[]}]}]}}',
            'PageName': 'AdvSearch',
            'DBCode': 'CJFQ',
            # 'KuaKuCodes': '',
            'CurPage': '1'
        }
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70',
            'Referer': 'https://kns.cnki.net/KNS8/AdvSearch?dbcode=CJFQ',
            #'Cookie' : 'Ecp_ClientId=2210720103601729746; Ecp_IpLoginFail=210720106.117.97.127; cnkiUserKey=3c237cd1-59ab-91cb-22ce-bbfc3ad33332; Ecp_ClientIp=106.117.97.127; RsPerPage=20; ASP.NET_SessionId=fkwgrvclzgkpqsagarxa5mdb; SID_kcms=124120; _pk_ref=["","",1626830042,"https://www.cnki.net/"]; _pk_ses=*; SID_kns_new=kns123112; SID_kns8=123122; CurrSortField=发表时间/(发表时间,'TIME')+desc; CurrSortFieldType=desc; _pk_id=2de25f01-dfc6-40ba-888f-beabd2c0efb8.1626748599.8.1626830093.1626830042.'
        }
        url = 'https://kns.cnki.net/KNS8/Brief/GetGridTableHtml'
        response = requests.post(url,headers=headers,data=data).text
        #print(response)
        pattern = re.compile(
            '<div class=\'pages\'> <span class="total">共(.*?)页</span>.*?</div>',
            re.S
        )
        item = re.findall(pattern,response)
        return item[0]
    
    def get_two(year,i,file):
        data = {
            'IsSearch': 'true',
            'QueryJson': '{"Platform":"","DBCode":"CJFQ","KuaKuCode":"","QNode":{"QGroup":[{"Key":"Subject","Title":"","Logic":4,"Items":[],"ChildItems":[]},{"Key":"ControlGroup","Title":"","Logic":1,"Items":[],"ChildItems":[{"Key":".extend-tit-checklist","Title":"","Logic":1,"Items":[{"Key":0,"Title":"SCI","Logic":2,"Name":"SI","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"EI","Logic":2,"Name":"EI","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"北大核心","Logic":2,"Name":"HX","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"CSSCI","Logic":2,"Name":"CSI","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""},{"Key":0,"Title":"CSCD","Logic":2,"Name":"CSD","Operate":"=","Value":"Y","ExtendType":14,"ExtendValue":"","Value2":"","BlurType":""}],"ChildItems":[]}]},{"Key":"NaviParam","Title":"","Logic":1,"Items":[{"Key":"navi","Title":"","Logic":1,"Name":"专题子栏目代码","Operate":"=","Value":"C033_8?","ExtendType":13,"ExtendValue":"","Value2":"","BlurType":""}],"ChildItems":[]},{"Key":"MutiGroup","Title":"","Logic":1,"Items":[],"ChildItems":[{"Key":"3","Title":"","Logic":1,"Items":[{"Key":"'+year+'","Title":"'+year+'","Logic":2,"Name":"年","Operate":"","Value":"'+year+'","ExtendType":0,"ExtendValue":"","Value2":"","BlurType":""}],"ChildItems":[]}]}]}}',
            'PageName': 'AdvSearch',
            'DBCode': 'CJFQ',
            #'KuaKuCodes': '',
            'CurPage': i
        }
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70',
            'Referer': 'https://kns.cnki.net/KNS8/AdvSearch?dbcode=CJFQ',
            # 'Cookie' : ''
        }
        url = 'https://kns.cnki.net/KNS8/Brief/GetGridTableHtml'
    
        response = requests.post(url, headers=headers, data=data).text
        #print(response)
        pattern = re.compile(
            '<tr.*?<td class="name">.*?<a class="fz14" href=.*?&DbCode=(.*?)&dbname=(.*?)&filename=(.*?)&urlid.*?>.*?</a>.*?</td>.*?<td class="source">(.*?)</td>.*?<td class="date">(.*?)</td>.*?<td class="download">(.*?)</td>.*?</tr>',
            re.S
        )
        items = re.findall(pattern,response)
        for item in items:
            key_words = ' '
            dbcode= item[0]
            dbname = item[1]
            filename = item[2]
            periodical = remove_tags(item[3]).strip() # 所属期刊
            date = str(item[4]).strip()  #发表日期
            download = remove_tags(item[5]).strip()  #下载数量
            if len(download) == 0 :
                download = 0
            #print(date,download)
            url_2 = 'https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=' + dbcode + '&dbname=' + dbname + '&filename=' + filename
            print(url_2)
            # print(subject)
            response_2 = requests.get(url_2)
            text = response_2.content.decode('utf-8')
            pattern_2 = re.compile(
                '<div class="brief">.*?<div class="wx-tit">.*?<h1>(.*?)</h1>.*?<h3.*?>(.*?)</h3>.*?<h3.*?>(.*?)</h3>.*?</div>.*?</div>',
                re.S
            )
            items_2 = re.findall(pattern_2, text)
            for item_2 in items_2:
                subject = remove_tags(item_2[0])  #题目
                author = remove_tags(item_2[1].replace('</span>','|')).replace('1','').replace('2','').replace('3','').replace('4','').replace('5','').replace('6','').replace('7','').replace('8','').replace('','').replace(",",'')
                print(author)
                company = remove_tags(item_2[2].replace('</span>','|')).replace('&nbsp;','').replace('1. ','').replace('2. ','|').replace('3. ','|').replace('4. ','|').replace('5. ','|').replace('6. ','|')#单位
            pattern_3 = re.compile(
                '<div class="row"><span class="rowtit">.*?class="abstract-text">(.*?)</span>.*?</script>',
                re.S
            )
            items_3 = re.findall(pattern_3,text)
            if len(items_3)==0:
                abstract = ' '
            else:
                abstract = items_3[0].replace('&lt;正&gt;','')
    
            html = etree.HTML(text)
            kkk = html.xpath("//p[@class='keywords']")  #关键词
            ggg = html.xpath("//div[@class='row']/ul/li")
            if len(ggg) == 0:
                classification_Number = ' '
                special = ' '
            else:
                classification_Number = str(ggg[-1].xpath("./p/text()")).replace('\'','').replace('[','').replace(']','').replace(';',' ')#分类号
                special = str(ggg[-2].xpath("./p/text()")).replace('\'','').replace('[','').replace(']','').replace(';',' ') #专题
            if len(kkk) == 0:
                with open(file, 'a+', encoding='utf-8-sig', newline='') as f:
                    writer = csv.writer(f)
                    writer.writerow([subject,author,company,periodical,date,download,abstract,key_words,special,classification_Number])
            else:
                key_words = str(kkk[0].xpath("./a/text()"))
                key_words = key_words.replace(' ','').replace('\'','').replace(';','').replace('[','').replace(']','').replace('\\','').replace('rn','').replace(',',' ')
                with open(file, 'a+', encoding='utf-8-sig', newline='') as f:
                    writer = csv.writer(f)
                    writer.writerow([subject,author,company,periodical,date,download,abstract,key_words,special,classification_Number])
    name = '铁路运输管理工程.csv'
    file = write_data(name)
    for year in range(1998,2022):
        year=str(year)
        number = int(get_one(year))
        for i in range(1,number+1):
            get_two(year,i,file)
        time.sleep(1)
    print('下载完成')
    # year = '2021' 8051
    # file = write_data(year)
    # number = get_one(year)
    # number = int(number)
    # for i in range(number):
    #     get_two(i,file)
    #     time.sleep(1)
    # print('下载完成')
    
    
    #改进:1.按年份自动搜索
    #     2.年份进入之后自动统计总页数 然后按页数进行爬取
    
    
    
    
    
    展开全文
  • Python爬虫——爬取知网论文数据(二)

    千次阅读 多人点赞 2021-03-27 18:38:39
    接上一篇,Python爬虫——爬取知网论文数据(一) 上一篇谈到了如何爬取知网的论文标题和论文作者,这一篇讲一下如何爬取多页,以及如何爬取作者的详细信息。 1. 换页 同样的,我们在搜索结果页按下F12查看网页源...

    接上一篇,Python爬虫——爬取知网论文数据(一)

    上一篇谈到了如何爬取知网的论文标题和论文作者,这一篇讲一下如何爬取多页,以及如何爬取作者的详细信息。

    1. 换页

    同样的,我们在搜索结果页按下F12查看网页源代码,将光标定位到翻页按钮上;
    在这里插入图片描述
    可以看到每一页对应一个a标签,我们复制出这些a标签的选择器来看一下:

    #page2	#第二页的selector
    #page3	#第三页的selector
    #page4	#第四页的selector
    

    很显然,他们的selector只变了后面的数字,这个数字就是页数。根据这个规律就可以写出一个换页的函数:

    # pn表示当前要爬的页数
    def change_page(driver, pn):
        driver.find_element_by_css_selector('#page' + str(pn)).click()
        time.sleep(5)
        content = driver.page_source.encode('utf-8')
        soup = BeautifulSoup(content, 'lxml')
        return soup
    

    每次爬取完一页之后就可以调用这个函数切换到下一页,再次爬取下一页的内容。

    2. 爬取作者详细信息
    首先我们点进某个作者的页面,到地址栏查看url
    在这里插入图片描述
    上图的url为:
    在这里插入图片描述

    再点进另一个作者页看一下,其url为:在这里插入图片描述

    对比两者可以发现他们的skey、code和v这三个参数不同,由此可知这三个参数影响着你访问的页面内容,其中skey就是当前的作者名。

    我们回到搜索结果页,同样F12查看源代码,将光标定位到某个作者名上:
    在这里插入图片描述
    从上图中可以看到,href属性的scode和acode就是上述我们需要的code参数,可是这个v参数是什么呢,这里也没有给出,我们先将skey和code这两个参数替换到url中试一下,如找到作者陈恒
    在这里插入图片描述
    从中拿出skey=陈恒,code=29972400,放入刚才的url中。
    在这里插入图片描述

    可以看到,我们成功访问到了陈恒这个作者的详细信息。那么接下来我们就可以取出每一个作者的名字和a标签href属性的scode值,来作为url的skey和code参数。
    代码如下:

    # 获取作者详情页url的skey和code, 传入参数是一个a标签
    def get_skey_code(a):
        skey = a.get_text().strip()
        href = str(a.get('href'))    # 拿到a标签href的值
        code = href[href.find('acode') + 6:]    # 拿到code的值
        return skey, code
    

    上述代码中传入的a标签在上一篇Python爬虫——爬取知网论文数据(一)中有讲,就是包含作者名的a标签。

    现在我们拿到了访问作者详情页的url,要获取作者的信息就很方便了,以陈恒作者为例,在详情页按下F12:
    在这里插入图片描述
    可以看到作者的大学和专业分别对应了第一个和第二个H3标签,获取到这两个标签,并拿出里面的文本信息即可:

    h3 = soup.find_all('h3')	# 拿到所有h3元素
    college = h3[0].get_text().strip()	# 第一个h3里是大学
    major =  h3[1].get_text().strip()	# 第二个h3里是专业
    

    这样我们就拿到了作者的大学和专业信息。如果想获取更多别的信息,可以照着这个方法获取其他元素。

    至此,重点部分就结束了,下面贴一下我最后的代码,做了一些封装和一些空值处理,并将爬取到的数据存入了csv文件。

    '''
        知网论文数据爬取
    '''
    
    from bs4 import BeautifulSoup
    from selenium import webdriver
    import time
    import requests
    import csv
    
    
    # 定义论文类
    class Paper:
        def __init__(self, title, authors):
            self.title = title
            self.authors = authors
    
    # 定义作者类
    class Author:
        def __init__(self,name, college, major):
            self.name = name
            self.college = college
            self.major = major
    
    
    # 进入知网首页并搜索关键词
    def driver_open(driver, key_word):
        url = "https://www.cnki.net/"
        driver.get(url)
        time.sleep(2)
        driver.find_element_by_css_selector('#txt_SearchText').send_keys(key_word)
        time.sleep(2)
        # 点击搜索按钮
        driver.find_element_by_css_selector('body > div.wrapper.section1 > div.searchmain > div > div.input-box > input.search-btn').click()
        time.sleep(5)
        content = driver.page_source.encode('utf-8')
        # driver.close()
        soup = BeautifulSoup(content, 'lxml')
        return soup
    
    def spider(driver, soup, papers):
        tbody = soup.find_all('tbody')
        tbody = BeautifulSoup(str(tbody[0]), 'lxml')
        tr = tbody.find_all('tr')
        for item in tr:
            tr_bf = BeautifulSoup(str(item), 'lxml')
    
            td_name = tr_bf.find_all('td', class_ = 'name')
            td_name_bf = BeautifulSoup(str(td_name[0]), 'lxml')
            a_name = td_name_bf.find_all('a')
            # get_text()是获取标签中的所有文本,包含其子标签中的文本
            title = a_name[0].get_text().strip()
            print("title : " + title)
    
    
            td_author = tr_bf.find_all('td', class_ = 'author')
            td_author_bf = BeautifulSoup(str(td_author), 'lxml')
            a_author = td_author_bf.find_all('a')
            authors = []
            # 拿到每一个a标签里的作者名
            for author in a_author:
                skey, code = get_skey_code(author)  # 获取作者详情页url的skey和code
                name = author.get_text().strip()    # 获取学者的名字
                print('name : ' + name)
                college, major = get_author_info(skey, code)  # 在作者详情页获取大学和专业, major是一个数组
                au = Author(name, college, major)   # 创建一个学者对象
                authors.append(au)
    
            print('\n')
            paper = Paper(title, authors)
            papers.append(paper)
            time.sleep(1)   # 每调一次spider休息1s
    
    
    # pn表示当前要爬的页数
    def change_page(driver, pn):
        driver.find_element_by_css_selector('#page' + str(pn)).click()
        time.sleep(5)
        content = driver.page_source.encode('utf-8')
        soup = BeautifulSoup(content, 'lxml')
        return soup
    
    # 获取作者详情页url的skey和code, 传入参数是一个a标签
    def get_skey_code(a):
        skey = a.get_text().strip()
        href = str(a.get('href'))    # 拿到a标签href的值
        code = href[href.find('acode') + 6:]    # 拿到code的值
        return skey, code
    
    # 获取作者的详细信息
    def get_author_info(skey, code):
        url = 'https://kns.cnki.net/kcms/detail/knetsearch.aspx?dbcode=CAPJ&sfield=au&skey=' + skey + '&code=' + code + '&v=3lODiQyLcHhoPt6DbD%25mmd2FCU9dfuB5GXx8ZJ7nSrKZfD6N9B5gKP9Ftj%25mmd2B1IWA1HQuWP'
        header = {
            'user-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.133 Safari/569.36',
            'Connection': 'close'
        }
        requests.packages.urllib3.disable_warnings()
        rsp = requests.get(url, headers = header, verify = False)
        rsp_bf = BeautifulSoup(rsp.text, 'lxml')
        div = rsp_bf.find_all('div', class_ = 'wrapper')
        # 有的学者查不到详细信息
        if div:
            div_bf = BeautifulSoup(str(div[0]), 'lxml')
            h3 = div_bf.find_all('h3')
            college = h3[0].get_text().strip()
            major = h3[1].get_text().strip()
            # major = major.split(';')[0: -1]
            print('college:' + college)
            print('major: ' + major)
            return college, major
        print("无详细信息")
        return None, None
    
    if __name__ == '__main__':
        driver = webdriver.Chrome("D:/Software/chorme/chromedriver.exe")
        soup = driver_open(driver, '知识图谱')  # 搜索知识图谱
        papers = []     # 用于保存爬取到的论文
        # 将爬取到的论文数据放入papers中
        spider(driver, soup, papers)
        for pn in range(2, 31):
            content = change_page(driver, pn)
            spider(driver, content, papers)
        driver.close()
    
    
        # 写入文件
        f_papers_authors = open('./paper_author.csv', 'w', encoding = 'utf-8', newline = '')
        writer_p_a = csv.writer(f_papers_authors)  # 基于文件对象构建 csv写入对象
        writer_p_a.writerow(["name", "college", "major", "paper"])    # csv文件的表头
        
        # 读取每一篇论文
        for paper in papers:
            # 写入paper_author.csv文件
            for author in paper.authors:
                if author.name:
                    # print(author + "  ")
                    writer_p_a.writerow([author.name, author.college, author.major, paper.title])
    
        # 关闭文件
        f_papers_authors.close()
    

    我爬到的数据:
    在这里插入图片描述

    展开全文
  • python爬虫爬取知网

    千次阅读 多人点赞 2020-08-24 00:11:01
    python爬虫爬取知网 话不多说,直接上代码! import requests import re import time import xlrd from xlrd import open_workbook from xlutils.copy import copy class BeautifulPicture(): def get_pic(self):...

    python爬虫爬取知网

    话不多说,直接上代码!

    import requests 
    import re
    import time
    import xlrd
    from xlrd import open_workbook
    from xlutils.copy import copy
    
    class BeautifulPicture():
        def get_pic(self):
            data = xlrd.open_workbook(r'C:\\flim\library_my\new.xls')  # 打开xls文件,自己新建这个文件在运行路径,不然不行的哦
            table = data.sheets()[0]  # 打开第一张表
            table2 = data.sheets()[1]  # 打开第一张表
            i = table.nrows #上一次爬到的表1的行数
            i1 = 0
            i2 = table2.nrows #上一次爬到的表2的行数
            told = 0
            rb = open_workbook(r'C:\\flim\library_my\new.xls','utf-8')
            wb = copy(rb) # 将上一次爬到的复制到新表里,并在新表里继续添加纪录
            # 通过get_sheet()获取的sheet有write()方法
            ws = wb.get_sheet(0)
            ws1 = wb.get_sheet(1)
            p = 1  # 这里是页数
            for num in range(p, p + 100):
                # 这里的num是页码
                web_url ='http://kns.cnki.net/kns/brief/brief.aspx?curpage=%s&Reco' \
                         'rdsPerPage=50&QueryID=8&ID=&turnpage=1&tpagemode=L&dbPref' \
                         'ix=SCDB&Fields=&DisplayMode=listmode&PageName=ASP.brief_' \
                         'default_result_aspx#J_ORDER&' % num #这里的URL实现了二次加载
                print('搜素页的URL=',web_url)
                # 这里开始是时间控制
                t = int(time.clock())
                print(t / 60, '分钟')
                useTime = t - told
                # 如果一个周期的时间使用太短,则等待一段时间
                # 主要用于防止被禁
                if (useTime < 120 and useTime > 10):
                    print("useTime=%s" % useTime)
                    whiteTime = 120 - useTime
                    print("等待%s秒" % whiteTime)
                    time.sleep(whiteTime)
                told = int(time.clock())
                print(t)
                print('开始网页get请求')
                r = self.request(web_url)
                # 这里是报错的解释,能知道到底是因为什么不能继续爬了
                # 一开始会看爬到的源代码,但是之后正式开始爬的时候,打印页面源代码会拉低爬虫效率
                yan = re.search(r'参数错误', r.text)
                if yan != None:
                    print("参数")
                    break
                yan = re.search(r'验证码', r.text)
                if yan != None:
                    print("验证")
                    break
                #这里开始抓列表里每一个文献的url
                soup = re.findall(r'<TR([.$\s\S]*?)</TR>', r.text)
                #print(soup)#测试打印
                for a in soup:
                    print("-", i1)
                    #print(a)#测试代码
                    i1 += 1
                    name = re.search(r'_blank.*<', a)
                    #print('初次取的=',name)#测试代码
                    name = name.group()[8:-1]
                    #print('第二次=',name)#测试代码
                    name = re.sub(r'<font class=Mark>', '', name)
                    #print('第三次=', name)  # 测试代码
                    name = re.sub(r'</font>', '', name)
                    #print('第四次=', name)  # 测试代码
                    url = re.search(r'href=.*? ', a)#将’‘看做一个子表达式,惰性匹配一次就可以了
                    url = url.group()
                    #print('爬取的详情页的URL=',url)#测试代码
                    # 将爬来的相对地址,补充为绝对地址
                    url = "http://kns.cnki.net/KCMS/" + url[11:-2]#数字是自己数的。。。
                    #print("url:%s" % url) # 这里是写代码时测试留下的print记录
                    #下面是参考文献详情的URL
                    FN = re.search(r'FileName.*?&', url)#.group()#出现错误 没有匹配!!!
                    if FN !=None:#测试代码
                        FN = re.search(r'FileName.*?&', url).group()
                    #print(FN)#测试代码
                    DN = re.search(r'DbName.*?&', url)#.group()
                    if DN !=None:#测试代码
                        DN=re.search(r'DbName.*?&', url).group()
                    #print(DN) #测试代码
                    DC = re.search(r'DbCode.*?&', url).group()
                    DUrl = "http://kns.cnki.net/KCMS/detail/frame/list.aspx?%s%s%sRefType=1" % (FN, DN, DC)
                    #print('DUrl=',DUrl)#测试代码
                    # 这里打开文献详情页
                    R = self.request(DUrl)
                    #如果没有参考文献,则认为是劣质文献,不爬,转爬下一篇
                    isR = re.search(r'参考文献', R.text)
                    if i1 == 1:
                        print("没有参考文献的文章:%s" % name)
                    if isR == None:
                        continue
                    # 详情页
                    print(i)
                    print("文章名字:%s" % name)
                    d = self.request(url).text
                    #print('d=',d)#测试代码
                    # 这里是文献摘要,
                    summary = re.search(r'(?<=name="ChDivSummary">).+?(?=</span>)', d)
                    summary=summary.group()
                    #print('摘要=',summary)
                    type = re.search(r'"\).html\(".*?"', d)
                    type = type.group()[9:-1]
                    ins = re.search(r'TurnPageToKnet\(\'in\',\'.*?\'', d)
                    if ins == None:
                        continue
                    ins = ins.group()[21:-1]
                    wt = re.findall(r'TurnPageToKnet\(\'au\',\'.*?\'', d)
                    writer = ""
                    for w in wt:
                        writer = writer + "," + w[21:-1]
                    writer = writer[1:]
                    ws.write(i, 0, name)    #文献名
                    ws.write(i, 1, writer)  #作者名
                    ws.write(i, 2, type)    #文献类别
                    ws.write(i, 15, num)    #列表的页码
                    ws.write(i, 3, summary)  # 摘要
                    ws.write(i, 16, time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) #记录的时间
                    # 这里是文献的关键词,最多可以记录8个关键词
                    kw = re.findall(r'TurnPageToKnet\(\'kw\',\'.*?\'', d)
                    tnum = 0
                    for tkw in kw:
                        tnum += 1
                        tkw = tkw[21:-1]
                        if tnum > 8:
                            break
                        ws.write(i, 3 + tnum, tkw)
                     # 这里是文献的来源基金
                    fund = re.search(r'TurnPageToKnet\(\'fu\',\'.*?\'', d)
                    if fund != None:
                        fund = fund.group()[21:-1]
                        ws.write(i, 11, fund)
                    # 分类号
                    cn = re.search(r'ZTCLS.*?</p', d)
                    if cn != None:
                        cn = cn.group()[19:-3]
                        ws.write(i, 12, cn)
                    # 这是机构
                    jg = re.search(r'TurnPageToKnet\(\'in\',\'.*?\'', d)
                    if jg != None:
                        jg = jg.group()[21:-1]
                        #print(jg)
                        ws.write(i, 17, jg)
                    # 是否为核心期刊
                    sourinfo = re.search(r'sourinfo([.$\s\S]*?)</div', d)
                    if sourinfo != None:
                        sourinfo = sourinfo.group()
                        # print(sourinfo)
                        from_ = re.search(r'title.*</a', sourinfo).group()
                        from_ = re.sub(r'title">.*?>', '', from_)
                        from_ = re.sub(r'</a', '', from_)
                        ws.write(i, 13, from_)
                        core = re.search(r'中文核心期刊', sourinfo)
                        if core != None:
                            print(core.group())
                            ws.write(i, 14, "中文核心期刊")
                     # ws.write(i, 0, a)
                    i += 1 # 增加页码的计数
            wb.save('new.xls') # 保存表格*******有改变 有问题
    
        def request(self, url):  # 返回网页的response
            # print(url)
            # 这里是伪造浏览器信息,和伪造来源
            user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Ch' \
                         'rome/58.0.3029.81 Safari/537.36'
            referer = "http://kns.cnki.net/kns/brief/result.aspx"
            # 这里是伪造cookie,你要从浏览器里复制出来,粘贴在这里
            # 可以把里面的时间不断更新,这样能爬久一点
            cookie = 'cnkiUserKey=e0b40271-cdc0-fd83-36fa-9d4c5f8f2a86; RsPerPage=5' \
                     '0; KNS_DisplayModel=custommode@CJFQ; UM_distinctid=161275ba757a' \
                     '16-0ed232d4ab2da2-6010107f-15f900-161275ba75895e; Ecp_Cli' \
                     'entId=3170915092701569567; ASP.NET_SessionId=3dnqvlsxovsla4' \
                     'ywvr2ykp4c; SID_kns=123106; SID_crrs=125131; SID_klogin=12514' \
                     '3; SID_krsnew=125132; SID_kcms=124113; SID_knsdelivery=125124;' \
                     ' CNZZDATA3258975=cnzz_eid%3D995934993-1516843818-http%253A%252' \
                     'F%252Fkns.cnki.net%252F%26ntime%3D1517383256; Ecp_session=1; ' \
                     'c_m_LinID=LinID=WEEvREcwSlJHSldRa1FhdkJkVWI2VUJNODFzUHlUaC9LN' \
                     'XZrUDkrcXhYbz0=$9A4hF_YAuvQ5obgVAqNKPCYcEjKensW4ggI8Fm4gTkoU' \
                     'KaID8j8gFw!!&ot=02/01/2018 18:13:09; LID=WEEvREcwSlJHSldRa1F' \
                     'hdkJkVWI2VUJNODFzUHlUaC9LNXZrUDkrcXhYbz0=$9A4hF_YAuvQ5obgVAqN' \
                     'KPCYcEjKensW4ggI8Fm4gTkoUKaID8j8gFw!!; c_m_expire=2018-02-01 ' \
                     '18:13:09; Ecp_LoginStuts=%7B%22IsAutoLogin%22%3Afalse%2C%22U' \
                     'serName%22%3A%22KT1008%22%2C%22ShowName%22%3A%22%25E8%25A5%2' \
                     '5BF%25E5%258D%2597%25E7%259F%25B3%25E6%25B2%25B9%25E5%25A4%' \
                     '25A7%25E5%25AD%25A6%22%2C%22UserType%22%3A%22bk%22%2C%22r%2' \
                     '2%3A%22RrMW7A%22%7D'
            headers = {'User-Agent': user_agent,
                       "Referer": referer,
                       "cookie": cookie}
            r = requests.get(url, headers=headers, timeout=30)
            return r
    
    print(time.clock())
    beauty = BeautifulPicture()  # 创建类的实例
    beauty.get_pic()  # 执行类中的方法
    
    展开全文
  • 一、selenium简介 据官网...下面是一小段代码爬取知网的示例(www.cnki.com.cn) import time from selenium import webdriver # 1: 创建webdriver驱动: driver = webdriver.Chrome() # 2: 发送url请求 driver.get('...

    一、selenium简介
    据官网介绍,Selenium 直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中运行。
    selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。使用Selenium通过编写模仿用户操作的测试脚本,可以从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。Selenium 的核心,也称browser bot,是用 JavaScript 编写的。这使得测试脚本可以在受支持的浏览器中运行。browser bot 负责执行从测试脚本接收到的命令,测试脚本要么是用 HTML 的表布局编写的,要么是使用一种受支持的编程语言编写的。

    二、driver对象的常用属性和方法:

    1:获取网页渲染后的源代码: driver.page_source()
    2:获取当前网页的url : driver.current_url()
    3:关闭当前网页:driver.close()
    4:退出浏览器:driver.quit()
    5:页面向前:dirver.forword()
    6:页面向后:driver.back()
    7:页面截图:driver.screen_shot(img_name)

    三、driver对象获取标签元素的方法:

    1:find_element_by_id (返回一个元素)
    2:find_element(s)_by_class_name (根据类名获取元素列表)
    3:find_element(s)_by_name (根据标签的name属性值返回包含标签对象元素的列表)
    4:find_element(s)_by_xpath (返回一个包含元素的列表)
    5:find_element(s)_by_link_text (根据连接文本获取元素列表)
    6:find_element(s)_by_partial_link_text (根据链接包含的文本获取元素列表)
    7:find_element(s)_by_tag_name (根据标签名获取元素列表)
    8:find_element(s)_by_css_selector (根据css选择器来获取元素列表)

    四、代码示例
    首先通过浏览器驱动打开所需的链接;然后,根据自己的需求获取网页的信息,selenium-python提供了多种方式,包括根据id、name、classname等方式,另外还有根据xpath获取的方式,可以根据需求使用不同的方式获取网页信息。下面是一小段代码爬取知网的示例(www.cnki.com.cn)

    import time
    from selenium import webdriver
    
    # 1: 创建webdriver驱动:
    driver = webdriver.Chrome()
    # 2: 发送url请求
    driver.get('http://search.cnki.com.cn/Search/Result?content=%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98')
    # 3: 操作页面:
    
    page = 20
    url_list = []
    for i in range(3):
        driver.find_element_by_xpath('//*[@id="PageContent"]/div[1]/div[2]/div[13]/a[11]').click()
        # xpath定位
        # driver.find_elements_by_xpath和 driver.find_element_by_xpath的区别:
        # elements爬取符合条件的所有数据并返回列表,找不到返回空列表
        # element爬取符合条件的一条数据,如果找不到报错
        content = driver.find_elements_by_xpath('//*[@id="article_result"]/div/div/p[1]/a[1]')
        # 循环列表 取出每个selenium对象
        for item in content:
            # 取出标题的href链接并打印
            print(item)
            # print(item.text)
            url_list.append(item.get_attribute('href'))
        time.sleep(2)
    
    driver.quit()
    print(url_list)
    
    # //*[@id="article_result"]/div/div[1]/p[1]/a[1]
    # //*[@id="article_result"]/div/div[2]/p[1]/a[1]
    
    
    展开全文
  • python爬虫知网实例-python爬取知网

    千次阅读 2020-10-30 22:55:57
    https:github.comgnemougdistribute_crawlercnkispider- 中国知网爬虫。 设置检索条件后,执行srccnkispider.py抓取数据,抓取数据存储在data目录下...如果整站爬全部文本和图片作为离线查询,大概需要10g空间、2...
  • Python爬虫——爬取知网论文数据(一)

    千次阅读 多人点赞 2021-03-24 16:32:16
    目的:爬取毕设所需的数据源,包括论文标题、论文作者以及作者的详细信息。 所需第三方库: Requests库 Selenium库 BeautifulSoup库 首先,我们打开知网首页:https://www.cnki.net/ 我们必须先输入关键词,再...
  • 前期回顾:Selenium爬取知网论文 目录一、参数解释二、全部代码 一、参数解释 二、全部代码
  • Python3爬取知网文章

    千次阅读 2019-10-29 14:15:02
    Python3使用Requests爬取知网文章``
  • ") self.driver.get(url) print("全局等待时间设置为3秒") self.driver.implicitly_wait(3) print("窗口最大化") self.driver.maximize_window() def crawl_main(self): """ 爬取主要信息:姓名,学校,专业,总发文...
  • java+selenium爬取知网数据

    千次阅读 2019-07-18 21:29:38
    使用selenium工具爬取知网相关数据,思路:根据几个关键词搜索出相关的内容,然后爬取列表中所有论文的访问链接。 注意:直接爬取的链接是不能用的,需要自己拼接一下。具体看代码。新手,代码写的有点乱。勿喷。...
  • Python爬虫:用selenium爬取知网文献基本信息

    千次阅读 多人点赞 2020-07-14 10:21:57
    爬取手机版知网文献,生成信息汇总,保存至Excel
  • 由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口搜索出来的结果和知网上的结果几乎一样在这个基础上,我简单看了些网页的...
  • 爬取知网文献信息

    千次阅读 热门讨论 2020-05-31 11:53:26
    有好一段时间没有记录自己的菜鸟之路了,前天接了个小单,爬取知网的文献信息,接下来记录一下我的学习经验。 要通过搜索文献的方式来爬取标题、被引数、下载数、发表时间、作者,限定爬取某个时间段的文章信息。...
  • 由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口搜索出来的结果和知网上的结果几乎一样在这个基础上,我简单看了些网页的...
  • # -*- coding: utf-8 -*- import time import re import random import ...url) print("开始爬取") get_data(url_list, wordType) print("一种类型爬取完毕") print("全部爬取完毕") finally: connection.close()
  • python爬取知网论文信息

    千次阅读 2019-01-02 18:15:17
    用Python爬取指望关于某个主题的所有论文摘要等信息。...爬取知网统计数据,并下载文献 然后学了一些关于正则匹配的(入门篇和中级篇) 正则匹配入门篇 我感觉把正则匹配学一些,然后稍微能看得懂一点的网页源码...
  • python3-爬虫爬取知网文献摘要

    千次阅读 2020-01-11 10:40:08
    python爬虫批量爬取知网文献摘要 爬虫需要的库 requests(给服务器发送请求接收目标内容) bs4中的BeautifulSoup(解析内容,缩小目标数据查找范围) re(准确获取目标数据) 分析网页 爬取的目标内容:文献...
  • 爬取知网数据遇到图片验证码的解决方法 详细描述以及思路: 1:使用selenium爬取知网数据过程中,刚开始是采用线程休眠的方法来骗,但是后来发现,这个方法没法解决页数超过一百多的问题。后来就转战想要解决图片...
  • # -*- coding: utf-8 -*- ...2、我是利用selenium自动化测试工具进行爬取的,所以要再安装Selenium库,pip install selenium 3、ChromeDriver环境配置,先知道安装的Chrome浏览器的版本号,然后去https...
  • #请求知网 #html = getURL(url) soup = BeautifulSoup ( getURL ( url ) , 'html.parser' ) #print(soup) soup2 = soup.find ( 'div' , class_ = 'wxBaseinfo' ) .find_all ( 'p' ) [ 0 ] title =...
  • python爬取知网

    万次阅读 2017-12-27 13:40:27
    最近在练习写爬虫的时候,真巧同学的女朋友有需求,大概是爬取知网内的几千个主题的数据,每一个主题的条数记录有几条的到几千条的不等,总来的来说也算是个上万数量级的爬虫了,分析了下知网,发现使用专业检索,...
  • python爬虫——使用selenium爬取知网文献相关信息

    万次阅读 多人点赞 2019-04-11 22:58:11
    2. 知网的反爬虫手段很强,反正我爬取pc端的时候,用selenium爬取获取不到源代码,真是气人,后来换成手机端就可以获取了,爬取手机端的操作如下。 3. 首先进入知网后,选择开发工具,建议放在右边,之后再点击图中...
  • 使用Scrapy、PhantomJS和Selenium爬取知网文献摘要。以下例子用于爬取“医药卫生科技”类文献摘要。 1.使用Scrapy创建项目 scrapy startproject cnki 2.进入cnki文件夹创建HtmlFilter.py用于除去标签 具体实现请...
  • 本章爬虫主要参考 https://github.com/dgyy/CNKI-download大佬的github源码,但由于知网页面有些改动,再加上有些新增的需求,所以对代码有些许的改进,我自己改进的代码地址:... 1、首先没有安装pycharm的同伙们需要...

空空如也

空空如也

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

爬取知网

友情链接: OCMO12864-4(例程).zip