【问题标题】:I'm trying to scrape some data from a webpage and keep getting selenium.common.exceptions.TimeoutException errors我正在尝试从网页中抓取一些数据并不断收到 selenium.common.exceptions.TimeoutException 错误
【发布时间】:2021-08-24 08:12:32
【问题描述】:

我已经用请求 + 美丽的汤从第一页抓取了我想要的元素,并尝试使用 selenium 单击一个按钮,该按钮加载另一个页面,其中包含我想要抓取的其余数据。新的 selenium 窗口打开第一页,然后打开第二页,但总是返回某种 selenium.common.exceptions 错误。 File "c:\Users\ArkPr\yelp\yelp_learner.py", line 122, in <module> WebDriverWait(driver, 10).until( File "C:\Users\ArkPr\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\support\wait.py", line 80, in until raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message: 我四处搜索并尝试使用隐式和显式等待 time.sleep(),使用 find_element_by_class_name 和 xpath,使用请求获取数据,我不知道下一步该做什么。

url = "https://www.yelp.co.uk/search?find_desc=Restaurants&find_loc=London&ns=1" 试图从该站点抓取数据

next_page = driver.find_element_by_class_name("css-ac8spe")

try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "css-ac8spe"))
    )
    # element.clear()
    element.click()

except TimeoutException as u:
    print(u)

        # if EC.presence_of_element_located((By.CLASS_NAME, "css-ac8spe")) == True:
# next_page.click()
            # next_page.back()
for li in ul:

    #driver.implicitly_wait(3)

    

    WebDriverWait(driver, 10).until(
    EC.visibility_of_all_elements_located((By.CLASS_NAME, 'stickySidebar__373c0__3MPss border-color--default__373c0__r305k')))
    # EC.presence_of_element_located((By.CLASS_NAME, 'stickySidebar__373c0__3MPss border-color--default__373c0__r305k')))
    
    
    
    sidebar = driver.find_element_by_class_name('stickySidebar__373c0__3MPss border-color--default__373c0__r305k')
    

    
    if sidebar != None:


        for side in sidebar:
            print(side)
            if side != None:
                try: 


                    address = side.find("p", {"class": " css-chtywg"})
                    # address = side.find_element_by_class_name("css-chtywg")
                    print(address.text)

                except TimeoutException as t:
                    print(t)```

【问题讨论】:

  • 页面弹出cookie接受模态需要先去掉。请记住,除非您预加载配置文件,否则您将获得一个干净的用户会话。尝试使用 ID 或 XPATH,xpath 是本机 webdriver 元素,可能更容易捕获。
  • 你要抓取的具体数据是什么?
  • 我只是想抓取餐厅的地址。这个页面的 'p', {'class': 'css-chtywg'} 位里面有什么。

标签: python selenium


【解决方案1】:

您需要在每个帖子上单击更多,然后它会导航到新页面,提取地址并返回原始页面。

driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.implicitly_wait(50)
driver.get("https://www.yelp.co.uk/search?find_desc=Restaurants&find_loc=London&ns=1")
wait = WebDriverWait(driver, 50)
length = len(wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//li[contains(@class,'border-color')]/div[contains(@class, 'container')]"))))
j = 0
for i in range(length):
  elements = wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//li[contains(@class,'border-color')]/div[contains(@class, 'container')]")))
  ActionChains(driver).move_to_element(elements[j]).perform()
  time.sleep(1)
  elements[j].find_element(By.XPATH, ".//descendant::a[text()='more']").click()
  time.sleep(1)
  print(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "p.css-chtywg"))).text)
  driver.execute_script("window.history.go(-1)")
  time.sleep(2)
  j = j +1

【讨论】:

  • 谢谢,您的解决方案很有效,因为它确实返回了我所追求的地址,但之后它没有返回更多地址,而是给了我14 North Audley Street London W1K 6WE Message: element click intercepted: Element <a href="/biz/restaurant-gordon-ramsay-london-3?hrid=I9IvzAT4MAv79qt7F8_TFA&osq=Restaurants" class="css-ac8spe">...</a> is not clickable at point (626, 841). Other element would receive the click: <div class="ot-sdk-row">...</div> (Session info: chrome=92.0.4515.159),它在程序之前重复输出 4 次结束。
  • 其实没关系,你的解决方案效果很好,我只需要让页面向下滚动,否则程序会提前关闭。
  • 是的,如果不出意外的话,它指出我在正确的轨道上,并解决了我问的错误,所以欢呼:) 使用其中一种 driver.script_execute 方法滚动页面,我想就是这样。
  • hmmm ..您可以使用确切的解决方案编辑帖子(我的答案),以便将来的读者很容易,我会从我这边批准您的更改。干杯!
【解决方案2】:

这段代码对我有用。

driver.implicitly_wait(10)
driver.get("https://www.yelp.co.uk/search?find_desc=Restaurants&find_loc=London&ns=1")
res_leng = len(driver.find_elements_by_xpath("//li/div[contains(@class,'container__09f24')]"))
for i in range(res_leng):
    resturants = driver.find_elements_by_xpath("//li/div[contains(@class,'container__09f24')]")
    resturants[i].find_element_by_xpath(".//a[text()='more']").click()
    name = driver.find_element_by_tag_name("h1").text
    address = driver.find_element_by_xpath("//p[@class=' css-chtywg']").text
    print("{} : {}".format(name,address))
    time.sleep(2)
    driver.back()

【讨论】:

  • 这段代码也很好用,我似乎不需要添加任何额外的代码来让它滚动页面,我不明白为什么会这样。
  • 是的,我自己也有这个问题很久了。
猜你喜欢
  • 1970-01-01
  • 2021-10-07
  • 2022-06-26
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多