Python数据抓取Sam的Club web scraper代码似乎工作正常,但是否在不应该打印N/A填充值的地方打印?

2024-09-30 10:41:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解,当网站提供代码刮取值时,为什么Sam's Club网站刮取代码似乎在拾取N/A填充值

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

像Oreo和Reese这样的普通品牌搜索似乎运行得很好,但出于某种原因,有些商品在网站上有价格,代码在价格中填写N/a

然后,如果你尝试像#url3这样的苏打水整体分类搜索,超过一半的价格被填写为N/A

问题:

1。)为什么代码能够正确地抓取部分数据,而不是全部数据

2。)这是代码循环和填充N/A值方面的错误,还是因为山姆俱乐部的网站/服务器架构

提前感谢,代码如下:

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)

Tags: 代码inhttpsimportcomurlfor网站
1条回答
网友
1楼 · 发布于 2024-09-30 10:41:31

问题:

1。)为什么代码能够正确地抓取部分数据,而不是全部数据

你的意思是,例如,价格&;不适用值?嗯,你是对的,一些数据价格被正确地刮取了&;有些人不是&;这背后的原因实际上只是在代码或算法的刮程序

就这个例子来说。

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是什么意思?有点像一个条件,例如,如果某个产品没有价格怎么办?它能做什么?基于这里的代码,它不会处理可能的结果,它只是根据它的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值方面,这是一个错误,还是由于山姆俱乐部的网站/服务器架构

我想说,这是一个错误,因为代码是如何循环以正确获取所有价格的。网站的服务器架构实际上没有太多的相关性,而更多的是在网站的html代码上,因为这是我们为了正确地刮取这些数据而主要关注的地方

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

那么,这个网页抓取程序如何正确地抓取数据呢

你必须修复它,并对其进行一些更改,修复刮取算法,因为正如我在3 urls上进行一些测试运行时所观察到的那样,实际上你是正确的,它没有正确地获取数据,我建议它只是在刮取算法上,关于它如何刮取数据

相关问题 更多 >

    热门问题