Scrapy将parse函数改为start_req后无法运行报错是什么原因
问题根源
这是Scrapy框架的固定约定导致的,和Selenium本身没有关系:
- Scrapy的基础Spider类默认会把
parse作为所有初始请求的回调函数,如果你没有手动在请求里指定其他回调,框架启动后只会自动找名为parse的方法执行。 - 你把方法改名为
start_req之后,这个方法既不是框架默认识别的初始请求生成方法start_requests,也不是默认回调parse,框架根本不会主动调用它,爬虫自然就不会执行你写的逻辑,看起来就像"停止工作"了。
正确写法
你如果要在爬虫启动阶段就调用Selenium加载起始页,需要重写框架预留的start_requests入口方法(注意方法名不能拼错,必须是start_requests),在这个方法里初始化浏览器、加载页面、提取链接、生成后续请求:
from scrapy import Spider from selenium import webdriver from scrapy.selector import Selector from scrapy.http import Request from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options class BookSeleniumSpider(Spider): name = 'book_selenium' allowed_domains = ['books.toscrape.com'] def start_requests(self): # 初始化Chrome驱动 s = Service('C:\\Users\\aps\\Documents\\chromedriver.exe') chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--no-sandbox') # 生产环境建议加上无头参数,避免弹出浏览器窗口 # chrome_options.add_argument('--headless=new') self.driver = webdriver.Chrome(service=s, options=chrome_options) # 加载起始页面 self.driver.get('http://books.toscrape.com') sel = Selector(text=self.driver.page_source) book_links = sel.xpath('//h3/a/@href').extract() for link in book_links: book_url = 'http://books.toscrape.com/' + link # 生成详情页请求,明确指定回调为parse_book yield Request(url=book_url, callback=self.parse_book) def parse_book(self, response): # 编写书籍详情页的解析逻辑 pass # 爬虫结束时自动关闭驱动,避免残留chrome进程 def closed(self, reason): if hasattr(self, 'driver'): self.driver.quit()
补充说明:如果你不想重写
start_requests方法,那处理起始页响应的方法名必须是parse,这是框架的默认规则,没有额外配置的情况下不能随意修改。所有非默认回调的方法,都需要在构造Request对象时通过callback参数明确指定。
内容的提问来源于stack exchange,提问作者Ashutosh Goyal
相关产品推荐
相关产品推荐

