我正在编写一个 Scrapy 对接 Selenium 的下载中间件:
# Spider.py
import scrapy
class TestSpider(scrapy.Spider):
name = 'test'
# allowed_domains = ['xxx.com']
start_urls = ['http://httpbin.org/']
def parse(self, response):
print(response)
# Middlewares.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from fake_useragent import UserAgent
from scrapy.http import HtmlResponse
class SeleniumMiddleware:
"""对接Selenium"""
def __init__(self):
self.browser = webdriver.Chrome()
self.browser.maximize_window()
self.wait = WebDriverWait(self.browser, 10)
@classmethod
def from_crawler(cls, crawler):
return cls()
def process_request(self, request, spider):
try:
# 判断哪些链接需要使用selenium程序访问
if request.url in spider.start_urls:
self.browser.get(request.url)
# 等待数据加载
self.wait.until(EC.presence_of_element_located((
By.ID, 'operations-tag-HTTP_Methods')))
page_text = self.browser.page_source # 获取包含动态加载的数据
# 返回Response对象
return HtmlResponse(url=request.url, body=page_text, encoding='utf-8',request=request, status=200)
except TimeoutException:
# 超时
return HtmlResponse(url=request.url, status=500, request=request)
def __del__(self):
print('游览器对象关闭~')
self.browser.quit()
当我测试程序时,我发现当返回了响应对象,程序没有执行 del 的操作,导致打开的游览器无法如预期那样关闭。
运行结果如下:
当我将返回响应对象的代码注释的时候,程序是会执行 del 操作的。
# 返回Response对象
# return HtmlResponse(url=request.url, body=page_text, encoding='utf-8', request=request, status=200)
运行结果:
我想知道是什么原因造成这样的结果,在返回响应对象的情况下我该如何进行收尾操作(关闭游览器)?
希望您能帮帮我,感谢。
已经解决,创建中间件时请使用 `spider_closed`
方法并连接到信号:
--skip--
@classmethod
def from_crawler(cls, crawler):
o = cls()
crawler.signals.connect(o.spider_closed, signals.spider_closed)
return o
--skip--
def spider_closed(self):
"""Close the browser"""
self.browser.quit()
参考: https://github.com/clemfromspace/scrapy-selenium/blob/develop/scrapy_selenium/middlewares.py
Scrapy是异步的,这个不好debug调试,你将你写的代码加个print输出,看那句没输出应该就那里有异常了
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y