Scrapy и Selenium StaleElementReferenceException
На странице есть несколько элементов, поддерживающих клики, и я пытаюсь очистить некоторые страницы, но у меня есть эта ошибка, и паук закрывается после первого клика:
StaleElementReferenceException: Message: Element not found in the cache - perhaps the page has changed since it was looked up
Пока я просто пытаюсь открыть страницу, чтобы поймать новый URL. Вот мой код
from scrapy import signals
from scrapy.http import TextResponse
from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.xlib.pydispatch import dispatcher
from MySpider.items import MyItem
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
import time
class MySpider(Spider):
name = "myspider"
allowed_domains = ["http://example.com"]
base_url = 'http://example.com'
start_urls = ["http://example.com/Page.aspx",]
def __init__(self):
self.driver = webdriver.Firefox()
dispatcher.connect(self.spider_closed, signals.spider_closed)
def spider_closed(self, spider):
self.driver.close()
def parse(self, response):
self.driver.get(response.url)
item = MyItem()
links = self.driver.find_elements_by_xpath("//input[@class='GetData']")
for button in links:
button.click()
time.sleep(5)
source = self.driver.page_source
sel = Selector(text=source) # create a Selector object
item['url'] = self.driver.current_url
print '\n\nURL\n', item['url'], '\n'
yield item
1 ответ
Решение
Потому что элементы ссылки находятся на первой странице. Если вы открываете новую страницу, элементы ссылки устаревают.
Вы можете попробовать эти два решения:
1, сохранить ссылку ссылки элементов ссылки и использовать driver.get(url)
открыть ссылку.
def parse(self, response):
self.driver.get(response.url)
item = MyItem()
links = self.driver.find_elements_by_xpath("//input[@class='GetData']")
link_urls = links.get_attribute("href")
for link_url in link_urls:
self.driver.get(link_url)
time.sleep(5)
source = self.driver.page_source
sel = Selector(text=source) # create a Selector object
item['url'] = self.driver.current_url
print '\n\nURL\n', item['url'], '\n'
yield item
2, после того, как нажмите на ссылку и получите URL, позвоните driver.back()
вернуться на первую страницу. Затем повторно найдите элементы ссылки.
def parse(self, response):
self.driver.get(response.url)
item = MyItem()
links = self.driver.find_elements_by_xpath("//input[@class='GetData']")
for i in range(len(links)):
links[i].click()
time.sleep(5)
source = self.driver.page_source
sel = Selector(text=source) # create a Selector object
item['url'] = self.driver.current_url
print '\n\nURL\n', item['url'], '\n'
yield item
self.driver.back()
links = self.driver.find_elements_by_xpath("//input[@class='GetData']")