【问题标题】:Trying to scrape site for all the shoes on the page, but keeps returning None试图抓取页面上所有鞋子的网站,但一直返回 None
【发布时间】:2019-06-20 23:34:15
【问题描述】:

我试图在这个网站上搜索页面上的所有鞋子,但它一直返回 None,这是链接 https://www.goat.com/sneakers, 这是我的代码

import requests
from bs4 import BeautifulSoup as bs
import json

url = 'https://www.goat.com/sneakers'
headers= {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 
Safari/537.36',
}
page = requests.get(url, headers=headers).text
soup = bs(page, "html.parser")
containers = soup.find_all('a', {'class': 'cell'})
for container in containers:
    print(container)

【问题讨论】:

  • 你试过什么?请尝试解决这个问题并向我们展示你做了什么。
  • 内容是从json请求中加载的,直接解析。
  • 对不起,我对编程很陌生,我该如何直接解析它?

标签: python web-scraping beautifulsoup python-requests


【解决方案1】:

正如@PedroLobito 所暗示的,网页不会直接响应数据,它是在使用 JavaScript 进行初始请求后加载的。这就是为什么您什么都看不到的原因:原始 HTML 没有运动鞋数据。从返回 JSON 的端点检索数据。直接请求更容易。

使用网络浏览器中内置的开发者工具,我们可以看到一个 POST 请求被发送到:

https://2fwotdvm2o-dsn.algolia.net/1/indexes/product_variants_v2/query?x-algolia-agent=Algolia for vanilla JavaScript 3.25.1&x-algolia-application-id=2FWOTDVM2O&x-algolia-api-key=ac96de6fef0e02bb95d433d8d5c7038a

有效载荷是

{"params":"distinct=true&facetFilters=()&facets=%5B%22size%22%5D&hitsPerPage=20&numericFilters=%5B%5D&page=0&query="}

我们可以直接用requests来请求这个,使用response对象的json()方法来实际使用数据,例如:

import json
import requests

url = 'https://2fwotdvm2o-dsn.algolia.net/1/indexes/product_variants_v2/query?x-algolia-agent=Algolia for vanilla JavaScript 3.25.1&x-algolia-application-id=2FWOTDVM2O&x-algolia-api-key=ac96de6fef0e02bb95d433d8d5c7038a'
data = {"params":"distinct=true&facetFilters=()&facets=%5B%22size%22%5D&hitsPerPage=20&numericFilters=%5B%5D&page=0&query="}
r = requests.post(url, data=json.dumps(data))
print(r.json()['hits'][0])

这给了我们

{'product_template_id': 116662, 'shoe_condition': 'used', 'box_condition': 'badly_damaged', 'lowest_price_cents': 18500, 'instant_ship_lowest_price_cents': None, 'brand_name': 'adidas', 'category': ['lifestyle'], 'color': 'White', 'designer': 'Kanye West', 'details': 'Cream White/Cream White/Core White', 'gender': ['men'], 'grid_picture_url': 'https://image.goat.com/375/attachm...

【讨论】:

  • 哇,我希望你能明白这对我有多大帮助,我如何知道页面是从 html 还是 json 加载数据,以及如何找到正确的端点?
  • 查看浏览器文档以获取有关“开发者工具”的信息,特别是通常可用的“网络检查器”选项卡。这 + 原始 HTML 通常足以说明。
  • 文档是什么意思?喜欢查一下?你还在谈论在 chrome 开发工具中,在网络下,我检查所有请求的响应,看看我正在寻找哪些数据?
  • 喜欢this page。是的,Chrome 开发工具 > 网络就是一个例子。如果您在研究后有任何问题,请创建一个单独的特定问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
相关资源
最近更新 更多