|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 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/>
- 游览器对象关闭~
复制代码
我想知道导致此结果的原因,并且返回响应对象时应如何执行整理操作(关闭浏览器)?
希望你能帮帮我,感谢。 |
|