欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python爬虫根据关键词爬取知网论文摘要并保存到数据库中【入门必学】

程序员文章站 2022-03-07 16:03:13
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:崩坏的芝麻 由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口 比如下面这个网页:htt ......

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:崩坏的芝麻

Python爬虫根据关键词爬取知网论文摘要并保存到数据库中【入门必学】

 

由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口

比如下面这个网页:
http://search.cnki.net/search.aspx?q=肉制品

搜索出来的结果和知网上的结果几乎一样,另外以后面试找python工作,项目经验展示是核心,如果你缺项目练习,去小编的python交流.裙 :一久武其而而流一思(数字的谐音)转换下可以找到了,里面很多新教程项目

在这个基础上,我简单看了些网页的结构,很容易就能写出爬取得代码(是最基础的,相当不完善,增加其他功能可自行增加)
Python爬虫根据关键词爬取知网论文摘要并保存到数据库中【入门必学】
网页的结构还是很清晰的

Python爬虫根据关键词爬取知网论文摘要并保存到数据库中【入门必学】
摘要信息也很清晰

我使用的是 pymysql 连接的数据库,效率也还可以
下面直接贴代码:

# -*- coding: utf-8 -*-
import time
import re
import random
import requests
from bs4 import beautifulsoup
import pymysql

connection = pymysql.connect(host='',
                             user='',
                             password='',
                             db='',
                             port=3306,
                             charset='utf8')  # 注意是utf8不是utf-8

# 获取游标
cursor = connection.cursor()

#url = 'http://epub.cnki.net/grid2008/brief/detailj.aspx?filename=rlgy201806014&dbname=cjfdlast2018'

#这个headers信息必须包含,否则该网站会将你的请求重定向到其它页面
headers = {
    'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'accept-encoding':'gzip, deflate, sdch',
    'accept-language':'zh-cn,zh;q=0.8',
    'connection':'keep-alive',
    'host':'www.cnki.net',
    'referer':'http://search.cnki.net/search.aspx?q=%e4%bd%9c%e8%80%85%e5%8d%95%e4%bd%8d%3a%e6%ad%a6%e6%b1%89%e5%a4%a7%e5%ad%a6&rank=relevant&cluster=zyk&val=cdfdtotal',
    'upgrade-insecure-requests':'1',
    'user-agent':'mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/55.0.2883.87 safari/537.36'
}

headers1 = {
        'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2785.143 safari/537.36'
    }

def get_url_list(start_url):
    depth = 20
    url_list = []
    for i in range(depth):
        try:
            url = start_url + "&p=" + str(i * 15)
            search = requests.get(url.replace('\n', ''), headers=headers1)
            soup = beautifulsoup(search.text, 'html.parser')
            for art in soup.find_all('div', class_='wz_tab'):
                print(art.find('a')['href'])
                if art.find('a')['href'] not in url_list:
                    url_list.append(art.find('a')['href'])
            print("爬取第" + str(i) + "页成功!")
            time.sleep(random.randint(1, 3))
        except:
            print("爬取第" + str(i) + "页失败!")
    return url_list

def get_data(url_list, wordtype):
    try:
        # 通过url_results.txt读取链接进行访问
        for url in url_list:
            i = 1;
            if url == pymysql.null or url == '':
                continue
            try:
                html = requests.get(url.replace('\n', ''), headers=headers)
                soup = beautifulsoup(html.text, 'html.parser')
            except:
                print("获取网页失败")
            try:
                print(url)
                if soup is none:
                    continue
                # 获取标题
                title = soup.find('title').get_text().split('-')[0]
                # 获取作者
                author = ''
                for a in soup.find('div', class_='summary pad10').find('p').find_all('a', class_='knowledgenetlink'):
                    author += (a.get_text() + ' ')
                # 获取摘要
                abstract = soup.find('span', id='chdivsummary').get_text()
                # 获取关键词,存在没有关键词的情况
            except:
                print("部分获取失败")
                pass
            try:
                key = ''
                for k in soup.find('span', id='chdivkeyword').find_all('a', class_='knowledgenetlink'):
                    key += (k.get_text() + ' ')
            except:
                pass
            print("第" + str(i) + "个url")
            print("【title】:" + title)
            print("【author】:" + author)
            print("【abstract】:" + abstract)
            print("【key】:" + key)
            # 执行sql语句
            cursor.execute('insert into cnki values (null, %s, %s, %s, %s, %s)', (wordtype, title, author, abstract, key))
            # 提交到数据库执行
            connection.commit()

            print()
        print("爬取完毕")
    finally:
        print()

if __name__ == '__main__':
    try:
        for wordtype in {"大肠杆菌", "菌群总落", "胭脂红", "日落黄"}:
            wordtype = "肉+" + wordtype
            start_url = "http://search.cnki.net/search.aspx?q=%s&rank=relevant&cluster=zyk&val=" % wordtype
            url_list = get_url_list(start_url)
            print("开始爬取")
            get_data(url_list, wordtype)
            print("一种类型爬取完毕")
        print("全部爬取完毕")
    finally:
        connection.close()

在这里的关键词我简单的选了几个,作为实验,如果爬取的很多,可以写在txt文件里,直接读取就可以,非常方便。