selenium爬虫获取IEEE论文信息
手动输入关键词,自动查询
获取论文名称,文章全文链接,期刊名称及论文信息,如下
{'title': 'Timeliness-Aware Incentive Mechanism for Vehicular Crowdsourcing in Smart Cities', 'link': 'https://ieeexplore.ieee.org/document/9328457/', 'journal': 'IEEE Transactions on Mobile Computing', 'article_info': 'Year: 2022 | Volume: 21, Issue: 9 | Journal Article | Publisher: IEEE'}
前言
针对不同功能定义函数模块
- 初始化函数
- 关键字搜索函数
- 页面滚动函数
- 数据获取解析函数
- 数据保存函数
- 翻页函数
一、CODE
# 主页面
url = 'https://ieeexplore.ieee.org/Xplore/home.jsp'
完整代码
import random
import time
from pymongo import MongoClient
from selenium import webdriver
from selenium.webdriver.common.by import By
class Paper():
def __init__(self):
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
# 隐藏"Chrome正在收到自动软件的控制"
options.add_experimental_option('useAutomationExtension', False)
# 去掉开发者警告
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 打开指定浏览器,初始化设置
self.browser = webdriver.Chrome('D:\Program Files\Python\ChromeDriver 107.0.5304.62.exe', options=options)
# 打开指定页面,输入关键字,并点击搜索
def query_keywords(self, keywords):
# 加载指定页面
self.browser.get('https://ieeexplore.ieee.org/Xplore/home.jsp')
# 设置10秒后执行下一步
time.sleep(10)
# 通过tag属性选择文本框元素,并设置内容
input_tag = self.browser.find_element(By.TAG_NAME, "input")
# 在文本框输入关键字
input_tag.send_keys(keywords)
# 通过tag属性获取搜索按钮,并执行点击操作
self.browser.find_element(By.TAG_NAME, 'button').click()
# 向下滚动页面
def scroll_down_page(self):
# 循环分8次将页面加载完成(可自定义)
for i in range(1, 9):
# 每次位置信息
j = i / 10
# js语法,document获取属性、获取整个页面的长度,传入长度占比数值
js = f"document.documentElement.scrollTop = document.documentElement.scrollHeight * {j}"
# 移动页面到指定位置
self.browser.execute_script(js)
# 随机暂停时间,滚动页面
time.sleep(random.randint(400, 800) / 1000)
# 获取数据并解析
def get_parse_data(self, *args):
self.scroll_down_page()
# xpath选择器定位,选择所有文章的div
divs = self.browser.find_elements(By.XPATH, './/div[@class="List-results-items"]')
# 设置计数器,方便检查结果
cnt = 1
# 循环取出每篇论文信息
for div in divs:
title = div.find_element(By.XPATH, './/h2[@class="text-md-md-lh"]/a')
link = div.find_element(By.XPATH, './/h2[@class="text-md-md-lh"]/a').get_attribute('href')
journal = div.find_element(By.XPATH, './/div[@class="description text-base-md-lh"]/a')
article_info = div.find_element(By.XPATH, './/div[@class="description text-base-md-lh"]/div')
# 将信息写入字典
items = {
'title': title.text,
'link': link,
'journal': journal.text,
'article_info': article_info.text
}
# 打印检查提取结果
print(cnt, items)
cnt += 1
# 调用保存数据函数,逐条将字典保存到mongo数据库
self.save_mongo(items)
# 本页结束,调用下页函数
self.next_page()
# 保存数据到mongo数据库,传入数据参数
def save_mongo(self, data):
# print(data)
# 连接数据库
client = MongoClient()
# 使用数据库表格
col = client['paper']['IEEE']
# 判断数据类型并进行插入操作
if isinstance(data, dict):
res = col.insert_one(data)
return res
else:
return 'wrong type %s' % type(data)
# 网页翻页函数
# 如最后一页或倒数第二、三页没有下一页选项,则会停止翻页(亲测7页抓取了5页)
def next_page(self):
try:
# 在当前页提取下一页提示项
next = self.browser.find_element(By.XPATH, './/li[@class="next-btn"]')
# 判断是否有下一页
if next:
# 点击进入下一页
next.click()
# 调用获取和分析数据函数
self.get_parse_data()
else:
# 如果没有下一页,则关闭浏览器
self.browser.close()
except Exception as e:
print(e)
if __name__ == '__main__':
paper = Paper()
# 提示输入要查询的关键词
print('please entry keywords you want to query:')
keywords = str(input())
# 调用查询关键词函数
paper.query_keywords(keywords)
# 调用获取数据和解析数据函数
paper.get_parse_data()
二、TODO
- 指定页数,获取数据
- 进一步解析论文信息,独立划分year,volume,type,publisher并保存
跳转进入论文主页获取更多信息
总结
本文仅实现基本爬取任务,由于时间不多、需求不大,暂满足爬取需求,先进行阶段性的记录,后续有时间和需求再进行完善。
有什么问题和不足的地方欢迎大佬指教。
(如有大佬闲暇之余进行爬虫升级,还请评论更新,不胜感激)