【问题标题】:How to get all products from a beautifulsoup page如何从 beautifulsoup 页面获取所有产品
【发布时间】:2021-09-14 00:13:06
【问题描述】:

我想获取此页面上的所有产品:

nike.com.br/snkrs#estoque

我的python代码是这样的:

produtos = []
def aviso():                               
 print("Started!")                                
 request = requests.get("https://www.nike.com.br/snkrs#estoque")
 soup = bs4(request.text, "html.parser")
 links = soup.find_all("a", class_="btn", text="Comprar")
 links_filtred = list(set(links))
 for link in links_filtred:
  if(produto not in produtos):
   request = requests.get(f"{link['href']}")    
   soup = bs4(request.text, "html.parser")     
   produto = soup.find("div", class_="nome-preco-produto").get_text()
   if(code_formated == ""):                         
    code_formated = "\u200b"
   print(f"Nome: {produto} Link: {link['href']}\n")                                                     
   produtos.append(link["href"])
aviso()

伙计们,这段代码从页面获取产品,但不是昨天的全部,我怀疑内容是动态的,但是我怎样才能通过 request 和 beautifulsoup 获取它们?我不想使用 Selenium 或自动化库,我该怎么做?我不想更改我的代码,因为它快完成了,我该怎么做?

【问题讨论】:

  • 你可以直接调用feed,循环p参数,增加int(如1、2、3)等等。
  • 知道了,我会应用它并查看结果,谢谢:)
  • @αԋɱҽԃ αмєяιcαη 我刚刚意识到这个提要页面没有我在问题中提到的网址中的所有内容:(
  • 已经有了。从 1 到 5。
  • @αԋɱҽԃ αмєяιcαη 嗯,我明白了,它有效,但如果它有 6 或 4 页,我将如何找到?

标签: python python-3.x python-2.7 beautifulsoup


【解决方案1】:

要获取数据,您可以发送请求到:

https://www.nike.com.br/Snkrs/Estoque?p=<PAGE>&demanda=true

在 URL 中提供 1-5 到 p= 之间的页码。

例如打印链接,可以试试:

import requests
from bs4 import BeautifulSoup


url = "https://www.nike.com.br/Snkrs/Estoque?p={page}&demanda=true"

for page in range(1, 6):
    response = requests.get(url.format(page=page))
    soup = BeautifulSoup(response.content, "html.parser")
    print(soup.find_all("a", class_="btn", text="Comprar"))

【讨论】:

  • 您在soup.find_all 中所做的实际上是一个完整的正则表达式搜索!这将保持打开每个锚点 a 并检查 class== btn 并包含文本 comprar !但如果你使用选择器。它是根据解析器逻辑而不是正则表达式匹配的。
  • @αԋɱҽԃαмєяιcαη 这与 OP 查找链接的代码相同。我没有提供完整的答案,只是如何使用range() 获取页面之间的数据
【解决方案2】:

如果您正在处理相同的主机,请不要使用 requests.get。

原因:read-that

import requests
from bs4 import BeautifulSoup
import pandas as pd


def main(url):
    allin = []
    with requests.Session() as req:
        for page in range(1, 6):
            params = {
                'p': page,
                'demanda': 'true'
            }
            r = req.get(url, params=params)
            soup = BeautifulSoup(r.text, 'lxml')
            goal = [(x.find_next('h2').get_text(strip=True, separator=" "), x['href'])
                    for x in soup.select('.aspect-radio-box')]
            allin.extend(goal)
    df = pd.DataFrame(allin, columns=['Title', 'Url'])
    print(df)


main('https://www.nike.com.br/Snkrs/Feed')

输出:

                                           Title                                                Url
0              Dunk High x Fragment design Black  https://www.nike.com.br/dunk-high-x-fragment-d... 
1          Dunk Low Infantil (16-26) City Market  https://www.nike.com.br/dunk-low-infantil-16-2... 
2                     ISPA Flow 2020 Desert Sand  https://www.nike.com.br/ispa-flow-2020-153-169... 
3                   ISPA Flow 2020 Pure Platinum  https://www.nike.com.br/ispa-flow-2020-153-169... 
4    Nike iSPA Men's Lightweight Packable Jacket  https://www.nike.com.br/nike-ispa-153-169-211-... 
..                                           ...                                                ... 
115                 Air Jordan 1 Mid Hyper Royal  https://www.nike.com.br/air-jordan-1-mid-153-1... 
116                       Dunk High Orange Blaze  https://www.nike.com.br/dunk-high-153-169-211-... 
117                         Air Jordan 5 Stealth  https://www.nike.com.br/air-jordan-5-153-169-2... 
118                   Air Jordan 3 Midnight Navy  https://www.nike.com.br/air-jordan-3-153-169-2... 
119                             Air Max 90 Bacon  https://www.nike.com.br/air-max-90-153-169-211... 

[120 rows x 2 columns]

【讨论】:

    猜你喜欢
    • 2019-11-07
    • 2021-11-08
    • 1970-01-01
    • 2016-03-16
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多