首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TimeoutException Selenium

TimeoutException Selenium
EN

Stack Overflow用户
提问于 2021-01-26 22:30:34
回答 1查看 29关注 0票数 0

启动抓取器后,奇怪的事情发生了:它要么正常工作,在访问第二个页面并单击下一步按钮后结束,要么以某种方式结束在属性页上,当我使用当前注释掉的代码行时。然而,当这行代码像现在这样放置时,它似乎起作用了,它访问所有页面并抓取它们,最终,我得到了一个超时。我不确定问题出在哪里?有什么建议吗?当前代码:

代码语言:javascript
复制
class PropertyFoxSpider(scrapy.Spider):
    name = 'property_fox'
    start_urls = [
        'https://propertyfox.co.za/listing-search?currentpage=1&term_id=62515&keywords=Western+Cape&orderby=createddate:desc&status%5B%5D=Active'
    ]


    def __init__(self):
        #path to driver
        self.driver = webdriver.Chrome('my_path')
    

    def parse(self,response):
        url = self.driver.get(response.url)
        while True:
            WebDriverWait(self.driver, 10).until(lambda driver: self.driver.current_url != url) 
            try: 
                elem = WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.ID, "pagerNext")))
                elem.click()
                #WebDriverWait(self.driver, 10).until(lambda driver: self.driver.current_url != url)
                url = self.driver.current_url
                yield scrapy.Request(url=url, callback=self.parse_page, dont_filter=False)
            except TimeoutException:
                break



    def parse_page(self, response):
        for prop in response.css('div.property-item'):
            link = prop.css('a::attr(href)').get()
            banner = prop.css('div.property-figure-icon div::text').get()
            sold_tag = None
            if banner:
                banner = banner.strip()
                sold_tag = 'sold' if 'sold' in banner.lower() else None

            yield scrapy.Request(
                link,
                callback=self.parse_property,
                meta={'item': {
                    'agency': self.name,
                    'url': link,
                    'offering': 'buy',
                    'banners': banner,
                    'sold_tag':  sold_tag,
                }},
            )

    def parse_property(self, response):
        item = response.meta.get('item')
    ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-26 23:12:49

似乎Selenium甚至将Next按钮禁用为可点击元素,甚至在最后一页仍然尝试单击它。您可以尝试以下代码以使其工作:

代码语言:javascript
复制
def parse(self,response):
    self.driver.get(response.url)
    url = self.driver.current_url
    while True:
        try: 
            elem = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//span[@id="pagerNext" and not(@class="disabled")]')))
            elem.click()
        except TimeoutException:
            break
        WebDriverWait(self.driver, 10).until(lambda driver: self.driver.current_url != url)
        url = self.driver.current_url
        yield scrapy.Request(url=url, callback=self.parse_page, dont_filter=False)

请注意,我将(By.ID, "pagerNext")定位器替换为(By.XPATH, '//span[@id="pagerNext" and not(@class="disabled")]'),因此现在只会单击已启用的下一步按钮

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65903249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档