Мне нужно очистить данные с этого сайта https://shop.freedompop.com/products?page=1
Я использую BeautifulSoup
для анализа html и обнаруживаю, что мне нужно найти все class_ = "product-results-item-link layout-row flex-gt-sm-33 flex-50"
я пытался использовать
containers = html_soup.find_all('a', class_ = "product-results-item-link layout-row flex-gt-sm-33 flex-50")
но его нельзя найти
from requests import get
from bs4 import BeautifulSoup
from time import sleep
from random import randint
import pandas as pd
product_names = []
status = []
ori_prices = []
sale_prices = []
headers = {"Accept-Language": "en-US, en;q=0.5"}
pages = [str(i) for i in range(1,2)]
#pages = [str(i) for i in range(1,24)]
for page in pages:
response = get('https://shop.freedompop.com/products' + page, headers = headers)
sleep(2)
html_soup = BeautifulSoup(response.text, 'html.parser')
containers = html_soup.find_all('a', class_ = "product-results-item-link layout-row flex-gt-sm-33 flex-50")
print(containers)
Я ожидаю, что результат будет 18
, но фактический результат []
Веб-сайт, динамически обращающийся ко всем записям продуктов через API. Таким образом, вы можете напрямую использовать их API и получать данные:
https://shop.freedompop.com/api/shop/store/555/item?page=1&pageSize=500&sort=RELEVANCE
import json
from requests import get
from bs4 import BeautifulSoup
response = get('https://shop.freedompop.com/api/shop/store/555/item?pageSize=410&sort=RELEVANCE')
html_soup = BeautifulSoup(response.text, 'html.parser')
parsed_response = json.loads(html_soup.text)
for index,value in enumerate(a.get('results')):
print(index, value)
Одним из них является проверка и идентификация запроса API в сети из окна проверки. Подробнее об этом можно прочитать здесь: Developers.google.com/web/tools/chrome-devtools/network
Как заявил Панкадж (так что примите его ответ, поскольку я просто расширяю его первоначальный ответ), используйте URL-адрес запроса, чтобы получить данные для вас в удобном формате json. Вы также можете изменить параметры (например, изменить 'pageSize': '500'
, чтобы получить больше товаров, чем только 18 на первой странице):
import requests
url = 'https://shop.freedompop.com/api/shop/store/555/item'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
params = {
'page': '1',
'pageSize': '18',
'sort': 'RELEVANCE'}
jsonData = requests.get(url, headers=headers, params=params).json()
for product in jsonData['results']:
print (product['title'])
Выход:
Netgear Unite Mobile Hotspot (GSM)
LG Tribute 2, 8GB Blue (CDMA)
Samsung Galaxy S5, 16GB Charcoal Black (CDMA)
Samsung Galaxy S5, 16GB Shimmery White (CDMA)
Samsung Galaxy S5, 16GB Shimmery White (CDMA)
Samsung Galaxy S4 Enhanced, 16GB Black Mist (CDMA)
Kyocera Hydro Vibe, 8GB Black (CDMA)
Samsung Galaxy S4, 16GB White Frost (CDMA)
Samsung Galaxy S4, 16GB White Frost (CDMA)
Motorola Moto E (2nd Generation), 8GB Black (CDMA)
Apple iPhone 5s, 16GB Gold (CDMA)
Samsung Galaxy S4, 16GB Black Mist (CDMA)
Franklin Wireless R850 4G LTE Mobile Hotspot (CDMA)
Apple iPhone 6, 16GB Space Gray (CDMA)
Samsung Galaxy S4 Enhanced, 16GB White Frost (CDMA)
Huawei Union, 8GB Black (CDMA)
Samsung Galaxy S5, 16GB Copper Gold (CDMA)
Samsung Galaxy S4 Enhanced, 16GB Black Mist (CDMA)
Изменение параметров:
import requests
url = 'https://shop.freedompop.com/api/shop/store/555/item'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
params1 = {
'page': '1',
'pageSize': '18',
'sort': 'RELEVANCE'}
params2 = {
'page': '1',
'pageSize': '500',
'sort': 'RELEVANCE'}
jsonData = requests.get(url, headers=headers, params=params1).json()
print (len(jsonData['results']))
jsonData = requests.get(url, headers=headers, params=params2).json()
print (len(jsonData['results']))
Выход:
18
405
..! Благодаря вашему ответу нашел новый способ доступа к данным json. Спасибо за расширение и ссылку. Для этого голосование за ваш ответ. ваше здоровье!
Как лучше всего найти их URL-адрес API?