为什么要批量爬取
虽然很少用到知网,但是还是会时不时看看知网的文献。当需要了解某个领域的,看中文的文章还是来得更快些。但是呢通常并不需要把每一篇都下载了看,只需要看看标题,看看摘要,再看看关键词就行了。检索某个关键词,一篇一篇打开看,真的是太麻烦了。就像下图这样:
那能不能批量处理呢?最好是把标题作者日期关键词摘要都整理在一个Excel表里面,再筛选就方便多了。不知道是哪个计算机大佬说过“重复的工作应该交给电脑,人类更擅长的是浪费时间 ”。嚯嚯嚯,这时候就该Python出场了。
写代码前的工作
先是试了试直接在知网进行爬取,但是技术不到家,死活找不到可用的URL,而且,知网分分钟识别到爬虫恶意爬取,分分钟封禁IP。找啊找,终于找到一个可代替的网站:远见搜索。同样的检索“根系分泌物”:
比在知网检索到的还多!!!!!!
简单分析一下网页结构,在页数不同的时候只有这个地方会改变:
等等,分析了网页代码结构,无法get到文献的摘要部分!!!只能get到标题、作者、日期、关键词、下载次数、被引次数等信息!!!最重要的摘要部分无法get到!!!(灬ꈍ ꈍ灬)哈哈,还好有CNKI官网的链接,那把这个链接抓取下来,然后再批量访问这些链接就能get到文献的摘要了。那就先get到除摘要之外的信息吧!
Talk is cheap. Show me the code!
import os
import random
import openpyxl
import time
import requests
from bs4 import BeautifulSoup
import re
time_start = time.time()
url = 'http://yuanjian.cnki.net/Search/ListResult'
user_agent = {
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
results = []
title_link_result = openpyxl.Workbook()
sheet = title_link_result.active
sheet.title = '根系分泌物CNKI文献链接爬取'
col_name = ['title','link']
sheet.append(col_name)
for i in range(2,450,10):
for j in range(i-1,i + 9):
try:
paramas = {
'searchType': 'MulityTermsSearch',
'ArticleType': '1',
'ParamIsNullOrEmpty': 'true',
'Islegal': 'false',
'Content': '根系分泌物',
'Type': '1',
'Order': '1',
'Page': str(j)
}
res = requests.get(url,params=paramas)
print(res.status_code)
soup = BeautifulSoup(res.text, 'html.parser')
items = soup.find_all('div',class_='list-item')
for item in items:
title = item.find('a')['title']
try:
try:
keywords = item.find('div',class_='info').find('p',class_='info_left left').find_all('a')[0]['data-key']
article_info = item.find('p',class_='source').text.replace('\n','')
download_num = re.findall('\d{1,10}',item.find('div',class_='info').find('span', class_='time1').text)[0]
cited_num = re.findall('\d{1,10}',item.find('div',class_='info').find('span', class_='time2').text)[0]
CNKI_link = item.find('a')['href']
except IndexError:
keywords = 'None'
article_info = 'None'
download_num = 'None'
cited_num = 'None'
CNKI_link = 'None'
except AttributeError:
keywords = 'None'
article_info = 'None'
download_num = 'None'
cited_num = 'None'
CNKI_link = 'None'
results.append([title,keywords,article_info,download_num,cited_num,CNKI_link])
sheet.append([title,keywords,article_info,download_num,cited_num,CNKI_link])
print(j)
print(results[-1])
print('成功爬取:%s条'%len(results))
time_end = time.time()
print('耗时:%s秒'%str(time_end-time_start))
time.sleep(0)
except TimeoutError:
title_link_result.save('根系分泌物CNKI文献链接_all.xlsx')
break
time.sleep(0)
title_link_result.save('根系分泌物CNKI文献链接_break.xlsx')
结果
先上图:
大概是一分钟1200条。
最后得到的Excel就能用于后续的阅读分析了(R语言搞个词云什么的)。再把摘要爬取 下来就差不多完整了。这个下篇简书介绍,敬请期待。
PS:
①恶意爬取隐私信息会触犯相关法规,请合理使用爬虫。
②遇到IP被临时封禁的情况,修改单次爬取的数量即可。