Задать вопрос

Парсинг Яндекс.Маркет, проблема со сменой страницы?

Привет!
Мне необходим максимально большой список материнских плат AsRock, за источник решил взять Яндекс.Маркет. Столкнулся с баном + очень странная вещь, после 7 страницы включительно выдается по 33 карточки с товаром, хотя в настройках по прежнему стоит "Показывать 48". При переходе на 7 страницу и далее не меняет параметр Page страницы, таким образом в файл .csv копирует одни и те же карточки ( с 1 по 6 стр все работает ок). Подскажите в чем конкретно проблема?

(Использую TOR, смена ip каждые 10 секунд, поэтому использую time.sleep(10))

В Python новичок, если нашли причину, пожалуйста, помогите и объясните как можно подробнее, спасибо!

import requests
from bs4 import BeautifulSoup
import time
import socks
import socket
import csv

socks.set_default_proxy(socks.SOCKS5, "localhost", 9150)
socket.socket = socks.socksocket

URL = 'https://market.yandex.ru/catalog--materinskie-platy/55323/list?hid=91020&page=1&glfilter=4923257%3A12108404%2C12108414&glfilter=7774847%3A1&glfilter=7893318%3A762104&onstock=0&local-offers-first=0'
HEADERS = {'User-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:75.0) Gecko/20100101 Firefox/75.0','Accept': '*/*'}

HOST = 'https://market.yandex.ru'

FILE = 'AsRock.csv'

def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r

def save_files(items, path):
    with open(path, 'w', newline='') as file:
        writer = csv.writer(file, delimiter=';')
        writer.writerow(['NAME', 'LINK'])
        for item in items:
            writer.writerow([item['title'], item['link']])

def str_subtract(s1, s2):
    for ch in s2:
        if ch in s1:
            s1 = s1.replace(ch, '', 1)
    return s1

def get_content(html):
 try:
    plate = []
    soup = BeautifulSoup(html,'html.parser')
    items = soup.find_all('div', class_='n-snippet-card2__part n-snippet-card2__part_type_center')
    for item in items:
        plate.append({
            'title': str_subtract(item.find('h3', class_='n-snippet-card2__title').get_text(strip=True),'Материнская плата ASRock '),
            'link': HOST + item.find('a', class_='link').get('href')
            })
    return(plate)
 except AttributeError:
    return False
 return(title)
title = ("-")

def parse():
    html = get_html(URL)
    if html.status_code == 200:
        plate = []
        for page1 in range(1, 28):
            print(f'Парсинг страницы {page1} из 27...')
            if (page1 < 7):
                while (len(plate) < (page1)*48):
                    html = get_html(URL, params={'page': page1})
                    plate.extend(get_content(html.text))
                    print(len(plate))
                    time.sleep(10)
            else:
                while (len(plate) < 288+((page1-6)*33)):
                    html = get_html(URL, params={'page': page1})
                    plate.extend(get_content(html.text))
                    print(len(plate))
                    time.sleep(10)
            save_files(plate, FILE)
    else:
        print('Error')

parse()
  • Вопрос задан
  • 2695 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
очень странная вещь, после 7 страницы включительно выдается по 33 карточки с товаром, хотя в настройках по прежнему стоит "Показывать 48"

А слабо посмотреть вручную и выяснить тот факт, что Маркет находит сведений на 6 полных (по 48 товаров) страниц, а на 7 страницу находит только 33 товара. Ну нет на Маркете больше сведений. Естественно, при запросе показать 8 страницу автоматически переходит на последнюю, 7-ю, страницу с товарами.
Ответ написан
leha_gorbunov
@leha_gorbunov
Программист
Зачем велосипеды изобретать? Надо посмотреть список материнских плат с Яндекс.Маркета с адресами страниц?
На смотри ymscanner.site/items?hid=91020&brand=762104
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы