Я пытаюсь очистить данные с веб-сайта. Scrapy сама по себе не работала (я получаю HTTP 403), что заставило меня поверить, что есть некоторые контрмеры на основе пользовательского интерфейса (например, проверка разрешения).Scrapy блокируется даже селеном; Селен сам по себе не делает?
Затем я попробовал Selenium; очень простой скрипт, нажимая свой путь через сайт, работает отлично. Вот соответствующий отрывок из того, что работает:
driver.get(start_url)
try:
link_next = driver.wait.until(EC.presence_of_element_located(
(By.XPATH, '//a[contains(.,"Next")]')))
link_next.click()
Теперь для того, чтобы хранить данные, я все равно буду нуждаться Scrapy. Поэтому я написал сценарий, объединяющий Scrapy и Selenium.
class MyClass(CrawlSpider):
...
start_urls = [
"domainiwanttocrawl.com?page=1",
]
def __init__(self):
self.driver = webdriver.Firefox()
self.driver.wait = WebDriverWait(self.driver, 2)
def parse(self, response):
self.driver.get(response.url)
while True:
try:
link_next = self.driver.wait.until(EC.presence_of_element_located((By.XPATH, '//a[contains(.,"Next")]')))
self.driver.wait = WebDriverWait(self.driver, 2)
link_next.click()
item = MyItem()
item['source_url'] = response.url
item['myitem'] = ...
return item
except:
break
self.driver.close()
Но это будет также просто привести к HTTP 403. Если я добавить что-то вроде self.driver.get(url)
к методу __init__
, который будет работать, но ничего кроме этого.
Таким образом, по существу: функция получения селена продолжает работать, в то время как любая Scrapy делает под капотом с тем, что она находит в start_urls
, блокируется. Но я не знаю, как «запустить» сканирование без start_urls
. Кажется, что Scrapy и Selenium пока еще не интегрированы.
Любая идея, почему и что я могу сделать?
Scrapy и Селен действительно не интегрированы. Scrapy предназначена для выполнения собственных HTTP-запросов. Если вы выполняете вызовы Selenium в методах Spider Scrap, они не будут автоматически преобразовывать их в экземпляры Scrapy 'Response'.Так что все, что находится в 'start_urls', будет проходить через загрузчика Scrapy, а не через Selenium, поэтому показывая те же 403s. –
Спасибо. Но как я могу их интегрировать, чтобы любое взаимодействие с сервером проходило через Selenium? Или это просто невозможно? – rubykatz