【问题标题】:How to scrape Price from a site that has a changing structure?如何从结构不断变化的网站中获取价格?
【发布时间】:2017-04-12 07:43:17
【问题描述】:

我想从一个名为 Flipkart 的电子商务网站上抓取定价数据,我尝试将 Beautifulsoup 与 casperjs(nodejs 实用程序)和类似库一起使用,但它们都不够好。

这是网址和结构。 https://www.flipkart.com/redmi-note-4-gold-32-gb/p/itmer37fmekafqct?

问题在于布局...有什么方法可以解决这个问题?

P.S :无论如何我可以在不知道复杂数学的情况下应用机器学习来获取定价数据吗?比如我什至从哪里开始?

【问题讨论】:

  • soup.find('div', { 'class' : '_1vC4OE _37U4_g' }).get_text() maby ?你能发布你的代码吗?
  • 问题是类名是动态的。它每天都会更新。他们甚至改变了该部分的布局!
  • 您可能应该以某种方式构造您的 XPath,使其不依赖于类,而是依赖于您想要匹配的元素的内容 (node())。 data-reactid 也会改变吗?
  • 是的,我问过很多运营价格比较网站的开发人员,他们都说最好从你的抓取机器人中排除 Flipkart,因为它会经常中断。

标签: python web-scraping information-extraction


【解决方案1】:

您可能应该以某种方式构造您的 XPath,使其不依赖于类,而是依赖于您要匹配的元素的内容 (node())。或者你可以匹配data-reactid,如果它没有改变?

通过 data-reactid 匹配 div:

//div[@data-reactid=220]

或根据位置匹配 div:

//span[child::img[@src="//img1a.flixcart.com/www/linchpin/fk-cp-zion/img/fa_8b4b59.png"]]/preceding-sibling::div

假设 img_path 没有改变你是安全的。

【讨论】:

    【解决方案2】:

    由于动态变化导致您无法使用 xpath,您可能可以尝试使用正则表达式在页面上的 script 标记中查找价格。 像这样的:

    import requests
    import re
    
    url = "https://www.flipkart.com/redmi-note-4-gold-32-gb/p/itmer37fmekafqct"
    r = requests.get(url)
    pattern = re.compile('prexoAvailable\":[\w]+,\"price\":(\d+)')
    result = pattern.search(r.text)
    print(result.group(1))
    

    【讨论】:

      【解决方案3】:
      from bs4 import BeatifulSoup
      page = request.get(url, headers)
      soup = BeautifulSoup(page.content, 'html.parser')
      for a in soup.findAll('a', href=True, attrs={'class': '_31qSD5'}):
            price = a.find('div', attrs={'class': '_1vC4OE _2rQ-NK'})
            print(price.text)
      

      【讨论】:

      • 您好,谢谢您的回答。您能否在您的代码中添加一些 cmets,以便人们更容易看到它的作用?
      • 正如问题 cmets 中已经提到的,作者无法通过类名获取所需的元素,因为它们正在动态更改。
      【解决方案4】:

      电子商务不再允许像以前那样抓取数据,产品的每个实体,如产品价格、规格、评论现在都包含在一个单独的“动态”类名中。

      从网页中抓取某些数据,您需要使用特定的动态类名。所以使用request.get()soup() 是行不通的。

      【讨论】:

      • 或者,您可以废弃内容并将其保存在本地并相应地访问价格。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      相关资源
      最近更新 更多