爬虫获取数据:selenium的应用

当我们在爬取数据时,如:古诗网。有时会出现输出内容不全的情况,针对这种问题如何解决?

个人思路:在遍历网页内容时,如果未发现显示全部内容字样,说明该条数据内容完整,则立即输出。若识别到显示全部内容,则表示内容不全。需要click点击事件,跳转成功后获取该页面中我们主要的数据,例如古诗名、作者、古诗内容等。获取全部数据后返回初始页面,继续寻找显示全部内容。如此循环,直到遍历完成。

此处默认已掌握全部相关知识点,只提供代码。欢迎大家探讨。

复制代码
import time
import random
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
options = webdriver.EdgeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
options = webdriver.EdgeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)

# 加载当前浏览器驱动.exe.sh
edgeDriver = Service("../drivera/msedgedriver.exe")

# 实例化当前的浏览器对象
browser = webdriver.Edge(service=edgeDriver, options=options)

# 设置浏览器超时
wait = WebDriverWait(browser, 10)

browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
  'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
# 数据容器
poem_data = []
count = 1

url = "https://www.shicimingju.com/chaxun/zuozhe/46.html"
browser.get(url)
time.sleep(2)

# 获取所有诗词链接
more_links = browser.find_elements(By.CLASS_NAME, 'more')
total_links = len(more_links)
print(f"第一页找到 {total_links} 个诗词链接")

# 循环处理每个链接
for i, link in enumerate(more_links):
    try:
        print(f"\n--- 处理第 {count}/{total_links} 个链接 ---")

        # 滚动并点击链接
        browser.execute_script("arguments[0].scrollIntoView();", link)
        time.sleep(1)
        link.click()
        time.sleep(2)

        title = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "h1"))
        ).text.strip()

        author_elem = browser.find_elements(By.CSS_SELECTOR, "div.source, .name")
        author = "未知作者"
        if author_elem:
            author = author_elem[0].text.strip()
            author = author.split("·")[-1] if "·" in author else author

        # 提取内容
        content_elem = WebDriverWait(browser, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "text"))
        )
        soup = BeautifulSoup(content_elem.get_attribute('innerHTML'), "html.parser")
        content = soup.get_text().strip()

        # 清理内容
        exclude = ["注释", "赏析", "作品赏析"]
        content = "\n".join([line for line in content.split("\n") if not any(x in line for x in exclude)])

        # 保存数据
        poem_data.append({
            "序号": count,
            "标题": title,
            "作者": author,
            "内容": content
        })


        print("=" * 50)
        print(f"【{title}】 - {author} \n{content}")

        count += 1

        # 返回上一页
        browser.back()
        time.sleep(1)
    finally:
        pass
#
# # 保存到Excel
# if poem_data:
#     pd.DataFrame(poem_data).to_excel("陆游诗词_简化版.xlsx", index=False)
#     print(f"\n成功保存 {len(poem_data)} 条数据")
#
# browser.quit()
相关推荐
iCxhust15 分钟前
C#进程管理程序
开发语言·汇编·stm32·单片机·c#·微机原理
凡人叶枫22 分钟前
Effective C++ 条款28:避免使用 handles 指向对象内部
linux·服务器·开发语言·c++·嵌入式开发
努力成为AK大王31 分钟前
并发编程的核心挑战、优化方案与核心知识点总结
java·开发语言·数据库
数据知道34 分钟前
指纹浏览器本地存储“孤岛化”:IndexedDB、LocalStorage、SessionStorage 的安全隔离
爬虫·安全·数据采集·指纹浏览器
青山如墨雨如画42 分钟前
【北邮-无线通信中的人工智能】物理层技术中AI的应用实践:基于KNN的调制识别(1)理论基础
人工智能·python·机器学习·matlab·jupyter
MATLAB代码顾问1 小时前
Python Matplotlib数据可视化实战指南
python·信息可视化·matplotlib
AI 编程助手GPT1 小时前
用 Python 做一个世界杯赛前分析脚本:以巴西 vs 摩洛哥为例
开发语言·网络·人工智能·python·chatgpt
万事大吉CC1 小时前
Python 笔试输入模板总结
python·算法
lihao lihao1 小时前
Linux信号
开发语言·c++·算法
Java患者·2 小时前
《Python 人脸识别入门实践:从人脸检测到人脸比对完整实现》
开发语言·python·opencv·目标检测·计算机视觉·目标跟踪·视觉检测