【发布时间】:2020-07-15 14:20:51
【问题描述】:
最近,我一直在尝试从网站上获取大量定价,方法是从一个页面开始,每个页面都链接到起始页面。我希望运行一个脚本,允许我单击某个项目的框,抓取该项目的定价和描述,然后返回起始页面并继续该循环。但是,我在抓取第一个项目后遇到了一个明显的问题。返回起始页面后,容器未定义,因此会给出一个陈旧元素错误,该错误会中断循环并阻止我获取其余项目。这是我用的示例代码,希望能把所有的项一个接一个地刮掉。
driver = webdriver.Chrome(r'C:\Users\Hank\Desktop\chromedriver_win32\chromedriver.exe')
driver.get('https://steamcommunity.com/market/search?q=&category_440_Collection%5B%5D=any&category_440_Type%5B%5D=tag_misc&category_440_Quality%5B%5D=tag_rarity4&appid=440#p1_price_asc')
import time
time.sleep(5)
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException
action = ActionChains(driver)
next_button=wait(driver, 10).until(EC.element_to_be_clickable((By.ID,'searchResults_btn_next')))
def prices_and_effects():
action = ActionChains(driver)
imgs = wait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, 'img.market_listing_item_img.economy_item_hoverable')))
for img in imgs:
ActionChains(driver).move_to_element(img).perform()
print([my_element.text for my_element in wait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.item_desc_description div.item_desc_descriptors#hover_item_descriptors div.descriptor")))])
prices = driver.find_elements(By.CSS_SELECTOR, 'span.market_listing_price.market_listing_price_with_fee')
for price in prices:
print(price.text)
def unusuals():
unusuals = wait(driver, 5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.market_listing_row.market_recent_listing_row.market_listing_searchresult')))
for unusual in unusuals:
unusual.click()
time.sleep(2)
next_button=wait(driver, 10).until(EC.element_to_be_clickable((By.ID,'searchResults_btn_next')))
next_button.click()
time.sleep(2)
back_button=wait(driver, 10).until(EC.element_to_be_clickable((By.ID,'searchResults_btn_prev')))
back_button.click()
time.sleep(2)
prices_and_effects()
ref_val = wait(driver, 10).until(EC.presence_of_element_located((By.ID, 'searchResults_start'))).text
while next_button.get_attribute('class') == 'pagebtn':
next_button.click()
wait(driver, 10).until(lambda driver: wait(driver, 10).until(EC.presence_of_element_located((By.ID,'searchResults_start'))).text != ref_val)
prices_and_effects()
ref_val = wait(driver, 10).until(EC.presence_of_element_located((By.ID, 'searchResults_start'))).text
time.sleep(2)
driver.execute_script("window.history.go(-1)")
time.sleep(2)
unusuals = wait(driver, 5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.market_listing_row.market_recent_listing_row.market_listing_searchresult')))
unusuals()
然而,在成功抓取第一个项目后,它会返回页面并引发过时元素错误。这个错误对我来说是有道理的,但是有什么办法可以规避这个问题,以便我可以保留函数并使用循环?
【问题讨论】:
-
也许 selenium 太过分了,scrapy 就可以了。您必须定义一个“主页”刮板和一个“项目”刮板,然后开始对主页进行刮板,这会创建一个项目列表,该列表将被项目刮板器刮掉
-
而且scrapy可以使用JS,动态元素获取内容?
-
确实好像你需要 JS 来分页。我相信我最初对 Home scrapper 和 Item scrapper 的评论会对您有所帮助。
标签: python selenium selenium-webdriver