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
相关产品推荐
相关产品推荐

