【发布时间】:2020-08-12 17:49:05
【问题描述】:
我一直在尝试使用 BeautifulSoup 抓取此站点 (https://www.americanas.com.br/hotsite/todas-ofertas-mundo) 中的产品。我可以在一页中获取所有项目,并且由于分页在 url 中,只需使用计数器移动到下一个(例如第 2 页是 https://www.americanas.com.br/hotsite/todas-ofertas-mundo/pagina-2 等等)。所以问题是最大页面是 416,在那个数字页面之后没有显示任何产品。由于每个站点显示 24 种产品,我几乎无法达到 10k 种产品(根据页面总共有 400 万种产品)。
我试图更深入地研究类别,但我遇到了同样的问题(一些更深的类别也有超过 10k 的产品),还过滤了“marca”、“price”和“loja”以及同样的问题。因此,即使使用最好的过滤器,我也无法获得所有产品,因为我达到了其中的最大页面。
我还搜索了一个 API,因此我可以尝试绕过它,但找不到任何可以在没有产品 ID 的情况下请求目录的内容。我确实找到了一个用于获得不同品牌和卖家,但产品数量相同的问题。
这也是在其他市场上困扰我的一个问题,让我很难获得网站的所有目录,不得不过滤并尝试获得最多数量的产品,但不是全部。所以任何建议都非常受欢迎。谢谢!
这里是抓取页面的代码
import requests
import time
import re
import json
from bs4 import BeautifulSoup
import urllib3
urllib3.disable_warnings()
def html(url):
try:
soup = BeautifulSoup(requests.get(url,verify = False).content,'html.parser',from_encoding="utf-8")
return soup
except Exception as e:
print(e)
print("Not loading")
def product_info(prod):
quote = {}
if prod.find("span",{"class": re.compile(r"UnavailableTextMessage")}):
return
quote['id'] = prod.find("a").get("href").replace("?","/",1).split("/")[2]
quote['name'] = prod.find("h2").getText()
#prod_info = prod.find("span")
quote['price'] = prod.find("span", {"class": re.compile(r"PriceUI-bwhjk3-11")}).getText().replace(".","").split(" ")[-1]
quote['full_price'] = quote['price']
quote['discount'] = ''
discount = prod.find("span",{"class": re.compile(r"TextUI-xlll2j-3")})
if discount:
quote["discount"] = discount.getText().replace("%","")
disc = quote['discount'].replace("%","")
quote['full_price'] = prod.find("span", {"class": re.compile(r"PriceUI-sc-1q8ynzz-0")}).getText().replace(".","").split(" ")[-1]
inter = prod.find("span", {"class": re.compile(r"InternationalText")})
quote['inter'] = 0
if inter:
quote['inter'] = 1
quote['url']= "https://americanas.com.br"+ prod.find("a").get("href")
return quote
test = "https://www.americanas.com.br/hotsite/todas-ofertas-mundo"
products = [] ##lim 10k
counter = 2
while True:
page = "/pagina-"+str(counter)
url = test + page
counter += 1
soup = html(url)
print(url)
content = soup.findAll("div",{"class": "product-grid-item"})
if content == []:
print(counter)
break
for cont in content:
if product_info(cont):
products.append(product_info(cont))
【问题讨论】:
标签: python web-scraping beautifulsoup python-requests data-science