Очистите результаты целевого поиска с помощью python

#python #python-3.x #selenium #web-scraping #python-requests

Вопрос:

Я пытаюсь наскрести результаты поиска на цель.

Например, давайте перейдем к домену "https://www.target.com/s?searchTerm=lego duplo"

И попытайтесь извлечь названия продуктов, цены и идентификаторы продуктов.

Я пробовал селен, и меня попросили подтвердить мою личность. Я пробовал запросы и получаю запрещенную страницу. Я пробовал другие библиотеки, и у меня заканчиваются идеи.

В идеале, должны быть такие javascript , которые загружают цены с помощью JSON, но я, кажется, не могу их найти. Есть какие-нибудь советы?

Ответ №1:

Данные загружаются с внешнего URL-адреса в формате Json. Вы можете использовать следующий пример, как смоделировать Ajax-запрос:

 import json
import requests

url = "https://www.target.com/s?searchTerm=lego duplo"
headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0"
}

api_url = "https://redsky.target.com/redsky_aggregations/v1/web/plp_search_v1"

params = {
    "key": "ff457966e64d5e877fdbad070f276d18ecec4a01",
    "channel": "WEB",
    "count": "24",
    "default_purchasability_filter": "false",
    "include_sponsored": "true",
    "keyword": "lego duplo",
    "offset": "0",
    "page": "/s/lego duplo",
    "platform": "desktop",
    "pricing_store_id": "3991",
    "useragent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0",
    "visitor_id": "AAA",
}

data = requests.get(api_url, params=params).json()

# uncomment this to print all data:
# print(json.dumps(data, indent=4))

for p in data["data"]["search"]["products"]:
    print(
        "{:<10} {}".format(
            p["price"]["current_retail"],
            p["item"]["product_description"]["title"],
        )
    )
 

С принтами:

 29.99      LEGO DUPLO Classic Brick Box First LEGO Set with Storage Box 10913
23.99      LEGO DUPLO Super Heroes Lab Marvel Avengers Toy 10921
32.99      LEGO DUPLO Creative Fun 10887
16.39      LEGO DUPLO My First Number Train 10847
14.99      LEGO DUPLO Large Green Building Plate 2304
16.39      LEGO DUPLO Disney Minnie Mouse's Birthday Party 10873
24.49      LEGO DUPLO Disney Arielamp;#39;s Undersea Castle Building Toy; Princess Castle Under the Sea 10922
16.39      LEGO DUPLO Construction Truck amp;#38; Tracked Excavator Digger and Tipper Building Site Toy 10931
16.39      LEGO DUPLO Disney Frozen Toy Featuring Elsa and Olafamp;#39;s Tea Party 10920
9.99       LEGO DUPLO My First Fire Helicopter and Police Car 10957
49.99      LEGO DUPLO Fire Station 10903
16.39      LEGO DUPLO Submarine Adventure Bath Toy Building Set for Toddlers with Toy Submarine 10910
4.99       LEGO DUPLO My First Space Rocket 30332 Building Kit
15.99      LEGO City Construction Bulldozer Building Set 60252
29.99      LEGO DUPLO Disney Mickey amp;#38; Minnie Birthday Train Kidsamp;#39; Birthday Number Train Playset 10941
41.99      LEGO DUPLO Princess Frozen Ice Castle Toy Castle Building Set with Frozen Characters 10899
19.99      LEGO DUPLO My First Animal Train Pull-Along 10955
19.99      LEGO DUPLO Fire Truck 10901
9.89       LEGO Classic Bricks and Ideas 11001
29.99      LEGO DUPLO Jurassic World T. rex and Triceratops Dinosaur Breakout 10939
20.99      LEGO DUPLO Town Airport 10871
23.99      LEGO Classic Medium Creative Brick Box Building Toys for Creative Play, Kids Creative Kit 10696
9.99       LEGO DUPLO Police Bike 10900
19.99      LEGO DUPLO Town Farm Tractor amp;#38; Animal Care Building Toy 10950
 

Комментарии:

1. Является ли redsky targets api?

2. @Syazvinski Вы можете увидеть этот URL-адрес с параметрами, если откроете вкладку Инструменты разработчика Firefox (Chrome) — > Сеть и перезагрузите страницу. Данные загружаются с этого URL-адреса.