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

Scrapy+Selenium爬取问题:元素不全与效率优化求助

解决MDPI生物材料文章爬取的三个核心问题

一、每页仅获取15条文章的解决方法

MDPI列表页默认展示15条,可通过以下方式强制获取50条:

  • 直接修改URL参数:检查目标列表页的URL,通常包含per_page或itemsPerPage参数,将其值改为50。例如原URL为https://www.mdpi.com/journal/biomaterials/articles?page=1,修改为https://www.mdpi.com/journal/biomaterials/articles?page=1&per_page=50,直接用Scrapy构造该请求即可获取50条数据,无需依赖Selenium。
  • 抓取API接口:打开浏览器开发者工具的「网络」面板,切换到XHR过滤,刷新页面后找到返回文章列表的API请求(通常是/api/articles类的接口),查看请求参数中的条数设置(比如limit=15),将其改为limit=50,直接用Scrapy请求该接口获取JSON格式数据,效率远高于页面渲染。
  • Selenium模拟选择(仅作为备选):若必须用Selenium,定位页面上的「显示条数」下拉框(通常是select元素),通过Select(driver.find_element(By.XPATH, '//select[@name="per_page"]')).select_by_value('50')选择50条,等待页面加载完成后再爬取。

二、爬取效率优化方案

针对你遇到的JS隐藏邮箱和Selenium耗时问题,按优先级推荐:

  1. 回归Scrapy+接口爬取,解密邮箱
    • 放弃Selenium,直接请求MDPI的文章数据接口,接口返回的内容中通常包含作者邮箱的原始格式(可能是user[at]mdpi[dot]com或base64编码),用Python直接处理解密:
      • 替换型邮箱:用正则表达式替换符号,示例代码:
        import re
        def decode_email(encoded_email):
            return re.sub(r'\[at\]', '@', re.sub(r'\[dot\]', '.', encoded_email))
        
      • Base64编码邮箱:直接解码,示例代码:
        import base64
        def decode_b64_email(encoded_email):
            return base64.b64decode(encoded_email).decode('utf-8')
        
  2. Selenium性能优化(仅当必须使用时)
    • 启用无头模式:
      from selenium import webdriver
      options = webdriver.ChromeOptions()
      options.add_argument('--headless=new')
      driver = webdriver.Chrome(options=options)
      
    • 禁用非必要资源:关闭图片、CSS加载,减少渲染时间:
      options.add_argument('--blink-settings=imagesEnabled=false')
      options.add_argument('--disable-css')
      
    • 复用浏览器实例:避免每次请求启动新浏览器,用driver.get()切换页面,或使用Selenium Grid实现多浏览器并行。
    • 精准等待:用WebDriverWait替代time.sleep(),仅等待必要元素加载:
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, 'article-item')))
      
  3. Scrapy常规优化
    • 调整并发参数:在settings.py中设置CONCURRENT_REQUESTS = 16(根据网站反爬强度调整),DOWNLOAD_DELAY = 1避免被封。
    • 启用自动限速:开启AUTOTHROTTLE_EXTENSION,让Scrapy根据网站响应自动调整请求速率。
    • 异步数据处理:使用异步数据库驱动(如aiomysql)在Item Pipeline中异步存储数据,避免阻塞爬虫。

三、参考文档

  • Scrapy官方文档:核心请求构造、异步处理、扩展配置章节
  • Selenium官方文档:无头浏览器配置、元素等待、性能优化部分
  • Python官方文档:re正则模块、base64编码模块使用说明
  • MDPI网站内部API接口:通过浏览器开发者工具自行分析接口参数与返回格式

内容的提问来源于stack exchange,提问作者mohamed agnaby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:32:52