You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Selenium在未下载PDF时抓取含有关键词的页码?

无需下载完整PDF,用Selenium抓取Chrome阅读器中含目标关键词的页码

核心思路

利用Chrome内置PDF阅读器的Ctrl+F搜索功能,通过Selenium模拟快捷键操作,定位页码输入框提取匹配页的页码,循环收集所有匹配结果,全程无需下载完整PDF。

实现步骤

  • 初始化ChromeDriver,打开谷歌搜索结果中的目标PDF页面
  • 触发Ctrl+F调出搜索框,输入目标关键词
  • 循环抓取匹配页码:定位id="pageselector"的输入元素提取当前页码,模拟Tab键切换至下一个匹配结果,直到无新匹配项
  • 去重整理页码为列表或Pandas DataFrame,用于后续处理

完整代码示例

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd

def get_pdf_matching_pages(search_term, target_keyword):
    # 配置Chrome选项,强制用内置阅读器打开PDF
    options = webdriver.ChromeOptions()
    options.add_experimental_option("prefs", {
        "plugins.always_open_pdf_externally": False
    })
    driver = webdriver.Chrome(options=options)
    
    try:
        # 打开谷歌PDF搜索页并点击第一个结果
        search_url = f"https://www.google.com/search?q=filetype:pdf {search_term}"
        driver.get(search_url)
        first_pdf_link = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href$='.pdf']"))
        )
        first_pdf_link.click()
        
        # 切换到PDF标签页
        driver.switch_to.window(driver.window_handles[-1])
        
        # 调出搜索框并输入关键词
        driver.find_element(By.TAG_NAME, "body").send_keys(Keys.CONTROL, 'f')
        search_box = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "input[aria-label='Find in document']"))
        )
        search_box.send_keys(target_keyword)
        search_box.send_keys(Keys.ENTER)
        
        matching_pages = []
        last_page = None
        
        while True:
            # 获取当前匹配页的页码
            page_selector = WebDriverWait(driver, 5).until(
                EC.presence_of_element_located((By.ID, "pageselector"))
            )
            current_page = page_selector.get_attribute("value")
            
            # 无新匹配则退出循环
            if current_page == last_page:
                break
            
            matching_pages.append(current_page)
            last_page = current_page
            
            # 切换到下一个匹配结果
            search_box.send_keys(Keys.TAB)
        
        # 去重并排序页码
        matching_pages = list(set(map(int, matching_pages)))
        matching_pages.sort()
        
        # 转换为DataFrame(可选)
        pages_df = pd.DataFrame({"matching_pages": matching_pages})
        
        return matching_pages, pages_df
    
    finally:
        driver.quit()

# 示例调用
search_term = "机器学习 论文"
target_keyword = "Transformer"
pages, pages_df = get_pdf_matching_pages(search_term, target_keyword)
print("匹配页码列表:", pages)
print("\n匹配页码DataFrame:")
print(pages_df)

注意事项

  • 确保ChromeDriver版本与本地Chrome版本一致,避免兼容性问题
  • 可根据PDF加载速度调整WebDriverWait的超时参数
  • 去重操作是为了避免同一页因关键词多次出现导致重复抓取

后续处理示例

  1. 用Camelot提取指定页面表格
import camelot

# 在关闭浏览器前获取PDF的URL
pdf_url = driver.current_url
tables = camelot.read_pdf(pdf_url, pages=','.join(map(str, matching_pages)))
  1. 选择性下载指定页面
    通过模拟Chrome打印功能,仅保存匹配页码的内容:
# 在获取完页码后执行
driver.find_element(By.TAG_NAME, "body").send_keys(Keys.CONTROL, 'p')
# 定位页码输入框(需根据Chrome版本调整选择器)
page_range_input = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "input[aria-label='Pages']"))
)
page_range_input.clear()
page_range_input.send_keys(','.join(map(str, matching_pages)))
# 点击保存按钮(选择器需适配Chrome版本)
save_button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button[aria-label='Save']"))
)
save_button.click()

内容的提问来源于stack exchange,提问作者Sully H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:54:27