Python-Selenium Webdriver+google chrome浏览器爬取中国知网的文献概述
目录
前言
小白的第一篇文章!最近假期写专利需要参考知网所有相关专利文献,一篇篇点进去看实在太慢了。。一气之下就写了个python脚本直接把摘要界面所有有用的信息全扒下来了hh,写个博客记录一下供以后参考
一、使用webdriver的注意事项
使用selenium webdriver + chrome浏览器时要注意chromedriver版本和浏览器版本的匹配性,下载链接附在这里了:
ChromeDriver与Chrome版本对应关系及下载链接
下载完成后把对应的ChromeDriver.exe文件放到python项目的对应目录下就行。
注意:有的软件管家会提示谷歌浏览器的更新,最好忽略更新,不然版本不匹配的话ChromeDriver会不支持(我就是很久不用webdriver给忘了,让qq管家更新了浏览器,导致程序没法运行,还得回网上找资源),而且,最新版本的浏览器似乎没有对应的ChromeDriver。
二、开始码代码
1.引入库&总体思路
引入库相关代码如下:
# -*- coding:utf-8 -*-
import requests
import time
from selenium import webdriver
from bs4 import BeautifulSoup
import openpyxl
脚本的大致思路为:用webdriver扒下所有满足我要求文章的url,存进列表里,再逐个请求,用BeautifulSoup编译,爬取文章详情页面的标题、摘要、机构、作者等信息。
编译环境为pycharm,安装了python3.7和anaconda3,这些包在anaconda里面都有,要是只装了python的话可以在控制台里面pip install一下。
2.检索部分
话不多说先上代码:
# 前序搜索条件的录入使用webdriver
driver = webdriver.Chrome()
driver.get('https://kns.cnki.net/kns8/AdvSearch?dbcode=SCOD') # 这个直接就是高级检索的网页
time.sleep(2)
# advanced_search = driver.find_element_by_class_name('btn-grade-search')
# advanced_search.click() # 跳转进入高级检索,后期可维护
# time.sleep(1)
major_search = driver.find_element_by_name('majorSearch')
major_search.click() # 跳转进入专业检索,后期可维护
time.sleep(1)
# 输入检索语句,后期可维护
input_key_words = driver.find_element_by_class_name('search-middle').find_element_by_tag_name('textarea')
key_words = input("输入检索语句:")
input_key_words.send_keys(key_words)
search_button = driver.find_element_by_class_name('search-buttons').find_element_by_tag_name('input')
search_button.click()
time.sleep(2)
首先指出一下,因为我用的是专利检索,所以直接进了知网的专利库,正常进首页就行。这段代码用的是专业检索,输入检索语句就能查看结果,如果是高级检索的话需要修改一下对应的element然后分别send_keys就行。webdriver的自动化操作结束后需要看一下搜索结果和需求结果的匹配性,这属于文献检索的范畴了,这里不多啰嗦,大概看一下第一页搜索结果都满意的话,就可以下手扒url了。
3.文献url批量爬取
先上代码:
# 现在开始抓取每篇文献的url
results = driver.find_element_by_class_name('pagerTitleCell').find_element_by_tag_name('em').text
num_results = int(results)
num_pages = int(num_results/20) + 1
url_list = []
# 以下为测试代码,抓取目标元素存入字符串变量
# file = driver.find_element_by_class_name('seq').find_element_by_tag_name('input')
# file_attr = file.get_attribute('value')
# print(file_attr)