Selenium 无法获取所有 div 标签

Selenium Couldn't fetch all div tag

我试图从 website

中获取所有带有 class 的“someClass”的特殊 div 标签

网站需要向下滚动才能加载新的 div 元素 所以我使用了 Keys.PAGE_DOWN,它可以工作并滚动,但数据又不完整

所以我用了:

elem = driver.find_element(By.TAG_NAME, "body")


no_of_pagedowns = 23

while no_of_pagedowns:
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.7)
    no_of_pagedowns-=1

它将滚动直到整个 html 页面加载完毕 但是当我想在文件中写入数据时,它只写入 20 div 标记而不是百...

完整代码:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager


driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

url = 'https://divar.ir/s/tehran/buy-apartment/parand?price=200000000-450000000&non-negotiable=true&has-photo=true&q=%D8%AE%D8%A7%D9%86%D9%87%20%D9%BE%D8%B1%D9%86%D8%AF'
driver.get(url)


elem = driver.find_element(By.TAG_NAME, "body")


no_of_pagedowns = 23

while no_of_pagedowns:
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.3)
    no_of_pagedowns-=1

datas = driver.find_elements(By.CLASS_NAME, 'kt-post-card__body')

f = open('data.txt', 'w')
counter = 1
for data in range(len(datas)):
    f.write(f'{counter}--> {datas[data].text}')
    counter += 1
    f.write('\n')

f.close()
driver.quit()

到select只有20个<div>标签而不是数百个你可以使用 and you can use either of the following :

  • 使用CSS_SELECTOR

    elements = driver.find_elements(By.CSS_SELECTOR, "div.kt-post-card__body")[:20]
    
  • 使用 XPATH:

    elements = driver.find_elements(By.XPATH, "//div[@class='kt-post-card__body']")[:20]
    

理想情况下你必须诱导 for the visibility_of_all_elements_located() and you can use either of the following :

  • 使用CSS_SELECTOR

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.kt-post-card__body")))[:20]
    
  • 使用 XPATH:

    elements = WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='kt-post-card__body']")))[:20]
    

更新

致select所有<div>人:

到select所有<div>你可以使用 and you can use either of the following :

  • 使用CSS_SELECTOR

    elements = driver.find_elements(By.CSS_SELECTOR, "div.kt-post-card__body")
    
  • 使用 XPATH:

    elements = driver.find_elements(By.XPATH, "//div[@class='kt-post-card__body']")
    

我查看了网站,发现他们使用 api 和光标获取数据为 json。这里的游标是用时间表达式和名为 last-post-date 的变量制作的。当进入站点时,此值在 json 中作为 lastPostDate 给出。 要从站点快速获取数据,可以使用此请求: https://divar.ir/s/tehran/buy-apartment/parand?price=200000000-450000000&non-negotiable=true&has-photo=true&q=%D8%AE%D8%A7%D9%86%D9%87%20%D9%BE%D8%B1%D9%86%D8%AF lastPostDate 值应从此 link 中获取,下面 JSON 中的 lastPostDate 值应使用它更新。

{"json_schema":{"category":{"value":"apartment-sell"},"districts":{"vacancies":["427"]},"price":{"max":450000000,"min":200000000},"non-negotiable":true,"has-photo":true,"query":"خانه پرند"},"last-post-date":1647005920188580}

更新后的 JSON 应作为 POST 发送至下面的 API link。 https://api.divar.ir/v8/search/1/apartment-sell

并且应该返回一个新的 JSON。在这个 JSON 里面有一个“last_post_date”。可以使用此变量进行新查询。还需要的数据存储在这个 JSON.

这只是一个想法。当我用 POSTMAN.

测试它时,它似乎工作正常

问题是隐式分页!

所以我使用 for 循环,每次更新页码:)

for page in range(1, 11):
    url = f'https://divar.ir/s/tehran/buy-apartment/parand?price=450000000-200000000&non-negotiable=true&has-photo=true&page={page}'
    driver.get(url)