Привет!
Мне необходим максимально большой список материнских плат 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()