目的:爬取毕设所需的数据源,包括论文标题、论文作者以及作者的详细信息。
所需第三方库:
下面进入正题。
首先,我们打开知网首页:https://www.cnki.net/
我们必须先输入关键词,再点击搜索按钮才能够得到我们想要的内容,在此我以知识图谱为例进行搜索。按下F12查看网页的源码:
如上图,我们可以看到输入框所对应的input元素,将鼠标移到input标签上点击右键,选择Copy -> Copy selector 就可以拿到改标签的选择器,如下图:
我们以同样的方式也可以拿到搜索按钮的选择器:
这样做的目的是为了使用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:
我们再对这个网页进行分析,我们需要的内容是论文标题、作者名以及作者的详细信息。同样的,我们按下F12查看网页的源代码,可以发现我们需要的主体信息全都在这个table的tbody中:
用代码获取到这个tbody,然后对其解析
tbody = soup.find_all('tbody') # 获取tbody标签
tbody = BeautifulSoup(str(tbody[0]), 'lxml') # 解析
这里通过find_all拿到的结果是一个数组。
然后我们继续观察,可以发现每一篇论文对应了tbody下的一个tr,tr下的td中包含了论文标题和作者列表等:
以同样的方法,我们可以拿到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爬虫——爬取知网论文数据(二)
讲了如何爬取多页,以及如何爬取作者的详细信息。