使用Scrapy parse函数+Selenium爬取.net网站失败求助
问题分析与解决方案
你的第一个版本代码无法运行的核心原因有两个:
1. 缺少time模块导入
第一个代码的parse函数中使用了time.sleep(10),但代码顶部没有导入time模块,运行时会直接抛出NameError: name 'time' is not defined,导致执行失败。而第二个类级别的代码里明确导入了time,所以能正常执行。
2. 浏览器资源未正确管理(潜在问题)
在parse函数中启动浏览器后,没有添加关闭浏览器的逻辑,会导致浏览器进程残留,造成资源泄漏。
修正后的parse函数写法
import time import scrapy from scrapy import Selector from selenium import webdriver from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager class BoursakuwaitSpider(scrapy.Spider): name = 'boursakuwait' custom_settings = { 'FEED_URI': 'second.json', 'FEED_FORMAT': 'json', } start_urls = ['https://casierjudiciaire.justice.gov.ma/verification.aspx'] def parse(self, response): # 初始化Chrome浏览器 browser = webdriver.Chrome(executable_path=ChromeDriverManager().install()) try: # 复用start_urls的地址,避免重复硬编码 browser.get(response.url) # 等待页面完全加载(建议用显式等待替代time.sleep,更高效) time.sleep(10) # 将浏览器页面转为Scrapy Selector,方便提取数据 sel = Selector(text=browser.page_source) # 这里添加你的数据提取逻辑,示例: # item = {} # item['some_field'] = sel.xpath('//div[@class="example"]/text()').get() # yield item finally: # 无论是否出错,确保浏览器关闭,释放资源 browser.quit()
额外建议
- 不要在类级别直接初始化浏览器:类级别的代码会在爬虫加载时立即执行,无法利用Scrapy的调度机制,且容易造成多进程泄漏问题。
- 用显式等待替代
time.sleep:time.sleep是固定等待,页面加载完成后仍会浪费时间,显式等待可以在目标元素出现后立即继续执行,示例:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待某个元素出现,最多等10秒 WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.ID, "target_element_id")) )
内容的提问来源于stack exchange,提问作者Med_Maliari
相关产品推荐
相关产品推荐

