简介

知网搜索出来的文献分为不同的类型,比如期刊、论文。当点击文章的来源时,url会进行重定向,。通过简单的分析可以得到url获取方式为https://kns.cnki.net+href值,href值可通过文章列表的href属性获取。

本文要获取的的信息分为两类,如下图所示

python爬取知网参考文献 最新发布 爬虫爬取知网文献数据_.net

1. 导入程序必要的包

import re
import requests
from bs4 import BeautifulSoup

2. 发送请求

# 报刊 经济问题
url1 = 'https://kns.cnki.net/KNS8/Navi?DBCode=cjfq&BaseID=JJWT'
# 河北大学
url2 = 'https://kns.cnki.net/KNS8/Navi?DBCode=CDMD&BaseID=GHEBU'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"}
req1 = requests.get(url1, headers=headers)
req2 = requests.get(url2, headers=headers)

3. 获取报刊相关信息

爬取报刊名称

soup1 = BeautifulSoup(req1.text, 'html.parser')
# 通过分析页面信息,要爬取的信息都存在dl标签中
dl = soup1.dl
name_tag = dl.h3
name = name_tag.text if name_tag else ''

这样获取的名称标签是这样的:\r\n 经济问题On Economic Problems\n

原因是在HTML中,名称标签如下所示

<h3 class="titbox">经济问题
    <p>On Economic Problems</p>
</h3>

解决方法是:需要先把英文名称提取出来,然后在通过正则表达式获取中文名称

name_en_tag = name_tag.p
name_en = name_en_tag.text if name_en_tag else ''
name = re.sub(r'\s*|{}'.format(name_en), '', name)
print("【中文名称】{0: ^15}爬取完成!".format(name))
print("【英文名称】{0: ^15}爬取完成!\n".format(name_en))



=============================运行结果====================================
【中文名称】     经济问题      爬取完成!
【英文名称】On Economic Problems爬取完成!

爬取收录机构信息

# 获取被xxx收录
journals = []
journalType_tag = dl.find('p', class_="journalType")
journals_tag = journalType_tag.find_all('span')
for journal_tag in journals_tag:
    journals.append(journal_tag.text)
print('【收录机构】爬取完成!\n')



=============================运行结果====================================
【收录机构】爬取完成!

爬取基本信息和出版相关信息

# 获取基本信息
ul = dl.find(id='JournalBaseInfo')
li1 = ul.find_all('li')[1]
ps = li1.find_all('p')
basic_info = []
for p in ps:
    basic_info.append(p.text)
    print(p.text)
print('【基本信息】爬取完成!\n')

# 获取出版相关的信息,专辑名称,专题名称,出版文献量
album_tag = dl.find('span', id="jiName")
special_tag = dl.find('span', id="tiName")
try:
    publish_tag = special_tag.parent.next_sibling.next_sibling.find('span')
except:
    print('爬取出版文献量异常!')
album = album_tag.text if album_tag else ''
special = special_tag.text if special_tag else ''
publish = publish_tag.text if publish_tag else ''
print('【专辑名称】{0: <10} 爬取完成!'.format(album))
print('【专题名称】{0: <10} 爬取完成!'.format(special))
print('【出版文献量】{0: <9} 爬取完成!'.format(publish))



=============================运行结果====================================

主办单位:山西省社会科学院
出版周期:月刊
ISSN:1004-972X
CN:14-1058/F
出版地:山西省太原市
语种:中文
开本:大16开
邮发代号:22-60
创刊时间:1979
【基本信息】爬取完成!

【专辑名称】经济与管理科学    爬取完成!
【专题名称】经济与管理综合    爬取完成!
【出版文献量】11574 篇   爬取完成!

4. 获取大学相关信息

soup2 = BeautifulSoup(req2.text, 'html.parser')
dd = soup2.dd

# 提取学校名称
name = dd.h3.text
name = re.sub('\s*', '', name)

# 提取学校曾用名和地域
uls = dd.find_all('ul')
base_tag = uls[0].find_all('li')[1]
ps_tag = base_tag.find_all('p')
name_used = ps_tag[0].span.text if ps_tag[0].span else ''
region = ps_tag[1].span.text if ps_tag[1].span else ''

# 提取出版概况
publish_info_tag = uls[1].find_all('li')[1]
ps1_tag = publish_info_tag.find_all('p')
count_articles = ps1_tag[0].span.text if ps1_tag[0].span else ''
count_refer = ps1_tag[1].span.text if ps1_tag[1].span else ''
count_downloads = ps1_tag[0].span.text if ps1_tag[0].span else ''