我是 webscraping 的初学者,我可能会问错误的问题:) 为了工作 scrapy+selenium 我创建了中间件
class SeleniumDownloaderMiddleware(object):
def __init__(self):
self.driver = None
@classmethod
def from_crawler(cls, crawler):
middleware = cls()
crawler.signals.connect(middleware.spider_opened,\
signals.spider_opened)
crawler.signals.connect(middleware.spider_closed,\
signals.spider_closed)
return middleware
def process_request(self, request, spider):
try:
# JS processing
self.driver.get(request.url)
body = to_bytes(self.driver.page_source)
return HtmlResponse(self.driver.current_url, body=body,\
encoding='utf-8', request=request)
# CRASH ERROR
except (WebDriverException, NoSuchWindowException):
SeleniumDownloaderMiddleware.spider_opened(self, spider)
self.driver.get(request.url)
body = to_bytes(self.driver.page_source)
return HtmlResponse(self.driver.current_url, body=body,/
encoding='utf-8', request=request)
def spider_opened(self, spider):
#BAN ON DOWNLOADING
options.add_experimental_option("prefs", {
"download.default_directory": "NUL",
"download.prompt_for_download": False,
})
options.add_argument('--ignore-certificate-errors')
options.add_argument("--test-type")
self.driver = webdriver.Chrome(chrome_options=options)
def spider_closed(self, spider):
if self.driver:
self.driver.close()
self.driver.quit()
self.driver = None
现在来自scrapy的任何请求都首先进入这个selenium中间件,但我想在不使用这个中间件的情况下保存pdf,只进入scrapy spider
def parse(self, response):
# PDF
for href in response.css('a[href$=".pdf"]::attr(href)').extract() +\
response.css('a[href$=".PDF"]::attr(href)').extract():
url = response.urljoin(href)
yield Request(url=response.urljoin(href), callback=self.save_pdf,
priority=1)
def save_pdf(self, response):
path = response.url.split('/')[-1]
self.logger.info('Saving PDF %s', path)
self.counter += 1
with open(os.path.join(self.folder, str(self.counter)), 'wb') as
file:
file.write(response.body)
我如何构建scrapy请求以忽略硒中间件?