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耗时问题,按优先级推荐:
- 回归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')
- 替换型邮箱:用正则表达式替换符号,示例代码:
- 放弃Selenium,直接请求MDPI的文章数据接口,接口返回的内容中通常包含作者邮箱的原始格式(可能是
- 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')))
- 启用无头模式:
- 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
相关产品推荐
相关产品推荐

