如何解决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
现在,正如您在图像上看到的,这是错误地抓取的,因为我应该说,因为 Cola-Cola (12oz / 35pk)
不应该是 $10.48
,而应该是 N/A
或 None
。现在又为什么会发生这种情况?代码实际上没有错误(当您运行程序时,它可以正常工作),这只是编写算法来抓取此站点的方式,只是写得不正确。
想想这里的代码,它有什么作用?它只是得到 product names
和 product 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 举报,一经查实,本站将立刻删除。