Получить данные из сайта и записать их в файл PYTHON
Задание следующее :
Написать функцию, которая принимает в виде параметра целое число - количество цитат с сайта http://forismatic.com/ru/.
Надо получить ровно столько не повторяющихся цитат с данными и сохранить их в csv файл.
Заголовки файла:
Author, Quote, URL. Если автор не указан, цитату не брать.
Перед сохранением в csv, записи отсортировать по автору (в алфавитном порядке).
У меня получилось вернуть цитаты и сохранить их в файл, но вот сортировка по алфавиту и взять цитаты только с автором не получается.
Мои наработки:
url = "http://api.forismatic.com/api/1.0/"
def choise_random_int(int):
for number in range(int):
params = {"method": "getQuote",
"format": "json",
"key": number,
"lang": "ru"}
response = requests.get(url, params=params)
result = response.json()
for key in result:
print(f"{key} ------ {result[key]}")
myData = [choise_random_int(3)]
def without_author(myData):
om = [myData.get(key) for key in ('quoteText', 'quoteAuthor', 'quoteLink')]
return om
def sortByAlphabet(quoteAuthor):
return quoteAuthor[0]
newList = sorted(_, key=sortByAlphabet)
def save_in_file_csv(FILE_PATH,):
with open(FILE_PATH, "w", encoding="UTF-8"):
writer = csv.writer(FILE_PATH)
writer.writerows(newList)
В итоге мне нужно получить данные в таком виде:
quoteText ------ Зорко одно лишь сердце
quoteAuthor ------ Антуан Экзюпери
quoteLink ------ http://forismatic.com/ru/b2da20d992/
quoteText ------ Какой смысл в том, чтобы только знать?
quoteAutor ------ Шри Ауробиндо
quoteLink ------ http://forismatic.com/ru/b2da20d997/
Ответы (1 шт):
- не используйте зарезервированные слова в качестве имен переменных;
- используйте while если нужен бесконечный цикл с выходом по условию;
- по-максимуму рандомизируйте params['key'];
import random
def choise_random_int(qty):
unique_quotes = []
params = {
"method": "getQuote",
"format": "json",
"key": randint(0, 99999),
"lang": "ru"
}
while len(unique_quotes) < qty:
response = requests.get(url, params=params)
result = response.json()
if not result['quoteAuthor']:
continue
if result['quoteText'] not in [q['quoteText'] for q in unique_quotes]:
unique_quotes.append(result)
unique_quotes = sorted(unique_quotes, key=lambda k: k['quoteAuthor'])
return unique_quotes
Вызов choise_random_int(7) вернет семь уникальных цитат с quoteAuthor, отсортированных по имени автора:
[
{'quoteText': 'Кто изучил науки, а к делу их не применил, словно тот, кто арык прорыл, а поле не засеял, или засеял, да урожаем не воспользовался. ', 'quoteAuthor': 'Алишер Навои', 'senderName': '', 'senderLink': '', 'quoteLink': 'http://forismatic.com/ru/b56ca7a1f1/'},
{'quoteText': 'Управляй своим настроением, ибо оно если не повинуется, то повелевает. ', 'quoteAuthor': 'Гораций', 'senderName': '', 'senderLink': '', 'quoteLink': 'http://forismatic.com/ru/86b337312a/'},
{'quoteText': 'Мир преобразуют те, кто смог преобразовать себя, зная, что величайшее мастерство берет начало из контроля ума. Когда ум становится послушным слугой человека, весь мир ляжет у его ног.', 'quoteAuthor': 'Инаят Хан Хидаят', 'senderName': '', 'senderLink': '', 'quoteLink': 'http://forismatic.com/ru/e0d296ebf1/'},
{'quoteText': 'Воин должен научиться отдавать себе отчет в каждом действии, сделать каждое действие осознанным. Ведь мы пришли сюда ненадолго, и времени, которое нам отпущено, слишком мало для того, чтобы прикоснуться ко всем чудесам этого странного мира.', 'quoteAuthor': 'Карлос Кастанеда', 'senderName': '', 'senderLink': '', 'quoteLink': 'http://forismatic.com/ru/9902458aa1/'},
{'quoteText': 'Общего у людей только одно: все они разные. ', 'quoteAuthor': 'Роберт Зенд', 'senderName': '', 'senderLink': '', 'quoteLink': 'http://forismatic.com/ru/6be6670498/'},
{'quoteText': 'Тот, кто может и бездействует, хуже того, кто не может, но пытается что-то сделать. ', 'quoteAuthor': 'Уильям Блейк', 'senderName': '', 'senderLink': '', 'quoteLink': 'http://forismatic.com/ru/4d05b1c324/'},
{'quoteText': 'Слово — врата ума. Если держать их открытыми, ум ускользнет наружу. ', 'quoteAuthor': 'Хун Цзычен', 'senderName': '', 'senderLink': '', 'quoteLink': 'http://forismatic.com/ru/83f81e6de9/'}
]
А дальше выводите, сохраняйте, отправляйте дальше на обработку etc.