Python文献爬虫①

作者: 研究僧小蓝哥 | 来源:发表于2019-11-18 00:01 被阅读0次

为什么要批量爬取

虽然很少用到知网,但是还是会时不时看看知网的文献。当需要了解某个领域的,看中文的文章还是来得更快些。但是呢通常并不需要把每一篇都下载了看,只需要看看标题,看看摘要,再看看关键词就行了。检索某个关键词,一篇一篇打开看,真的是太麻烦了。就像下图这样:

图片来自中国知网

那能不能批量处理呢?最好是把标题作者日期关键词摘要都整理在一个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表(来自小蓝哥)
最后得到的Excel就能用于后续的阅读分析了(R语言搞个词云什么的)。再把摘要爬取 下来就差不多完整了。这个下篇简书介绍,敬请期待。

PS:
①恶意爬取隐私信息会触犯相关法规,请合理使用爬虫。
②遇到IP被临时封禁的情况,修改单次爬取的数量即可。

相关文章

网友评论

    本文标题:Python文献爬虫①

    本文链接:https://www.haomeiwen.com/subject/spgmictx.html