Ответы пользователя по тегу Python
  • Парсинг на python. Как исправить работу пагинации?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Не ту ссылку используете. Нужно эту - "www.yoox.com/RU/shoponline?dept=clothingmen&gender=U&page={x}&season=X&clientabt=SmsMultiChannel_ON%2CSrRecommendations_ON%2CNewDelivery_ON%2CRecentlyViewed_ON%2CmyooxNew_ON"

    В коде ниже страницы парсятся по очереди и сразу результат заносится в файл. В файл записываются только результаты со скидками!
    Вот рабочий код, может кому пригодится:
    import requests
    from bs4 import BeautifulSoup
    from lxml import html
    import csv
    
    url = 'https://www.yoox.com/ru/%D0%B4%D0%BB%D1%8F%20%D0%BC%D1%83%D0%B6%D1%87%D0%B8%D0%BD/%D0%BE%D0%B4%D0%B5%D0%B6%D0%B4%D0%B0/shoponline#/dept=clothingmen&gender=U&page=1&season=X'
    
    headers = {'user-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0',
    			'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }
    
    def getClothes(url,page_id):
    	clothes = []
    	respones = requests.get(url,headers=headers)
    	soup = BeautifulSoup(respones.text,'lxml')
    
    	mainContent = soup.find('div',id=f'srpage{page_id}')
    	products = mainContent.find_all('div',class_='col-8-24')
    
    	for product in products:
    
    		brand = product.find('div',class_='itemContainer')['data-brand'] # Бренд
    		cod10 = product.find('div',class_='itemContainer')['data-current-cod10'] # Для формирования ссылки yoox.com/ru/{cod10}/item
    		category = product.find('div',class_='itemContainer')['data-category']	# Категория
    		oldPrice = product.find('span',class_='oldprice text-linethrough text-light') # Старая цена (может не быть)
    		newPrice = product.find('span',class_='newprice font-bold') # Новая цена (может не быть)
    		
    		if oldPrice is not None:
    			# Данный код выполняется только, если на товар есть скидка
    			sizes = product.find_all('div',class_='size text-light')
    			str_sizes = ''
    
    			for x in sizes:
    				str_sizes += x.text.strip().replace('\n',';')
    			clothes.append({'art':cod10,
    							'brand':brand,
    							'category':category,
    							'url':f'https://yoox.com/ru/{cod10}/item',
    							'oldPrice':oldPrice.text,
    							'newPrice':newPrice.text,
    							'sizes':str_sizes
    							})
    	return clothes
    
    
    def getLastPage(url):
    	respones = requests.get(url,headers=headers)
    	soup = BeautifulSoup(respones.text,'lxml')
    	id = soup.find_all('li', class_ = 'text-light')[2]
    	
    	return int(id.a['data-total-page']) + 1
    
    def writeCsvHeader():
    	with open('yoox_man_clothes.csv', 'a', newline='') as file:
    		a_pen = csv.writer(file)
    		a_pen.writerow(('Артикул', 'Ссылка', 'Размеры', 'Бренд', 'Категория', 'Старая цена', 'Новая цена'))	
    
    def files_writer(clothes):
    	with open('yoox_man_clothes.csv', 'a', newline='') as file:
    		a_pen = csv.writer(file)
    		for clothe in clothes:
    			a_pen.writerow((clothe['art'], clothe['url'], clothe['sizes'], clothe['brand'], clothe['category'], clothe['oldPrice'], clothe['newPrice']))
    
    
    if __name__ == '__main__':
    	writeCsvHeader() # Запись заголовка в csv файл
    	lastPage = getLastPage(url) # Получаем последнею страницу
    	for x in range(1,lastPage): # Вместо 1 и lastPage можно указать диапазон страниц. Не начинайте парсить с нулевой страницы!
    		print(f'Скачавается: {x} из {lastPage-1}')
    		url = f'https://www.yoox.com/RU/shoponline?dept=clothingmen&gender=U&page={x}&season=X&clientabt=SmsMultiChannel_ON%2CSrRecommendations_ON%2CNewDelivery_ON%2CRecentlyViewed_ON%2CmyooxNew_ON'
    		files_writer(getClothes(url,x)) # Парсим и одновременно заносим данные в csv

    5e4ffa5e16614949170016.png
    Ответ написан
    3 комментария
  • Ввести на сайт из переменной в Python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Возможно. Можно использовать requests. Также зависит от сайта. Он (сайт, вроде google) может показать капчу.
    Вообще на python можно реализовать все что угодно(в разумных пределах), все зависит от программиста.
    Вот за пол минутки набросал для тостера:
    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://qna.habr.com/search?q='
    
    def search(keyword):
    	responce = requests.get(url+keyword)
    	soup = BeautifulSoup(responce.text,"html.parser")
    	try:
    		contents = soup.find_all('li',class_='content-list__item')
    		for answers in contents:
    			title = answers.find('a',class_='question__title-link question__title-link_list').text.strip()
    			count = answers.find('div',class_='mini-counter__count mini-counter__count_grey').text.strip()
    			print(f'{title} {count}')
    	except:
    		pass
    
    keyword = input('Введите запрос: ')
    search(keyword)

    5e4ed721e3906336228370.png
    Ответ написан
    2 комментария
  • Что значит * в написании аргумента в Python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Не стал сюда копировать, почитайте первый ответ, там очень подробно расписано.
    Что значит * (звёздочка) и ** двойная звёздочка в ...
    Ответ написан
    1 комментарий
  • Как инициализировть pyttsx3?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Попробуйте так:
    engine = pyttsx3.init('dummy')
    Ответ написан
  • Как реализовать задержку в запросе?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    import time
    time.sleep(3) # Количество секудн

    Но что-то сверху мне подсказывает, что title меняет javascript...
    PS:Можете дать ссылку?
    Ответ написан
  • Как установить pyaudio?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    У вас python 32-х битный.

    Вкратце: разрядность ОС и Python должна совпадать - в данном случае в обоих случаях - 64.

    Wheel - специальный формат для установки пакетов. Он представляет из себя простой ZIP архив с необходимыми файлами, при этом по сути из установки исключена стадия сборки. Например, при установке колеса нет нужды компилировать расширения Python (.pyd, .so), которые включены в некоторые пакеты, работающие с низкоуровневым кодом на C. Например, numpy, scipy, tensorflow. Компилировать не нужно, потому что скомпилированные файлы уже включены в архив и вам (установщику пакетов) нужно только распаковать файлы и положить в нужную папку. Так как скомпилированные файлы имеют разный формат для как минимум разных ОС собирают разные колеса. Ориентироваться можно по имени - win в имени говорит, что колесо собрали для специально для Windows и на других ОС работать не будет. Также вы должны соблюдать разрядность как ОС, так и самого интерпретатора - если колесо собрано для 64 (amd64 в названии), то ОС и интерпретатор должны быть такой же разрядности. Не все пакеты, тем не менее, разделяются по разрядности и ОС - многие написаны на голом Python и без разницы куда устанавливаться.
    stackoverflow
    Ответ написан
    Комментировать
  • Как вывести дни между датами?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    from datetime import datetime
    
    firstDate = '16022020'
    secondDate = '01012020'
    
    f_date = datetime.strptime(firstDate,'%d%m%Y').date()
    s_date = datetime.strptime(secondDate,'%d%m%Y').date()
    
    print((f_date-s_date).days)

    Выведет: 46

    from datetime import datetime,timedelta,date
    
    firstDate = '16022020'
    secondDate = '01012020'
    
    f_date = datetime.strptime(firstDate,'%d%m%Y').date()
    s_date = datetime.strptime(secondDate,'%d%m%Y').date()
    
    delta = timedelta(days=1)
    while s_date <= f_date:
        print (s_date.strftime("%d.%m.%Y"))
        s_date += delta

    Вывод:
    01.01.2020
    02.01.2020
    03.01.2020
    04.01.2020
    ...
    12.02.2020
    13.02.2020
    14.02.2020
    15.02.2020
    16.02.2020
    Ответ написан
    1 комментарий
  • Как получить ссылку на результат POST запроса?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    print(response.url)
    А вы уверены, что ваш запрос работает? Ведь там кроме ИНН есть еще скрытый параметр:
    type="hidden" name="bea387c29bafaedb3664270c960938b7" value="8d94279cc614556c8b8670d77e07b5e2">
    Без них у меня запрос не работает. У вас скорее всего name и value будет другим.
    Ответ написан
  • После ввода неправильного названия в бота погоды на pythone, выскакивает ошибка,что с этим делать?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Использовать конструкцию try - except.
    Рабочий код:
    import telebot
    import pyowm
    
    owm = pyowm.OWM('key', language = "ru")
    bot = telebot.TeleBot('token')
    
    @bot.message_handler(content_types=['text'])
    def send_echo(message):
    	try:
    		observation = owm.weather_at_place( message.text )
    		w = observation.get_weather()
    		temp = w.get_temperature('celsius')["temp"]
    		hum = w.get_humidity()
    		time = w.get_reference_time(timeformat='iso')
    		wind = w.get_wind()["speed"]
    
    		answer ="В городе " + message.text + " сейчас " + w.get_detailed_status() + "\n"
    		answer += "Температура сейчас в районе " + str(temp) + "\n\n" + "\nСкорость ветра: " + str(wind) + "м/с" + "\n" + "\nВлажность: " + str(hum) + "%" + "\n" + "\nВремя: " + str(time) + "\n"
    
    		if temp < 11:
    			answer += "Сейчас очень холодно."
    		elif temp < 20:
    			answer += "Сейчас прохладно, лучше одеться потеплее."
    		else:
    			answer += "Температура в норме!"
    
    		bot.send_message(message.chat.id, answer)
    	except:
    		bot.send_message(message.chat.id,'Ошибка! Город не найден.')
    bot.polling( none_stop = True)
    input()

    5e494983ac97a904403016.png
    Ответ написан
  • Установка PyQt5?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Нужно обновить pip.
    sudo pip3 install --upgrade pip
    Ответ написан
    Комментировать
  • Как исправить ошибку selenium.common.exceptions.WebDriverException?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    На stackoverflow говорят (ну вы же видели) что скорее всего недостаточно свободного места.
    Ответ написан
    Комментировать
  • Не работает pyttsx3?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Попробуйте так:
    engine = pyttsx3.init('dummy')
    Старейшины github'a говорят, что на некоторых ПК параметр 'dummy' нужно передавать, на некоторых нет. Также нужно удалить gen_py в C:\Users\your_user_name\AppData\Local\Temp\, или вообще очистите директорию Temp.
    PS1: Переходите на Linux, будет меньше проблем. Ну или больше. Здесь как повезет.
    PS2: На PS1 не обращайте внимания.
    Ответ написан
    Комментировать
  • Python pickle слетает кодировка при записи в файл?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Ну вы же открываете и записываете в бинарный файл. Почему в файле должен быть читаемый текст?
    Ну можете открыть HEX редактором. На выходе в файле ведь будут байты!
    Ответ написан
    3 комментария
  • Как переместить все print из цикла в 1 строку?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    text = 'строка'[::-1]
    print(text)
    #акортс

    Еще:
    print('строка'[::-1])
    #акортс

    И еще:
    print(''.join(reversed('строка')))
    #акортс
    Ответ написан
    3 комментария
  • Как сделать так, что-бы текст не вылезал за границы изображения в python через PIL?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Уменьшить размер шрифта, или перенести текст на новую строку.
    Ответ написан
    2 комментария
  • Как разделить строку в vk_api на python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    command = '!скажи текст'
    print(command[7:])
    #текст
    
    command2 = '!скажи много текста'
    print(command2[7:])
    #много текста

    Можно еще так:
    command = '!скажи текст'
    print(command.split(' ')[1])
    #текст

    ну или так:
    command = '!скажи текст'
    print(command.replace('!скажи ',''))
    #текст

    наркоманы могут делать так:
    command = '!скажи текст'
    print((command[::-1][0:len(command[::-1])-7])[::-1])
    #текст

    Сатанисты делают так:
    import base64
    command = '!скажи текст'
    t = 'KGNvbW1hbmRbOjotMV1bMDpsZW4oY29tbWFuZFs6Oi0xXSktN10pWzo6LTFd'
    print(eval(compile(base64.b64decode(t),'<string>', 'eval')))
    #текст
    Ответ написан
    Комментировать
  • Как вытащить табличные данные из html?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    На быструю руку склепал. Не факт что код правильный, но рабочий:
    Старый код:
    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://coinmarketcap.com/'
    r = requests.get(url)
    
    soup = BeautifulSoup(r.text, 'lxml')
    all = soup.find_all('',class_='cmc-table-row')
    
    for x in all:
    	rank = x.find('td',class_='cmc-table__cell--sort-by__rank').text
    	name = x.find('td',class_='cmc-table__cell--sort-by__name').text
    	market_cap = x.find('td',class_='cmc-table__cell--sort-by__market-cap').text
    	price = x.find('td',class_='cmc-table__cell--sort-by__price').text
    	volume = x.find('td',class_='cmc-table__cell--sort-by__volume-24-h').text
    	circulating_supply = x.find('td',class_='cmc-table__cell--sort-by__circulating-supply').text
    	change = x.find('td',class_='cmc-table__cell--sort-by__percent-change-24-h').text
    	print(f'{rank} {name} {market_cap} {price} {volume} {circulating_supply} {change}')

    5e39a5a9404ac829063108.png

    UPDATE 22.10.20:
    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://coinmarketcap.com/'
    r = requests.get(url)
    
    soup = BeautifulSoup(r.text, 'lxml')
    all = soup.find_all('',class_='cmc-table-row')
    
    for x in all:
      rank = x.find('td',class_='rc-table-cell table-col-rank rc-table-cell-fix-left').text
      name = x.find('a',class_='cmc-link').find('p').text
      market_cap = x.find('td',class_='rc-table-cell font_weight_500___2Lmmi').text
      price = x.find('td',class_='rc-table-cell font_weight_500___2Lmmi').text
      volume = x.find('div',class_='Box-sc-16r8icm-0 sc-1anvaoh-0 gxonsA').a.p.text
      circulating_supply = x.find('p',class_='Text-sc-1eb5slv-0 kqPMfR').text
      # change = x.find('td',class_='cmc-table__cell--sort-by__percent-change-24-h').text
      print(f'{rank} {name} {market_cap} {price} {volume} {circulating_supply}')
    Ответ написан
  • Проблема с ботом на python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    bot.send_message(message.chat.id,'Посмотри на клавиатуру и выбери свой город',reply_markup=markup)

    Между chat и id нужна точка вместо запятой.
    Ответ написан
    Комментировать
  • TelegramBotAPI Python выдает ошибку,что делать?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Возможно, Роскомнадзор блокирует.
    Ответ написан
  • Как повторить определённую функцию в Python 3?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Не знаю насколько правильно, но через цикл while работает:
    name = input(" Ваше имя; ")
    a = int(input(" Ваш возраст; ") )
    
    print(" Ваше имя: " + name + "; и ваш возраст: " + str(a) )
     
    what = input(" Хотите увиличить свой возраст ? (Да, Нет); ") 
    if what == "Да":
    	while True:
    	     b = int(input(" Сколько лет хотите прибавить? ;") )
    	     a = a + b
    	     print(" Ваш новый возраст: " + str(a))
    	     what = input(" Хотите увиличить свой возраст ещё раз ? (Да, Нет);")
    	     if what == "Нет":
    	     	break
           
    elif what == "Нет":
      print(" Ну, как хочешь, пока!")
    
    else:
      print(" Я не знаю что делать :(")
    Ответ написан