我正在尝试刮除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的情况下工作。
答案 0 :(得分:3)
您在页面上看到的产品数据是从外部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.
答案 1 :(得分:1)
您不能从美丽的汤中刮掉不存在的元素。检查页面的来源,然后亲自查看页面中是否存在要搜索的数据。显然,它不存在。它是由javascript渲染的。
对于您而言,该网站似乎正在向 API 发出 XHR请求,并使用该数据的响应来显示。要查看API,请检查元素并查看网络标签。您会看到名为 XHR 的部分。从那里,您可以搜索要获取的数据,然后向该api网址发出请求。
@Andrej是正确的,并且以相同的方式发现了API URL。