如何从walmart.com抓取产品的营养成分数据?

时间:2018-07-15 02:16:05

标签: python beautifulsoup urllib

我已经尝试将urllib与Beautifulsoup一起使用。我总是通过使用带有相关标签的汤。选择得到空的结果。 我是Python的新手。非常感谢您的提前帮助!

随附的代码供您参考。

import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import pandas as pd
url="https://www.walmart.com/ip/Twin-Pack-Kellogg-s-Frosted-Mini-Wheats-Breakfast-Cereal-48-Oz/940504168"
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, "html.parser")
name_box = soup.select('div.nutrition-facts-all-facts-servingSize.div.span')
print(name_box)

1 个答案:

答案 0 :(得分:0)

您选择了一个相当尴尬的页面来开始进行网络抓取,因为您要获取的页面具有很多javascript渲染。因此,您不能简单地将信息传递给BeautfulSoup并获取所需的信息。也就是说,您获得的HTML将不同于在浏览器中查看源代码时看到的HTML。

您可以调查使用诸如硒之类的东西,以通过浏览器获取最终的HTML,然后使用BeautifulSoup对其进行解析。另外,最快的方法是查看所需的信息是否已经埋藏在您拥有的信息中。在这种情况下,您可以将其作为JSON嵌入在返回的<script>部分之一中。

可以使用以下代码提取JSON:

import urllib.request
from bs4 import BeautifulSoup
import json
import re

url = "https://www.walmart.com/ip/Twin-Pack-Kellogg-s-Frosted-Mini-Wheats-Breakfast-Cereal-48-Oz/940504168"
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, "html.parser")

for script in soup.find_all('script'):
    if '_setReduxState' in script.text:
        re_json = re.search('__WML_REDUX_INITIAL_STATE__ = ({.*\});}', script.text)
        data = json.loads(re_json.group(1))
        product_id = data['product']['midasContext']['productId']
        print(data['product']['idmlMap'][product_id]['modules']['NutritionFacts'])

这将使您data拥有一个非常深的JSON结构,其中包含您可能需要的所有信息。我建议打印data以查看所有可用信息。

例如data['product']['idmlMap'][product_id]['modules']['NutritionFacts']为您提供了所有的营养信息,但是您可能需要更具体一些以获取所需的确切信息。

此结构中的某些元素包含页面上使用的HTML,因此您可能需要进一步解析其中的某些元素,以提取所需的位。