如何用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的超时参数 - 去重操作是为了避免同一页因关键词多次出现导致重复抓取
后续处理示例
- 用Camelot提取指定页面表格
import camelot # 在关闭浏览器前获取PDF的URL pdf_url = driver.current_url tables = camelot.read_pdf(pdf_url, pages=','.join(map(str, matching_pages)))
- 选择性下载指定页面
通过模拟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
相关产品推荐
相关产品推荐

