微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python - 数据抓取 - Sam's Club 网络抓取代码似乎运行良好,但是否在不应该出现的位置打印了 N/A 填充值?

如何解决Python - 数据抓取 - Sam's Club 网络抓取代码似乎运行良好,但是否在不应该出现的位置打印了 N/A 填充值?

我试图理解为什么当网站为要抓取的代码提供值时,这个 Sam's Club 网络抓取代码似乎选择了 N/A 填充值。

我在顶部提供了三个不同的 URL,它们在不同程度上复制了该问题。

像 Oreo 和 Reese 这样的一般品牌搜索似乎效果很好,但出于某种原因,网站上有些商品有价格,其中代码填写了 N/A 表示价格。

然后,如果您尝试对 Sodas 进行 #url3 之类的整体类别搜索,则超过一半的价格会被填充为 N/A。

问题:

1.) 为什么代码正确抓取了部分数据,而不是全部数据?

2.) 这是代码循环和填充 N/A 值的错误,还是因为 Sam's Club 的网站/服务器架构?

预先感谢您,代码如下:

import requests
import itertools
import pandas as pd
from bs4 import BeautifulSoup



url = "https://www.samsclub.com/s/oreo"                                      #url1
#url = "https://www.samsclub.com/s/reeses"                                   #url2
#url = 'https://www.samsclub.com/b/soda/2080101?xid=cat1499-beve_vnav_5_3'   #url3





headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/62.0.3202.94 Safari/537.36','X-Requested-With': 'XMLHttpRequest','Accept': 'application/json,text/javascript,*/*; q=0.01','Cookie': 'localeEditionShown_en=true; permutive-session=^%^7B^%^22session_id^%^22^%^3A^%^22e5386dfb-c58a-4882-b0e1-2cc2d9518982^%^22^%^2C^%^22last_updated^%^22^%^3A^%^222017-11-22T19^%^3A10^%^3A04.522Z^%^22^%^7D; visid_incap_774904=4xMirl1lRNOgrnN+Sm9S1zNx61kAAAAAREIPAAAAAACAsmaAAbBYMBjQTCqLf/D6wOVO4hdnKjIF; incap_ses_151_774904=/LX+SNRqsR8SzJi7p3YYAjKgGloAAAAApdQygw8VYBxbv/wvl7Be7A==; _gat=1; _gat_subdomainTracker=1; _ga=GA1.2.1522498341.1508602188; _gid=GA1.2.1243543827.1511694421'
}


page = requests.get(url,headers=headers)
soup = BeautifulSoup(page.content,'lxml')

product_names = [p.getText(strip=True) for p in soup.find_all("div",class_="sc-pc-title-medium")]
product_prices = [p["title"].split()[-1] for p in soup.find_all("span",class_="Price-group")]

results = {k: v for k,v in itertools.zip_longest(product_names,product_prices,fillvalue="N/A")}

for product,price in results.items():
    print(product,price)

解决方法

问题:

1.) 为什么代码正确抓取了部分数据,而不是全部数据?

您的意思是例如价格和 N/A 值?好吧,您是对的,有些数据价格被正确抓取,有些则没有,这背后的原因实际上只是抓取程序的代码或算法。

比如说这个例子。

Coca-Cola (12oz / 35pk) $10.48  
Mountain Dew (12 oz. cans,36 pk.) $10.48

products

现在,正如您在图像上看到的,这是错误地抓取的,因为我应该说,因为 Cola-Cola (12oz / 35pk) 不应该是 $10.48,而应该是 N/ANone。现在又为什么会发生这种情况?代码实际上没有错误(当您运行程序时,它可以正常工作),这只是编写算法来抓取此站点的方式,只是写得不正确

想想这里的代码,它有什么作用?它只是得到 product namesproduct prices 对吗?它只是这样做!但没有constraints。现在我说的 constraints 是什么意思?有点像条件,例如如果某个产品没有价格怎么办?它会做什么?好吧,基于这里的代码,它不会处理那个可能的结果,它只是根据它的 tag 获取它找到的任何 class 并在 list 中将它返回给你,就是这样,程序实际上并没有像我所说的那样处理可能的结果,如果没有价格(这就是为什么有时您会获得价格与网站不符的数据的原因)。

product_names = [p.getText(strip=True) for p in soup.find_all("div",class_="sc-pc-title-medium")]
product_prices = [p["title"].split()[-1] for p in soup.find_all("span",class_="Price-group")]

2.) 这是代码循环和填充 N/A 值的错误,还是因为 Sam's Club 的网站/服务器架构?

我会说就代码如何循环以正确获取所有价格而言,这是一个错误。网站的服务器架构与网站 html 代码的相关性实际上并不多,因为网站 html 代码基本上是我们为了正确抓取这些数据而查看的地方。

现在我认为可能会陷入的另一个问题是:

好吧,这个网页抓取程序如何正确抓取数据?

您将不得不修复它并对其进行一些更改,修复抓取算法,因为正如我在 3 urls 上进行一些测试运行时所观察到的那样,但确实您是正确的没有正确获取数据,我建议它只是关于如何抓取数据的抓取算法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。