【问题标题】:Web-Scrape , looking for better way to get class or tag xpath and dynamic webpageWeb-Scrape ,寻找更好的方法来获取类或标记 xpath 和动态网页
【发布时间】:2021-07-23 08:46:11
【问题描述】:

这是我的网络抓取目标网站。 https://www.aliexpress.com/wholesale?catId=0&SearchText=ipad&SortType=default&g=n&page=1

使用此代码,我可以获得 60 件商品。

import time
from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
options.add_argument('headless')
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_argument('--lang=en')
driver = webdriver.Chrome(r'c:\chromedriver\chromedriver.exe', options=options)
options.add_argument(
    "user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36")
url = 'https://www.aliexpress.com/wholesale?catId=0&SearchText=ipad&SortType=default&g=n&page=1'
driver.get(url)
sleep(1)
y = 1000
for timer in range(0, 13):
    driver.execute_script("window.scrollTo(0, " + str(y) + ")")
    y += 1000
    time.sleep(1)

items = driver.find_elements_by_xpath('//div[contains(@class, "_2E_KG")]')
print(len(items))

我发现这个网页是动态的,所以我添加了这样的滚动。

for timer in range(0, 13):
    driver.execute_script("window.scrollTo(0, " + str(y) + ")")
    y += 1000
    time.sleep(1)

它有点慢,但对我来说看起来不错。 或者你有更好的想法吗?

并使用下面的 xpath 查找来获取项目。

items = driver.find_elements_by_xpath('//div[contains(@class, "_2E_KG")]')

但我相信有一天类名(_2E_KG)会改变,我想放入一个稳定的xpath,但我不知道它会是什么。

【问题讨论】:

    标签: python web-scraping xpath


    【解决方案1】:

    使用开发工具可以轻松获取XPath,如下图:

    结果将是//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]/div[1],最后删除[1],你就拥有了动态的XPath!

    【讨论】:

    • 我正在尝试以您的方式使用 xpath 获取产品标题(复制 xpath),然后我得到 "//*[@id="root"]/div/div/div[2]/div [2]/div/div[2]/div[1]/div[1]/div[1]/a/span/text()”。 title = driver.find_element_by_xpath('//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]/div[2]/div[1]/ div[1]/a/span/text()'), print(title),但我没有收到文本。你知道为什么吗?这是我收到的错误消息。无效的选择器:xpath 表达式的结果 "//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]/div[2]/div[ 1]/div[1]/a/span/text()" 是:[对象文本]。它应该是一个元素。
    • 尝试使用 Copy full XPath 选项,我认为 selenium 无法处理 *[@id="root"]。你应该有这样的东西:/html/body/div[3]/div/div/div[2]/div[2]/div/div[2]/div
    • 我试过 items = driver.find_elements_by_xpath('//*[@id="root"]/div/div/div[2]/div[2]/div/div[2]/ div'), title = item.find_element_by_xpath('.//div[1]/div[1]/a/span').text.有用。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多