Связанный ответ, который @vezunchik уже указал, почти доставит вас туда. Единственная проблема заключается в том, что когда вы используете тот же самый код, у вас будет несколько экземпляров chromedriver. Чтобы использовать один и тот же драйвер несколько раз, вы можете попробовать, как показано ниже.
Создайте файл в своем проекте scrapy middleware.py
и вставьте следующий код:
from scrapy.http import HtmlResponse
from selenium import webdriver
class SeleniumMiddleware(object):
def __init__(self):
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument("--headless")
self.driver = webdriver.Chrome(options=chromeOptions)
def process_request(self, request, spider):
self.driver.get(request.url)
body = self.driver.page_source
return HtmlResponse(self.driver.current_url, body=body, encoding='utf-8', request=request)
Мысль придумать обновление, если вы хотите увидеть, как chmoedriver перемещается в видимом режиме. Чтобы браузер бродил явно, попробуйте вместо этого:
from scrapy import signals
from selenium import webdriver
from scrapy.http import HtmlResponse
from scrapy.xlib.pydispatch import dispatcher
class SeleniumMiddleware(object):
def __init__(self):
self.driver = webdriver.Chrome()
dispatcher.connect(self.spider_closed, signals.spider_closed)
def process_request(self, request, spider):
self.driver.get(request.url)
body = self.driver.page_source
return HtmlResponse(self.driver.current_url, body=body, encoding='utf-8', request=request)
def spider_closed(self):
self.driver.quit()
Используйте следующий скрипт для получения необходимого контента. Будет только один запрос (навигация) для каждого URL, использующего селен через промежуточное ПО. Теперь вы можете использовать Selector()
внутри вашего паука, чтобы получить данные, как я показал ниже.
import sys
# The hardcoded address leads to your project location which ensures that
# you can add middleware reference within crawlerprocess
sys.path.append(r'C:\Users\WCS\Desktop\yourproject')
import scrapy
from scrapy import Selector
from scrapy.crawler import CrawlerProcess
class YPageSpider(scrapy.Spider):
name = "yellowpages"
start_urls = ['https://www.yellowpages.com/search?search_terms=Pizza+Hut&geo_location_terms=San+Francisco%2C+CA']
def parse(self,response):
items = Selector(response)
for elem in items.css(".v-card .info a.business-name::attr(href)").getall():
yield scrapy.Request(url=response.urljoin(elem),callback=self.parse_info)
def parse_info(self,response):
items = Selector(response)
title = items.css(".sales-info > h1::text").get()
yield {"title":title}
if __name__ == '__main__':
c = CrawlerProcess({
'DOWNLOADER_MIDDLEWARES':{'yourspider.middleware.SeleniumMiddleware': 200},
})
c.crawl(YPageSpider)
c.start()