wananzuiqingfen 发表于 2021-4-23 16:18:50

Scrapy的下载中间件返回响应对象时,为什么不会执行 del 操作?

本帖最后由 wananzuiqingfen 于 2021-4-23 16:20 编辑

我正在编写一个 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 的操作,导致打开的游览器无法如预期那样关闭。

运行结果如下:

1
<200 http://httpbin.org/>

当我将返回响应对象的代码注释的时候,程序是会执行 del 操作的:

# 返回Response对象
# return HtmlResponse(url=request.url, body=page_text, encoding='utf-8', request=request, status=200)

输出结果:

1
<200 http://httpbin.org/>
游览器对象关闭~

我想知道导致此结果的原因,并且返回响应对象时应如何执行整理操作(关闭浏览器)?

希望你能帮帮我,感谢。

wananzuiqingfen 发表于 2021-4-23 21:20:36

已解决,参考: https://github.com/clemfromspace/scrapy-selenium/blob/develop/scrapy_selenium/middlewares.py
页: [1]
查看完整版本: Scrapy的下载中间件返回响应对象时,为什么不会执行 del 操作?