Python爬虫——爬取知网论文数据(一)

目的:爬取毕设所需的数据源,包括论文标题、论文作者以及作者的详细信息。
所需第三方库:

  • Requests库
  • Selenium库
  • BeautifulSoup库

先贴一个我爬取到的结果图:
Python爬虫——爬取知网论文数据(一)_第1张图片

下面进入正题。
首先,我们打开知网首页:https://www.cnki.net/
Python爬虫——爬取知网论文数据(一)_第2张图片
我们必须先输入关键词,再点击搜索按钮才能够得到我们想要的内容,在此我以知识图谱为例进行搜索。按下F12查看网页的源码:
Python爬虫——爬取知网论文数据(一)_第3张图片
如上图,我们可以看到输入框所对应的input元素,将鼠标移到input标签上点击右键,选择Copy -> Copy selector 就可以拿到改标签的选择器,如下图:
Python爬虫——爬取知网论文数据(一)_第4张图片
我们以同样的方式也可以拿到搜索按钮的选择器:
Python爬虫——爬取知网论文数据(一)_第5张图片
这样做的目的是为了使用selenium代替我们去自动输入关键字以及搜索。
这里写一个driver_open方法,接收一个参数代表要搜索的关键字,使用google的driver。(这个driver需要下载到本地)

from bs4 import BeautifulSoup
from selenium import webdriver
import time
import requests
import csv

# 进入知网首页并搜索关键词
def driver_open(key_word):
    url = "https://www.cnki.net/"
    driver = webdriver.Chrome("D:/Software/chorme/chromedriver.exe")
    driver.get(url)		# 进入知网首页
    time.sleep(2)
    # 将关键词输入搜索框
    driver.find_element_by_css_selector('#txt_SearchText').send_keys(key_word)
    time.sleep(2)
    # 点击搜索按钮
    driver.find_element_by_css_selector('body > div.wrapper.section1 > div.searchmain > div > div.input-box > input.search-btn').click()
    time.sleep(5)
    driver.close()
    # 拿到返回结果
    content = driver.page_source.encode('utf-8')
    soup = BeautifulSoup(content, 'lxml')	# 解析返回结果
    return soup

至此,我们拿到了一个soup对象,这个soup对象就是输入关键字后搜索得出的网页。如搜索“知识图谱”得到的soup:
Python爬虫——爬取知网论文数据(一)_第6张图片
我们再对这个网页进行分析,我们需要的内容是论文标题、作者名以及作者的详细信息。同样的,我们按下F12查看网页的源代码,可以发现我们需要的主体信息全都在这个table的tbody中:
Python爬虫——爬取知网论文数据(一)_第7张图片
用代码获取到这个tbody,然后对其解析

tbody = soup.find_all('tbody')	# 获取tbody标签
tbody = BeautifulSoup(str(tbody[0]), 'lxml')	# 解析

这里通过find_all拿到的结果是一个数组。
然后我们继续观察,可以发现每一篇论文对应了tbody下的一个tr,tr下的td中包含了论文标题和作者列表等:
Python爬虫——爬取知网论文数据(一)_第8张图片
以同样的方法,我们可以拿到tbody标签下的所有tr元素,以及tr元素下的所有td元素:

tr = tbody.find_all('tr')	# 获取tr标签,返回一个数组
    # 对每一个tr标签进行处理
    for item in tr:
        tr_bf = BeautifulSoup(str(item), 'lxml')
		
		# 获取论文标题
        td_name = tr_bf.find_all('td', class_ = 'name')	# 拿到tr下的td
        td_name_bf = BeautifulSoup(str(td_name[0]), 'lxml')
        a_name = td_name_bf.find_all('a')
        # get_text()是获取标签中的所有文本,包含其子标签中的文本
        title = a_name[0].get_text().strip()
        print("title : " + title)

		# 获取包含作者的那个td
        td_author = tr_bf.find_all('td', class_ = 'author')
        td_author_bf = BeautifulSoup(str(td_author), 'lxml')
        # 每个a标签中都包含了一个作者名
        a_author = td_author_bf.find_all('a')
        authors = []
        
		# 拿到每一个a标签里的作者名
        for author in a_author:
            name = author.get_text().strip()    # 获取学者的名字
            print('name : ' + name)
            authors.append(name)
            
		paper = Paper(title, authors)
        papers.append(paper)

至此,我们就拿到了论文标题和对应的作者列表
上述代码中的Paper是自定义的论文类,如下:

# 定义论文类
class Paper:
    def __init__(self, title, authors):
        self.title = title
        self.authors = authors

至此,我们就拿到了包含论文标题和论文作者的papers对象数组。

下一篇:Python爬虫——爬取知网论文数据(二)
讲了如何爬取多页,以及如何爬取作者的详细信息。

你可能感兴趣的:(python,爬虫)