如何解决请求仅获取网站源代码的一部分
我正在尝试刮除target.com,它似乎只能解析网站的一部分,而没有产品(主要部分)。我的代码在Walmart上运行良好,但是此网站无法...
我的代码:
res = requests.get(f'https://www.target.com/s?searchTerm=mask')
print(res) # Prints 200
try:
res.raise_for_status()
except requests.exceptions.HTTPError as e:
print('Connection Error') # In case the connection fails
else:
soup = BeautifulSoup(res.text,"html.parser")
print(soup.find_all('li',class_='Col-favj32-0 diyyNr h-padding-a-none h-display-flex',limit = 5))
如果我打印soup.prettify(),它将打印网站的一部分,而没有产品... 我知道它可以与Selenium一起使用,我尝试过,但是需要它在没有Selenium的情况下工作。
解决方法
您在页面上看到的产品数据是从外部URL加载的。您可以使用requests
/ json
模块来加载此数据。
例如:
import json
import requests
kw = 'mask'
url = 'https://redsky.target.com/v2/plp/search/?channel=web&count=96&keyword={kw}&offset=0&pricing_store_id=3991&key=ff457966e64d5e877fdbad070f276d18ecec4a01'
data = requests.get(url.format(kw=kw)).json()
# uncomment this to print all data;
# print(json.dumps(data,indent=4))
# print some data to screen
for i in data['search_response']['items']['Item']:
print('{:<60} {}'.format(i['title'],i['price']['formatted_current_price']))
打印:
2pk Adult Fabric Face Mask $4.00
ICU Non Medical Face Mask 20ct $15.99
Adult 2pk Fabric Face Mask - Colors May Vary $5.00
Kids' 2pk Fabric Face Masks - Colors May Vary $5.00
Intco Non-medical Disposable Face Mask - 10ct $8.99
Cetaphil Pro Derma Control Purifying Clay Mask - 3oz $15.99
Jurassic World Velociraptor "Blue" Chomp 'N Roar Mask $29.99
Pixi DetoxifEYE Facial Treatment - 60ct $24.00
...and so on.
,
您不能从美丽的汤中刮掉不存在的元素。检查页面的来源,然后亲自查看页面中是否存在要搜索的数据。显然,它不存在。它是由javascript渲染的。
对于您而言,该网站似乎正在向 API 发出 XHR请求,并使用该数据的响应来显示。要查看API,请检查元素并查看网络标签。您会看到名为 XHR 的部分。从那里,您可以搜索要获取的数据,然后向该api网址发出请求。
@Andrej是正确的,并且以相同的方式发现了API URL。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。