面向CCF目录中的论文暴力爬取实现

面向CCF目录中期刊论文暴力爬取实现

此篇是 震惊!原来查找论文这么简单?再也不用担心组会不知道汇报啥了!计算机硕士新生人手必备不可不看 的实现说明,具体说明了期刊论文的获取部分。
另有一篇高阶爬虫是爬取会议论文的说明:
面向CCF目录中期刊论文暴力爬取实现(二)会议部分高阶版
此爬虫总共三篇,一篇结果说明,一篇期刊爬取,一篇会议爬取。此博客为三篇中的期刊爬取部分

第一章、数据对象说明

CCF:中国计算机学会 给出的推荐目录

从 CCF 推荐的目录里获取到对应网址
中国计算机学会推荐国际学术会议和期刊目录
在这里插入图片描述
关键字段:
期刊:http://dblp.uni-trier.de/db/journals ;会议:http://dblp.uni-trier.de/db/conf

DBLP数据库:没有任何反爬机制的计算机在线论文数据库

对应介绍:
The dblp computer science bibliography provides open bibliographic information on major computer science journals and proceedings. Originally created at the University of Trier in 1993, dblp is now operated and further developed by Schloss Dagstuhl. For more information check out our F.A.Q.

从CCF中得到的网址 前缀为 https://dblp.uni-trier.de/就可以直接从这个数据库里获取资源了

第二章、爬虫代码实现

看过我之前博客的小伙伴大概知道,我也是刚开始接触爬虫,所以只会简单的 requests + re 正则表达,但是这次爬这个数据库,我发现 requests 和正则还是太低级了,我是先爬期刊再爬会议,大家可以从代码中看出 优化的过程

第一步、数据获取并写入表格

参考博客 震惊!原来查找论文这么简单?再也不用担心组会不知道汇报啥了!计算机硕士新生人手必备不可不看
在第二章的第一步中我们就将CCF的推荐目录:pdf文件转为了一定规格的txt文件:
'中国计算机学会推荐国际学术会议和期刊目录-2019/03、处理后-中国计算机学会推荐国际学术会议和期刊目录-2019-去引号.txt', 对应的内容可见: 第二章、思路——基于爬虫结合关键字过滤暴力获取所需论文信息->第一步:从CCF推荐目录中获取网址-> #### 02、数据预处理
大致格式为

大类\n
A类\n
序号\t刊物简称\t刊物全称\t出版社\t网址\n \\这里我最后全删了,懒得加判断
1\tTOCS\tACM\tTransactions on Computer Systems\tACM\thttps://dblp.uni-trier.de/db/journals/tocs/\n

通过读取txt文件数据然后按一定格式写入表格完成
运行第一个python文件:GetJourInfo.py

具体代码
# 此时仍采用简单的requests 和 re
# GetJourInfo.py
import requests
import re
'''
# 该py文件用于将期刊信息进行规格化,通过整理好的txt文件来获取期刊信息和类比,并添加
# 期刊对应的ISSN号用于期刊分区
'''
# 获取期刊对应的ISSN
## 这里是爬虫的部分,注意这里我是爬取对应网页的ISSN部分。不同的是我写成了函数:GetJournISSN()
## 返回的是爬取的ISSN和一些其他数据
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27',
    'Connection': 'close'
}
def GetJournISSN(url):
    getUrl = requests.get(url=url, headers=headers,timeout=10)
    getUrl.encoding='utf-8'
    JournalInfopatren = '<div class="hide-body"><ul><li><em>.*?</em> <a href=".*?">(.*?)</a>'
    getUrl.close()
    return re.compile(JournalInfopatren, re.S).findall(getUrl.text)

'''
文件处理
'''
from openpyxl import load_workbook
with open('中国计算机学会推荐国际学术会议和期刊目录-2019/03、处理后-中国计算机学会推荐国际学术会议和期刊目录-2019-去引号.txt','r',encoding='utf-8') as file:
    getJournal = file.readlines();

# 分表说明
## 这里是为了把数据按期刊和会议的方式分开存表
wb = load_workbook('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
sheets = wb.worksheets
Journal = sheets[0]
Meet = sheets[1]
if '期刊信息' in wb.sheetnames:
    print('期刊信息 已存在')
    NewSheets1 = wb['期刊信息']
else:
    NewSheets1 = wb.create_sheet('期刊信息')

if '会议信息' in wb.sheetnames:
    print('会议信息 已存在')
    NewSheets2 = wb['会议信息']
else:
    NewSheets2 = wb.create_sheet('会议信息')

## 这里是计数,确定一共有多少ABC
countA = 0
countB = 0
countC = 0
# ֱ直接设置类别说明
Data = [] # 这里的Data存的就只有期刊或会议的数据了,完成清洗
for i in range(len(getJournal)):
    if re.search('A 类', getJournal[i]):
        level = 'A'
    elif re.search('B 类', getJournal[i]):
        level = 'B'
    elif re.search('C 类', getJournal[i]):
        level = 'C'
    NewData = re.split('\t',re.sub('\n','',getJournal[i]))
    if len(NewData) == 5:
        NewData[0] = level
        if level== 'A':
            countA = countA + 1
        elif level == 'B':
            countB = countB + 1
        elif level == 'C':
            countC = countC + 1
        Data.append(NewData)
print('A类:'+str(countA) + ' B类: '+str(countB)+" C类:"+str(countC))

JourCount = 0 # 期刊类别计数
MeetCount = 0 # 会议类别计数

# 主函数,将Data数据写入表格
SetRows1 = 1; # 期刊子表的行数
SetRows2 = 1; # 会议子表的行数
for i in Data:
    col = 1;
    print(i)
    if re.search('http://dblp.uni-trier.de/db/journals/',i[4]):
        # 这里开始把数据写入子表 NewSheets1 里
        for j in range(len(i)):
            NewSheets1.cell(row=SetRows1,column=col+j).value=i[j]
        issn = GetJournISSN(i[4]) # 这里就通过爬虫获取到期刊对应的ISSN
        if issn:
            print(issn)
            NewSheets1.cell(row=SetRows1,column=col+5).value=issn[0]
        SetRows1 = SetRows1 + 1
        JourCount = JourCount + 1
        # print(info1)
    elif re.search('http://dblp.uni-trier.de/db/conf/',i[4]):
        # 这里开始把数据写入子表 NewSheets2 里
        for j in range(len(i)):
            NewSheets2.cell(row=SetRows2, column=col + j).value = i[j]
        SetRows2 = SetRows2 + 1
        MeetCount = MeetCount + 1
    wb.save('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
print('期刊数'+str(JourCount)+' ,会议数 '+str(MeetCount))
print('A类:'+str(countA) + ' B类: '+str(countB)+" C类:"+str(countC))

# 总数:
## 期刊总数: 266 , 32, 111, 123
## 会议总数: 347 , 53, 125, 169
# 经清洗后:
    # 期刊数238 ,会议数 328
    # A类:96 B类: 245 C类:297
# 运行结果:
'''
['A', 'TOCS', 'ACM Transactions on Computer Systems', 'ACM', 'http://dblp.uni-trier.de/db/journals/tocs/']
['0734-2071']
['A', 'TOS', 'ACM Transactions on Storage', 'ACM', 'http://dblp.uni-trier.de/db/journals/tos/']
['1553-3077']
'''

第二步、分区获取并写入表格

第一步、数据获取并写入表格 中 我们已经从 dblp 数据库中获取到期刊对应的ISSN了,如果没发现的请看 GetJourInfo.py 中的 函数:GetJournISSN(url) 输入网址返回ISSN
这次我们需要把ISSN作为参数输入并通过中科院的API接口获取对应的分区信息
再次声明,此工作参考: python查询JCR分区 表示感谢!
此步骤对应文件:AddJCR2JourInfo.py

具体代码
# 参考 https://blog.csdn.net/weixin_41819529/article/details/88706688
# AddJCR2JourInfo.py
import requests
import json

from openpyxl import load_workbook
wb = load_workbook('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
sheets = wb.worksheets
Journal = wb['期刊信息']
url = 'http://webapi.fenqubiao.com/api/journal'

# 这里是在子表前插入一列用来添加大类信息
Journal.insert_cols(1,1)
JourClass = ['计算机体系结构/并行与分布计算/存储系统','计算机网络','网络与信息安全','软件工程/系统软件/程序设计语言','数据库/数据挖掘/内容检索','计算机科学理论','计算机图形学与多媒体','人工智能','人机交互与普适计算','交叉/综合/新兴']
# 通过保存此时表已完成在前插入一列
wb.save('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
print(Journal.max_row,Journal.max_column)
rows = Journal.rows
columns = Journal.columns
countA = 0
countB = 0
countC = 0

ClassNum = 0
SetRows = 0 # 行数

for row in rows:
    # print(row)
    row_val = [col.value for col in row]
    issn = row_val[6]
    print(issn)
    ## 这里往下参考的博客,其实就是生成一定格式的url来获取数据
    search = 'year=2021&abbr='+issn;
    req = requests.get(url='%s%s%s' % (url, '?', search))
    req.encoding='utf-8'
    result = json.loads(req.text)
    print(result)
    SetRows = SetRows + 1
    # 这里是开始在第一列添加大类信息
    Journal.cell(row=SetRows, column=1).value = JourClass[ClassNum]
    strValue = Journal.cell(row=SetRows,column=2).value
    # 这里的三个判断就是为了算当前有多少个A\B\C类
    if strValue == 'A':
        countA = countA + 1;
    elif strValue == 'B':
        countB = countB + 1
    elif strValue == 'C':
        countC = countC + 1;
    if SetRows<Journal.max_row:
    # 这里是当此行是C类,下一行是A类,说明要换大类,就是这个意思
        if strValue=="C" and Journal.cell(row=SetRows+1,column=2).value=="A":
            ClassNum = ClassNum + 1
    if len(result) == 1:
        continue
    else:
        print("期刊名称:",result['Title'])
        Journal.cell(row=SetRows,column=2).value=Journal.cell(row=SetRows,column=2).value+'-'+str(result['Indicator']['ImpactFactor'])
        # 这里是把大类和分区写到每行的后面
        for index,jcr in enumerate(result['JCR']):
            print (index,"类别:%s,分区:%s"%(jcr["NameCN"],jcr["Section"]))
            Journal.cell(row=SetRows,column=index*2+8).value=jcr["NameCN"]
            Journal.cell(row=SetRows, column=index * 2 + 9).value = jcr["Section"]
        wb.save('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
print('A类:' + str(countA) + ' B类: ' + str(countB) + " C类:" + str(countC))
# A类:32 B类: 102 C类:105
# 这里是会议。没有分区需要添加
Meet = wb['会议信息']
SetRows = 0
ClassNum = 0
countA = 0
countB = 0
countC = 0
Meet.insert_cols(1,1)
wb.save('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
rows = Meet.rows
columns = Meet.columns
for row in rows:
    row_val = [col.value for col in row]
    SetRows = SetRows + 1
    strValue = Meet.cell(row=SetRows, column=2).value
    if strValue == 'A':
        countA = countA + 1;
    elif strValue == 'B':
        countB = countB + 1
    elif strValue == 'C':
        countC = countC + 1;
    Meet.cell(row=SetRows, column=1).value = JourClass[ClassNum]
    if SetRows < Meet.max_row:
        if strValue == "C" and Meet.cell(row=SetRows + 1, column=2).value == "A":
            ClassNum = ClassNum + 1
wb.save('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
print('A类:' + str(countA) + ' B类: ' + str(countB) + " C类:" + str(countC))
# A类:51 B类: 121 C类:156

第三步、开始获取每个期刊对应的论文信息

这个是我试图全部按模块化的方式进行爬取和实现,但是带来的是较高的报错调试代价

01、当前表信息

目前我们已经有一个总表,对应路径为:
中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx
在这个表里有两个子表:期刊信息会议信息

  • 期刊信息 子表里:第一列是 大类信息;第二列是 小类+影响因子;第三列是 期刊缩写;第四列是 期刊全称;第五列是 出版社;第六列是 dblp数据库中的期刊网页;第七列是 ISSN;后面就是 中科院的分区情况
  • 会议信息 子表里:第一列是 大类信息;第二列是 小类;第三列是 会议缩写;第四列是 会议全称;第五列是 出版社;第六列是 dblp数据库中的会议网页

然后需要做的是备份对应子表,在备份的子表里进行操作,用冗余保证数据完整性

02、函数说明

文件名是 GetAllPaperText-Plus.py,是之前的升级版,把之前的功能进行提取,设计了函数如下:

  • GetTrueLen(list)
    传参:列表类型数据
    作用:获取列表的真实长度
    面向对象:列表中开辟多个空间,仅前几个空间有值,之后均为 None 可直接返回真实的长度

  • GetMainPage(WebUrl, patrenForGetUrl)
    传参:网页链接 WebUrl, 对应的正则表达式 patrenForGetUrl
    作用:将网页的数据爬取并按正则进行匹配,获取需要的数据,并返回列表格式的数据

  • StandForm2(list, url)
    传参:期刊里包含的子网页列表 list,期刊自身的网页 url
    作用:这里是调用泛用的正则表达式,因为限制条件太低所以要判断的更多,更复杂,比如它需要传入自己期刊的网页用来和爬取到的网页进行匹配,最后返回 列表,格式为(子网页链接,年份,卷数)
    面向对象:如下
    在这里插入图片描述

  • StandForm1(list)
    传参:期刊里包含的子网页列表 list
    作用:针对正则表达式1,最普遍的一种,子页面格式为 年份,卷数,或者 年份:卷数
    面向对象:如下

  • StandForm3(list)
    传参:期刊里包含的子网页列表 list
    作用:针对正则表达式3,最奇怪的一种,就在跑的时候你可以看到之前的匹配都返回了[]

  • BlockFind(kw, info)
    传参:一个是 自己选择的关键字 kw ,一个是论文的标题 info
    作用:如果标题里有关键字 kw 就返回标题,这里是一重判断,可以做多重判断,具体看代码注释

  • GetThePaperTitle(MainPape, KW)
    传参:一个是通过 StandFormX() 函数返回的子页面网页list MainPape,一个是 自己选择的关键字 kw
    作用:通过传入子页面信息,来匹配所有的论文标题并记录,返回(年,链接,标题),和总的论文爬取数量和匹配到的论文数量,其实这里我就已经开始舍弃正则表达式开始尝试 BeautifulSoup 效果很不错

  • KW = "blockchain" 注意这里的关键字是可以修改的

03、具体代码
'''
文件名:GetAllPaperText-Plus.py
这个是 02、GetAllPaperText.py 的升级版,目前是 完成于 20220915
针对对象是经 GetJourInfo.py 和 AddJCR2JourInfo.py 生成的 JournalInfo.xlsx,
此表格含有 CCF对应的所有期刊和会议,且期刊经中科院对应接口获取其分区信息
目前有四张子表,两张原数据,两张整理后
'''
from openpyxl import load_workbook

wb = load_workbook('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
sheets = wb.worksheets
# 这里就是进行子表的复制
if '区块链对应期刊' in wb.sheetnames:
    print('区块链对应期刊 已存在')
    NewSheets1 = wb['区块链对应期刊']
else:
    NewSheets1 = wb.copy_worksheet(wb['期刊信息'])
    NewSheets1.title = '区块链对应期刊'
if '区块链对应会议' in wb.sheetnames:
    print('区块链对应会议 已存在')
    NewSheets2 = wb['区块链对应会议']
else:
    NewSheets2 = wb.copy_worksheet(wb['会议信息'])
    NewSheets2.title = '区块链对应会议'
wb.save('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')

# 获取表格已使用列数
def GetTrueLen(list):
    theLen = len(list)
    while (theLen):
        if list[theLen - 1] != None:
            return theLen
        else:
            theLen = theLen - 1

# 获取期刊对应子网页链接
import requests
import re

# 这里就是用re正则表达中最麻烦的部分了,因为不同的期刊格式不一样,一个正则表达式可能只对某一期刊有效
# 换言之就是其他期刊在套同一正则表达式不一定拿到数据
# 所以这里用了三个正则表达式
patrenForGetUrl1 = '<li><a href=\"(.*?)\">.*?Volume(.*?)</a></li>'
patrenForGetUrl2 = '<a href=\"(.*?)\">(.*?)</a>'
patrenForGetUrl3 = '<a href=\"(.*?)\">(.*?)Volume(.*?)</a>'

# 这里就是爬主网页数据
def GetMainPage(WebUrl, patrenForGetUrl):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27',
        'Connection': 'close'
    }
    response = requests.get(url=WebUrl, headers=headers)
    response.encoding = 'utf-8'
    html_str = response.text
    # print(html_str)
    Get_Page = re.compile(patrenForGetUrl).findall(html_str)
    print(Get_Page)
    response.close()
    return Get_Page


# 用于将获取到的列表进行归一化,参数包括:爬虫获取到的一堆url,自身主页对应的url,用来进行匹配
# 这里是针对patrenForGetUrl2 获取到的list进行处理
# 格式为:(url,year,num),如:('https://dblp.uni-trier.de/db/journals/ivc/ivc117.html', '2022,117')
# 这里格式可改,在NewVal 那一行自行修改
def StandForm2(list, url):
    SetYear = 2022 #这个是因为存在一些期刊没有年份只有卷数,我默认为2022,当卷数开始降低就说明年份开始自减
    for inx, val in enumerate(list):
        if re.findall(url, val[0], re.I):
            if re.split('-', list[inx + 1][1])[-1].isdigit():  # 用于对网页中存在部分格式为xx-xx的解析
                if inx + 1 != len(list):
                    NewVal = (val[0], str(SetYear) + ',' + str(val[1]),)
                    if int(re.split('-', list[inx][1])[0]) > int(re.split('-', list[inx + 1][1])[0]):
                        SetYear = SetYear - 1
                MainPape.append(NewVal)
            else:
                NewVal = (val[0], str(SetYear) + ',' + str(val[1]),)
                MainPape.append(NewVal)
                break
    print(MainPape)
    return MainPape


# 这里是针对patrenForGetUrl1解析出来的数据进行归一化处理
def StandForm1(list):
    for inx, val in enumerate(list):
        temp = re.sub(' ', '', val[1])
        # print(temp)
        if re.findall(',', temp, re.I):
            temp2 = re.split(',', temp)
            UrlInfo = temp2[1] + ',' + temp2[0]
        elif re.findall(':', temp, re.I):
            temp2 = re.split(':', temp)
            UrlInfo = temp2[1] + ',' + temp2[0]
        else:
            UrlInfo = temp
        NewVal = (val[0], UrlInfo,)
        MainPape.append(NewVal)
    print(MainPape)
    return MainPape


# 这里是针对patrenForGetUrl3解析出来的数据进行归一化处理
def StandForm3(list):
    for inx, val in enumerate(list):
        year = re.sub(' ', '', val[1])
        num = re.sub(" ", '', val[2])
        year = re.sub(':', '', year)
        # print(year,num)
        UrlInfo = year + ',' + num
        NewVal = (val[0], UrlInfo,)
        MainPape.append(NewVal)
    print(MainPape)
    return MainPape


'''
通过传入关键字进行匹配
# 这里可以做很多有意思的操作,比如我这里是只匹配一个KW
# 通过在这里修改判断,可以做多重关键字的判断
# 比如如果KW1没有匹配到,那能不能匹配kw2 再返回,或者
# KW1匹配到了,再匹配KW2,都匹配到了再返回
'''
def BlockFind(kw, info):
    if re.findall(kw, info, re.I):
        return info


# 这里是期刊子页面的论文搜索
def GetThePaperTitle(MainPape, KW):
    # import io
    # import sys
    # import urllib.request
    # sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码
    countofPaper = 0;
    countOFKW = 0;
    paperInfo = []
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.27',
        'Connection': 'close'
    }
    from bs4 import BeautifulSoup
    ForYearwithKW = 0
    for i in MainPape:
        nextUrl = i[0]
        nextUrlText = i[1]
        print(nextUrl, nextUrlText)
        year = re.findall('\d+', re.split(',', nextUrlText)[0])[-1]
        # 这里是为了记录每一次爬取的论文信息
        # with open('txt-src/AllPaperInfo.txt', 'a',encoding='utf-8') as file:
        #     file.write('\n'+'## '+year+'\n')
        #     file.close()
        # print(year)
        PaperInfo = requests.get(url=nextUrl, headers=headers)  # GET请求
        PaperInfo.encoding = ('utf-8')
        soup = BeautifulSoup(PaperInfo.text, 'lxml')
        temp1 = soup.find_all('li', itemtype="http://schema.org/ScholarlyArticle")
        ForYearNum = 0
        Title = []
        for i in temp1:
            u = i.find('div', class_="head").find('a')
            if u == None:
                continue
            # print(u['href'])
            t = i.find('span', class_="title", itemprop="name")
            ForYearNum = ForYearNum + 1
            Title.append(t.text + '\n')
            if BlockFind(KW, t.text):
                # 匹配成功,写入表格中
                countOFKW = countOFKW + 1
                NewVal = (year, u['href'], t.text,)
                # print(type(year),type(u['href']),type(t.text))
                paperInfo.append(NewVal)
            countofPaper = countofPaper + 1
        # 这里是将每一次爬取到的论文标题按顺序写入,在写入前先写入 当前论文的数目
        # with open('txt-src/AllPaperInfo.txt', 'a', encoding='utf-8') as file:
        #     file.write('\n' + '## ' + year + ',' + str(ForYearNum) + '\n')
        #     for i in Title:
        #         file.write(i)
        #     file.close()
        print("第 " + year + " 年对应论文数:" + str(ForYearNum))
    print("总论文数:" + str(countofPaper) + ", 对应关键字有效匹配数:" + str(countOFKW))
    paperInfo.append(str(countofPaper))  # 倒数第二位是所有论文的数字
    paperInfo.append(str(countOFKW))  # 最后一位是KW对应的论文数字
    return paperInfo

## 注意这里是因为网络波动,会存在中断情况,这时候如果你没有设置GetThePaperTitle写入txt
## 只需要把下面的三个参数修改成最后一次打印输出的结果即可
# 开始期刊
# 比如第一次失败:
# 修改AllPaperNum = 378916 ;AllPaperwithKW =657 ;TruePaperwithKW =190695
'''
当前已遍历论文总数为: 378916 ,已遍历对应关键字的论文总数为: 657 ,拥有KW的期刊论文总数为: 190695
9 ['人工智能', 'A-9.088', 'AI', 'Artificial Intelligence', 'Elsevier', 'https://dblp.uni-trier.de/db/journals/ai/', '0004-3702', '计算机:人工智能', 2, None, None, None, None, None, None, None, None]
计算机:人工智能

'''
# 第二次失败:
'''
当前已遍历论文总数为: 446906 ,已遍历对应关键字的论文总数为: 674 ,拥有KW的期刊论文总数为: 199096
13 ['人工智能', 'C-5.795', 'DSS', 'Decision Support Systems', 'Elsevier',
'''
# 最终:当前已遍历论文总数为: 622369 ,已遍历对应关键字的论文总数为: 808 ,拥有KW的期刊论文总数为: 273558


AllPaperNum = 0  # 这是记录所有论文的个数
AllPaperwithKW = 0  # 这是记录对应KW的个数
TruePaperwithKW = 0  # 这是记录存有KW下的总论文数
KW = "blockchain" ## 这里的关键字是可以修改的
SetRows = 0
rows = NewSheets1.rows
columns = NewSheets1.columns
for row in rows:
    MainPape = []
    row_val = [col.value for col in row]
    # 对应行的真实列数
    GetCol = GetTrueLen(row_val)
    print(GetCol, row_val)
    print(row_val[GetCol - 2])  # 这里输出当前行的最后一位,判断是否已经写入,正常是字符串,然后写完后就是所有论文的数目
    SetRows = SetRows + 1
    if row_val[GetCol - 2].isdigit() != True:
    	# 这里是写入 期刊的信息,格式有点像 makedown
        # with open('txt-src/AllPaperInfo.txt', 'a', encoding='utf-8') as file:
        #     file.write('\n' + '# ')
        #     for i in range(GetCol):
        #         if type(row_val[i]) != str:
        #             file.write(str(row_val[i]) + '\t')
        #         else:
        #             file.write(row_val[i] + '\t')
        url = row_val[5]
        # print(url)
        # url = 'https://dblp.uni-trier.de/db/journals/jpdc/'
        MainPape = StandForm1(GetMainPage(url, patrenForGetUrl1))
        if MainPape == []:
            GetPage = GetMainPage(url, patrenForGetUrl2)
            MainPape = StandForm2(GetPage, url)
            if MainPape == []:
                MainPape = StandForm3(GetMainPage(url, patrenForGetUrl3))
        # 此处对获取到的MianPape做子页获取
    else:
        continue

    paperInfo = GetThePaperTitle(MainPape, KW) # 这里获取到期刊对应的所有论文
    NowPaperNum = int(paperInfo[-2])  # 获取所有论文的总数
    NowPaperwithKW = int(paperInfo[-1])  # 获取对应KW的论文数
    if NowPaperwithKW != 0:
        TruePaperwithKW = TruePaperwithKW + NowPaperNum  # 计算涉及到关键字的期刊的论文总数
        for i in range(NowPaperwithKW):
        	# 这里是按年、论文标题,论文标题对应格子里设置超链接
            print("第 " + str(SetRows) + " 行,第 " + str(GetCol + 1 + i * 2) + " 列 在写入")
            NewSheets1.cell(row=SetRows, column=GetCol + 1 + i * 2).value = paperInfo[i][0]
            NewSheets1.cell(row=SetRows, column=GetCol + 2 + i * 2).value = paperInfo[i][2]
            NewSheets1.cell(row=SetRows, column=GetCol + 2 + i * 2).hyperlink = paperInfo[i][1]
    AllPaperNum = AllPaperNum + NowPaperNum  # 计算当前所有期刊的论文总数
    AllPaperwithKW = AllPaperwithKW + NowPaperwithKW  # 计算当前对应关键字的所有期刊的论文总数
    NewSheets1.cell(row=SetRows, column=GetCol + NowPaperwithKW * 2 + 1).value = paperInfo[-2]  # 写入当前期刊的论文总数
    NewSheets1.cell(row=SetRows, column=GetCol + 2 + NowPaperwithKW * 2).value = paperInfo[-1]  # 写入对应kw的论文总数
    wb.save('中国计算机学会推荐国际学术会议和期刊目录-2019/JournalInfo.xlsx')
    print("当前已遍历论文总数为: " + str(AllPaperNum) + ' ,已遍历对应关键字的论文总数为: ' + str(AllPaperwithKW) + " ,拥有KW的期刊论文总数为: " + str(
        TruePaperwithKW))
    # 这里是把每次的运行结果进行记录
    # with open('txt-src/logs.txt', 'a', encoding='utf-8') as f:
    #         # f.write("目前已遍历到期刊:")
    #     f.write('\n' + '# ')
    #     for i in range(GetCol):
    #         if type(row_val[i]) != str:
    #             f.write(str(row_val[i]) + '\t')
    #         else:
    #             f.write(row_val[i] + '\t')
    #     f.write('\n' + "## 当前已遍历论文总数为: ")
    #     f.write(str(AllPaperNum))
    #     f.write(' ,已遍历对应关键字的论文总数为: ')
    #     f.write(str(AllPaperwithKW))
    #     f.write(" ,拥有KW的期刊论文总数为: ")
    #     f.write(str(TruePaperwithKW) + '\n')

第三章、等待跑完即可

运行截图
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_August

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值