Не удается разобрать ссылки на различные товары с веб-страницы - PullRequest
3 голосов
/ 05 ноября 2019

Я создал скрипт на python для получения ссылок на различные товары с веб-страницы. Хотя я знаю, что содержимое этого сайта динамично, я попробовал обычный способ сообщить вам, что я пытался. Я искал apis в инструментах разработки, но не смог найти. Разве нет способа получить эти ссылки, используя запросы?

Ссылка на сайт

Я уже написал:

import requests
from bs4 import BeautifulSoup

link = "https://www.amazon.com/stores/node/10699640011"

def fetch_product_links(url):
    res = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})
    soup = BeautifulSoup(res.text,"lxml")
    for item_link in soup.select("[id^='ProductGrid-'] li[class^='style__itemOuter__'] > a"):
        print(item_link.get("href"))

if __name__ == '__main__':
    fetch_product_links(link)

Как получить ссылки на различные товары с этого сайта по запросам?

1 Ответ

4 голосов
/ 05 ноября 2019

Я думаю, что вам нужны только асины, которые вы можете получить из другой конструкции URL, которую вы видите на вкладке сети, т.е. вы можете значительно сократить конечные URL. Однако вам необходимо сделать запрос к исходному URL, чтобы подобрать идентификатор для использования во втором URL. Возвращает 146 ссылок.

import requests, re, json

node = '10699640011'

with requests.Session() as s:
    r = s.get(f'https://www.amazon.com/stores/node/{node}')
    p = re.compile(r'var slotsStr = "\[(.*?,){3} share\]";')
    identifier = p.findall(r.text)[0]
    identifier = identifier.strip()[:-1]
    r = s.get(f'https://www.amazon.com/stores/slot/{identifier}?node={node}')
    p = re.compile(r'var config = (.*?);')
    data = json.loads(p.findall(r.text)[0])
    asins = data['content']['ASINList']
    links = [f'https://www.amazon.com/dp/{asin}' for asin in asins]
    print(links)

РЕДАКТИРОВАТЬ:

С двумя указанными узлами:

import requests, re, json
from bs4 import BeautifulSoup as bs

nodes = ['3039806011','10699640011']

with requests.Session() as s:
    for node in nodes:
        r = s.get(f'https://www.amazon.com/stores/node/{node}')
        soup = bs(r.content, 'lxml')
        identifier = soup.select('.stores-widget-btf:not([id=share],[id*=RECOMMENDATION])')[-1]['id']
        r = s.get(f'https://www.amazon.com/stores/slot/{identifier}?node={node}')
        p = re.compile(r'var config = (.*?);')
        data = json.loads(p.findall(r.text)[0])
        asins = data['content']['ASINList']
        links = [f'https://www.amazon.com/dp/{asin}' for asin in asins]
        print(links)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...