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)
我试图从 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>
标签而不是数百个你可以使用
使用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]
理想情况下你必须诱导 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>
你可以使用
使用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)