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

Scrapy Crawl Spider多搜索查询传递问题及代码错误求助

问题描述

需要通过Scrapy提取邮箱ID,希望传入多关键词列表search_query=['info','contact','sales','marketing','market places']依次执行搜索查询,但原代码在处理列表时出现错误,请求修复。

修改后的完整代码
import scrapy
from scrapy.spiders import CrawlSpider
from googlesearch import search
import re
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import openpyxl

# 加载Excel文件(请填入实际文件路径)
wb = openpyxl.load_workbook("your_file_path.xlsx")
sh = wb.active  # 修正:active是属性而非方法,去掉括号

class EmailExtractor(CrawlSpider):
    name = 'email_ex'

    def __init__(self, query=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.email_list = []
        # 统一将输入转为列表,兼容单个关键词或多关键词列表
        self.queries = query if isinstance(query, list) else [query] if query else []

    def start_requests(self):
        # 遍历每个搜索关键词,依次执行搜索
        for query in self.queries:
            for result_url in search(query, num=10, stop=None, pause=2):
                yield SeleniumRequest(
                    url=result_url,
                    callback=self.parse,
                    wait_until=EC.presence_of_element_located((By.TAG_NAME, "html")),
                    dont_filter=True
                )

    def parse(self, response):
        EMAIL_REGEX = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
        # 从当前响应文本中匹配所有邮箱
        emails = re.finditer(EMAIL_REGEX, response.text)
        
        current_emails = []
        for email in emails:
            current_emails.append(email.group())
        
        # 去重后返回结果,避免跨请求数据污染
        for email in set(current_emails):
            yield {"emails": email}

# 运行方式1:脚本直接启动
if __name__ == "__main__":
    from scrapy.crawler import CrawlerProcess
    search_queries = ['info','contact','sales','marketing','market places']
    process = CrawlerProcess()
    process.crawl(EmailExtractor, query=search_queries)
    process.start()

# 运行方式2:命令行传参
# scrapy crawl email_ex -a query="['info','contact','sales','marketing','market places']"
关键修改说明
  • 兼容多关键词输入:修改__init__方法,将传入的查询参数统一转为列表类型,不管是单个关键词还是多关键词列表都能正常处理。
  • 遍历多关键词搜索:在start_requests中新增外层循环,逐个遍历关键词执行搜索,确保每个关键词都能触发对应的页面请求。
  • 修复Excel操作错误:原代码中wb.active()是错误写法,active是Workbook的属性而非方法,改为wb.active。
  • 优化邮箱去重逻辑:改用局部变量current_emails收集当前页面的邮箱,避免使用实例变量导致的跨请求数据污染,每个请求独立完成去重和结果输出。
  • 提供两种运行方式:支持脚本直接启动和命令行传参启动,方便不同场景测试使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:55:28