[英]Can't scrape information from a static webpage using requests module
我正在尝试使用 requests 模块从网页中获取product title
及其description
。 标题和描述似乎是静态的,因为它们都存在于页面源代码中。 但是,我未能通过以下尝试抓住它们。 脚本此时抛出AttributeError
。
import requests
from bs4 import BeautifulSoup
link = 'https://www.nordstrom.com/s/anine-bing-womens-plaid-shirt/6638030'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36',
}
with requests.Session() as s:
s.headers.update(headers)
res = s.get(link)
soup = BeautifulSoup(res.text,"lxml")
product_title = soup.select_one("h1[itemProp='name']").text
product_desc = soup.select_one("#product-page-selling-statement").text
print(product_title,product_desc)
如何使用请求模块从上面的页面中抓取标题和描述?
页面是动态的。 从 api 源获取数据:
import requests
import pandas as pd
api = 'https://www.nordstrom.com/api/ng-looks/styleId/6638030?customerId=f36cf526cfe94a72bfb710e5e155f9ba&limit=7'
jsonData = requests.get(api).json()
df = pd.json_normalize(jsonData['products'].values())
print(df.iloc[0])
输出:
id 6638030-400
name ANINE BING Women's Plaid Shirt
styleId 6638030
styleNumber
colorCode 400
colorName BLUE
brandLabelName ANINE BING
hasFlatShot True
imageUrl https://n.nordstrommedia.com/id/sr3/6d000f40-8...
price $149.00
pathAlias anine-bing-womens-plaid-shirt/6638030?origin=c...
originalPrice $149.00
productTypeLvl1 12
productTypeLvl2 216
isUmap False
Name: 0, dtype: object
当测试像这样的请求时,你应该输出响应来看看你得到了什么。 最好使用 Postman 之类的东西(我认为 VSCode 现在有类似的功能)来设置 URL、标头、方法和参数,并且还可以查看带有标头的完整响应。 当一切正常时,只需将其转换为 python 代码。 Postman 甚至有一些通用语言的“导出到代码”功能。
无论如何...
从 python 和浏览器完成的请求是一回事。 如果标头、URL 和参数相同,它们应该收到相同的响应。 所以下一步就是比较你的请求和浏览器完成的请求的区别:
因此浏览器包含的一个或多个标头从服务器获得了良好的响应,但仅使用User-Agent
是不够的。
我会尝试确定哪些标头,但不幸的是,Nordstrom 检测到一些“异常活动”并且似乎阻止了我的 IP :( 可能是由于发送了明显的手工请求。 我认为这是我的 IP 被阻止了,因为我无法从任何浏览器访问该站点,即使在清除我的缓存之后也是如此。
因此,请仔细检查您在使用刮刀时是否没有发生同样的情况。
祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.