【问题标题】:TimeoutException SeleniumTimeoutException 硒
【发布时间】:2021-01-26 23:12:49
【问题描述】:

启动爬虫后,发生了一些奇怪的事情:它要么正常工作,要么在访问第二页并单击“下一步”按钮后结束,要么以某种方式在属性页上结束,当我使用带有当前注释行的代码时出去。但是,当该行按原样放置时,它似乎可以工作,它会访问所有页面并刮掉它们,最终,我得到了时间。我不确定问题是什么?有小费吗? 当前代码:

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')
    ...

【问题讨论】:

    标签: python selenium web-scraping scrapy


    【解决方案1】:

    Selenium 似乎“识别”甚至禁用了 Next 按钮作为可点击元素,并且即使在最后一页上仍然尝试点击它。你可以试试下面的代码让它工作:

    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")]'),所以现在只启用下一步按钮会被点击

    【讨论】:

      猜你喜欢
      • 2022-11-30
      • 2023-03-20
      • 2018-05-08
      • 2023-04-03
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多