鱼C论坛

 找回密码
 立即注册
查看: 2907|回复: 1

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

[复制链接]
发表于 2021-4-23 16:18:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

我正在编写一个 Scrapy 对接 Selenium 的下载中间件:
  1. # Spider.py
  2. import scrapy

  3. class TestSpider(scrapy.Spider):
  4.     name = 'test'
  5.     # allowed_domains = ['xxx.com']
  6.     start_urls = ['http://httpbin.org/']

  7.     def parse(self, response):
  8.         print(response)

  9. # Middlewares.py
  10. from selenium import webdriver
  11. from selenium.webdriver.common.by import By
  12. from selenium.webdriver.support.wait import WebDriverWait
  13. from selenium.webdriver.support import expected_conditions as EC
  14. from selenium.common.exceptions import TimeoutException
  15. from fake_useragent import UserAgent
  16. from scrapy.http import HtmlResponse

  17. class SeleniumMiddleware:
  18.     """对接Selenium"""

  19.     def __init__(self):
  20.         self.browser = webdriver.Chrome()
  21.         self.browser.maximize_window()
  22.         self.wait = WebDriverWait(self.browser, 10)

  23.     @classmethod
  24.     def from_crawler(cls, crawler):
  25.         return cls()

  26.     def process_request(self, request, spider):
  27.         try:
  28.             # 判断哪些链接需要使用selenium程序访问
  29.             if request.url in spider.start_urls:
  30.                 self.browser.get(request.url)
  31.                 # 等待数据加载
  32.                 self.wait.until(EC.presence_of_element_located((
  33.                     By.ID, 'operations-tag-HTTP_Methods')))
  34.                 page_text = self.browser.page_source    # 获取包含动态加载的数据
  35.                 # 返回Response对象
  36.                 return HtmlResponse(url=request.url, body=page_text, encoding='utf-8',request=request, status=200)
  37.         except TimeoutException:
  38.             # 超时
  39.             return HtmlResponse(url=request.url, status=500, request=request)

  40.     def __del__(self):
  41.         print('游览器对象关闭~')
  42.         self.browser.quit()
复制代码


当我测试程序时,我发现当返回了响应对象,程序没有执行 del 的操作,导致打开的游览器无法如预期那样关闭。

运行结果如下:

  1. 1
  2. <200 http://httpbin.org/>
复制代码


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

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


输出结果:

  1. 1
  2. <200 http://httpbin.org/>
  3. 游览器对象关闭~
复制代码


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

希望你能帮帮我,感谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-23 21:20:36 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-7 12:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表