python - 试图抓取页面上所有鞋子的网站,但一直返回 None
问题描述
我试图从这个网站上抓取页面上的所有鞋子,但它一直返回 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)
解决方案
正如@PedroLobito 所暗示的,网页不直接响应数据,它是在使用 JavaScript 进行初始请求后加载的。这就是为什么您什么都看不到的原因:原始 HTML 没有运动鞋数据。从返回 JSON 的端点检索数据。直接请求更容易。
使用 Web 浏览器中内置的开发人员工具,我们可以看到一个 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请求这个,并使用json()
response对象的方法来实际使用数据,例如:
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...
推荐阅读
- nginx - Strapi/Nginx - Strapi 路由在生产中不起作用
- machine-learning - sklearn中NMF(非负矩阵分解)中的n_components是什么?
- django - 了解 Django 中 views.pyfile 中 HttpResponseRedirect 的“参数”
- python - 如何在一个情节中组合两个字典?
- ruby-on-rails - Rails 通过组合字段自定义连接
- java - For Loop 不会循环 Buttons 数组以使其不可见,它只会隐藏列表中的第一个 - Android Studio Java
- exchange-server - 在免责声明中包含发件人地址(收到的邮件)
- c# - 路径模式错误之前是否有前导“/”?
- python-3.x - Tensorflow 到 Tensorflow-lite 的转换
- javascript - Javascript onclick 事件监听器仅在某些时候有效