Как возможно сравнивать значения в python
хотел написать программу которая парсит предметы с одного сайта (csgo.tm) и сравнивает цены в торговой площадке steam , первая часть программы получилось а вот как сравнить додуматься не могу т.к начинающий.
result = []
page = '2'
search = ''
price_on = "0"
price_off = '3000'
url = 'https://market.csgo.com/? s=pop&t=all&rs='+price_on+';'+price_off+'&search='+search+'&sd=desc'
print(url)
headers ={
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 OPR/40.0.2308.81',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'DNT': '1',
'Accept-Encoding': 'gzip, deflate, lzma, sdch',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4'
}
def data_colected():
responses = requests.get(url, headers=headers)
soup= bs(responses.text, "html.parser")
all_links = soup.find_all('a' , class_='item hot')
if all_links == []:
print('неверно')
else:
#all_links = soup.find('div', attrs={'class':'item hot'}).text
for link in all_links:
url1 = 'https://market.csgo.com' + link['href']
#print(url1)
responses = requests.get(url1, headers=headers)
soup= bs(responses.text, "html.parser")
full_name = soup.find('div', class_='item-h1').find('h1').text
full_float = soup.find('div', class_='item-h1').find('span').text
full_price= soup.find('div', class_='ip-bestprice').__str__().replace('<div class="ip- bestprice">', '').replace('<small></small> </div>', '').strip()
if full_price == 'None':
full_price = 'ПРОЧЕРК'
#normal_price = soup.find('div', id="rectanglestats" )
img = soup.find('div',class_='ip-pic')
img = img.findChildren('img')[0]
img = img['src']
full_name= full_name.__str__().replace('|', '')
if full_price == None:
return
else:
result.append(
{
"img": img,
"full_name": full_name,
"full_float": full_float,
'full_price': full_price,
'url': url1
}
)
print(img)
print(("Название - ") + full_name)
print(("Качество - ") + full_float)
print(("Цена - ") + full_price + (' рублей'))
print(('ССылка на товар - ') + url1)
with open('result.json', 'w', encoding='utf-8') as file:
json.dump(result, file, indent=4 , ensure_ascii=False)
print(len(result))`
вот так я хочу попробовать реализовать
item_name = ""
item_name2 = ""
item_float = '3'
stattrak = ""
url_steam ="https://steamcommunity.com/market/search?category_730_ItemSet%5B%5D=any&category_730_ProPlayer%5B%5D=any&category_730_StickerCapsule%5B%5D=any&category_730_TournamentTeam%5B%5D=any&category_730_Weapon%5B%5D=any&category_730_Exterior%5B%5D=tag_WearCategory"+item_float+"&appid=730&q="+stattrak+"+"+item_name+'+'+item_name2
Ответы (1 шт):
Сразу скажу, пока это не ответ. Пока это только попытка выяснить, как и с чем Вы хотите сравнивать данные. Хотя я и использовал для хранения данных JSON, это не самый лучший формат для хранения сравниваемых и обновляемых данных (предлагаю для начала освоить хотя бы sqlite, но об этом чуть позже)
Итак: Давайте сначала корректно распарсим и соберем данные:
Для начала нам понадобится
pip install requests simplejson bs4 fake-useragent tqdm --upgrade
from tqdm.auto import tqdm
from bs4 import BeautifulSoup as Soup, Tag
from requests import Session
from requests.adapters import HTTPAdapter
from urllib3.util import Retry
from urllib.parse import unquote
from fake_useragent import UserAgent
from dataclasses import dataclass, asdict
import re
import simplejson as json
# Для удобства сборки элементов создадим dataclass
@dataclass()
class Weapon:
url: str
img: str = None
full_name: str = None
appearance: str = None
full_price: float = .0
currency: str = None
# Свойство класса не попадает в словарь
# при преобразовании экземпляра класса в словарь,
# но его можно использовать при обработке экземпляра класса
@property
def item_id(self):
# Здесь мы создадим ID экземпляра, для того,
# чтобы каждый экземпляр можно было идентифицировать
# и выбрать для сравнения
return re.sub(r'^.*?(?<=item/)([\d-]+\d).*$', r'\1', self.url)
# Когда Вы расскажете, как Вы хотите сравнить две сущности
# Здесь появится метод
# def __eq__():
# Для того чтобы не морочиться с созданием заголовка User-Agent
# есть специальная библиотека fake-useragent
ua = UserAgent()
base_url = 'https://market.csgo.com'
# Для обращения к сайтам при парсинге
# лучше всего использовать одну сессию для всех запросов.
# Иначе Вы рискуете быть заблокированными на сайте.
# (Справедливости ради это не панацея, владельцы сайтов не
# сильно любят когда их ресурсы парсят, но вероятность снижается)
s = Session()
s.mount(
base_url,
HTTPAdapter(
max_retries=Retry(
total=5,
read=2,
connect=2,
backoff_factor=.005,
allowed_methods=['GET']
)
)
)
# Добавляем User-Agent в заголовки сессии
s.headers.update(
{
'User-Agent': ua.random,
}
)
# На этом сайте можно выбрать язык задав значение для cookie
s.cookies.setdefault(
'_language', 'ru'
)
# Пояснение зачем оно здесь ниже
# s.proxies = {
# 'https': 'socks5://localhost:1080'
# }
# Так-же можно задать валюту, в которой Вы будете получать ценны
# Кстати, без использования сессии фиг бы у нас это прокатило
s.get(
base_url + '/currency/switch/rub'
)
# Итак, поехали...
response = s.get(
base_url,
params={
's': 'pop',
't': 'all'
}
)
# 1. Получаем содержимое главной страницы
soup = Soup(response.content, 'html.parser')
def weapon_item(pag_url_tag: Tag):
# 3.1 Создаем экземпляр класса и сразу присваиваем значение параметру url.
weapon = Weapon(
url=base_url + unquote(pag_url_tag.get('href'))
)
# 3.2 запрашиваем содержимое страницы товара
p_response = s.get(
weapon.url
)
# и создаем суп
p_soup = Soup(p_response.content, 'html.parser')
# 3.3 Определение валюты цены можно было и не делать,
# мы ее и так в самом начале определили, но можно и оставить (так надежнее)
if currency_tag := p_soup.find('div', class_=['currency-selector__item', 'active']):
weapon.currency = currency_tag.get_text(strip=True)
# 3.4 Ищем Таг заголовка
# (предварительная проверка наличия тагов, перед получением их параметров,
# позволяет не натыкаться на исключения при их отсутствии)
if header_tag := p_soup.find('div', {'class': 'item-h1'}):
# 3.5 Определяем название и присваиваем значение параметру класса
if title_tag := header_tag.find('h1'):
weapon.full_name = title_tag.get_text(strip=True)
# 3.6 Определяем состояние и присваиваем значение параметру класса
if appearance_tag := header_tag.find('div', {'class': 'item-appearance'}):
weapon.appearance = appearance_tag.get_text(strip=True)
# 3.7 Определяем цену и присваиваем значение параметру класса
if price_tag := p_soup.find('div', {'class': 'ip-bestprice'}):
weapon.full_price = float(price_tag.get_text(strip=True).replace(' ', ''))
# 3.8 Определяем ссылку на изображение и присваиваем значение параметру класса
if img_block := p_soup.find('div', {'class': 'ip-pic'}):
if img_tag := img_block.find('img'):
weapon.img = unquote(img_tag.get('src'))
return weapon
# 4. Создаем словарь где используем в качестве
# ключа для элемента значение созданного нами свойства класса
one_page_elements = {
elem.item_id: asdict(elem)
for elem in
# 2. Находим все ссылки на страницы товаров ^
# 3. К каждому элементу списка применяем созданную заранее |
# функцию обработки и получения содержимого страницы товара ---
map(weapon_item, tqdm(soup.find_all('a', class_='item')))
# tqdm для наглядности.
# В ходе выполнения будем видеть бар (как показано ниже)
# и не будем сучить ножками в нетерпении )))
}
# Кстати на счет нелюбви порталов к парсерам.
# Была идея использовать здесь многопоточность но
# Быстро получил бан, пришлось прикручивать прокси
# 5. Сохраняем в JSON
with open('data.json', 'w', encoding='utf-8') as json_file:
json.dump(
one_page_elements,
json_file,
ensure_ascii=False,
indent=2
)
100%|██████████| 65/65 [00:20<00:00, 3.11it/s]
{
"310780755-302028390": {
"url": "https://market.csgo.com/item/310780755-302028390-Nova | Predator (Well-Worn)/",
"img": "https://cdn.csgo.com//item/Nova | Predator (Well-Worn)/300.png",
"full_name": "Nova | Хищник",
"appearance": "Поношенное",
"full_price": 1.72,
"currency": "RUB"
},
...
"3608111561-188530139": {
"url": "https://market.csgo.com/item/3608111561-188530139-★ Nomad Knife | Case Hardened (Well-Worn)/",
"img": "https://steamcommunity-a.akamaihd.net/economy/image/-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpovbSsLQJf3ObcdTJN_uO3hb-EnvvxN4Tck29Y_chOhujT8om7jVawrUFtMjr3ItCdIwZtNFmE_QXqwenp1JHouJ6YnyM2vSkgtC6JzAv33087rDOhDg",
"full_name": "★ Нож «Бродяга» | Поверхностная закалка",
"appearance": "Поношенное",
"full_price": 13372.34,
"currency": "RUB"
}
}
Внимание! Вопрос(ы)
- Откуда мы будем брать данные с которыми будем сравнивать?
- Что будем делать после сравнения данных?
- Нужно ли (думаю что да) собирать данные со всех страниц со списком товаров, или можно ограничится одной? ...
Пока все... продолжение после ответов