Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2022 18:42:06

Brannigan1
Зарегистрирован: 2022-04-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать правильно результат в файл csv

Всем добрый день.

Я новичок в python. Изучаю всего пару дней.
Нужно решить такую задачу по парсингу сайта. URL: https://www.remmers.ru/ru?

На сайте есть много страниц, url которых имеет вид "https://www.remmers.ru/ru/c/c{4- или 5-значный числовой номер}. Нужно перебрать все урлы, имеющие “хвост” в диапазоне от 7200 до 7220 и полученный результат записать в csv.

Я написал вот это:


import requests
import csv

categories = range(7200, 7220, 1)

def check_url(url_name):
for i in categories:
url = f'https://www.remmers.ru/ru/c/c{i}'
response = requests.get(url)
if response.ok:
with open(“category.csv”, “w”, encoding='utf-8') as file:
file.write(response.url)
file.close()

check_url('https://www.remmers.ru/ru/c/c')

В файл записывается только url c последним значением из range.
При этом если вместо записи в файл просто вывести результат в консоли через print(response.url), все урлы выводятся по порядку как надо. Что я делаю не так? Заранее всем спасибо за ответы и рекомендации.

Отредактировано Brannigan1 (Апрель 11, 2022 18:43:07)

Офлайн

#2 Апрель 11, 2022 20:26:51

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Как записать правильно результат в файл csv

открываешь файл для записи
для каждого i в диапазоне(7200, 7220)
ответ = запрос(url{i})
если код ответа == 200:
файл.записать(то что нужно записать)

Офлайн

#3 Апрель 12, 2022 05:49:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Как записать правильно результат в файл csv

Brannigan1
  
categories = range(7200, 7220, 1)
  
categories = range(7200, 7220 + 1)

Brannigan1
В файл записывается только url c последним значением из range.
Так ты прочитай сначала, как пользоваться модулем csv.
https://docs.python.org/3/library/csv.html#examples

То, что ты пишешь, - это же ахинея какая-то, не имеющая отношения к csv.

Brannigan1
В файл записывается только url c последним значением из range.
Brannigan1
Что я делаю не так?
Да у тебя просто на каждом шаге цикла файл по новой открывается, в нём всё стирается, естественно, и потом в пустой файл записывается одна текущая запись.



Отредактировано py.user.next (Апрель 12, 2022 05:53:10)

Офлайн

#4 Апрель 15, 2022 11:46:56

Brannigan1
Зарегистрирован: 2022-04-11
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать правильно результат в файл csv

py.user.next, спасибо! После твоего сообщения я переосмыслил все, что я делаю, подучил матчасть и написал следующий код:

import csv
import requests

with open('example.csv', ‘w’, newline='') as f: #создает файл csv
writer = csv.writer(f)
writer.writerow('URL') # прописывает первую строку
f.close()

for i in range(7000, 7021):
with open('example.csv', ‘a’, newline='', encoding='utf-8') as f: # открывает только что созданный файл и построчно дописывает значения, полученные из цикла
url = f'https://www.remmers.ru/ru/c/c{i}'
req = requests.get(url)
writer = csv.writer(f)
if req.ok is True:
writer.writerow(req.url)
else:
writer.writerow('CATEGORY c' + str(i) + ‘ - STATUS 404 - PAGE NOT FOUND’)
f.close()

Проблема решена. Все работает как надо. Тем не менее буду благодарен за критику и советы по оптимизации.

Отредактировано Brannigan1 (Апрель 15, 2022 11:47:13)

Офлайн

#5 Апрель 15, 2022 14:04:53

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1352
Репутация: +  118  -
Профиль   Отправить e-mail  

Как записать правильно результат в файл csv

[code python]между этими тегами вставлять код, для правильного отображения,список тегов в редакторе сообщений рядом со смайлом[/code]
я тебе писал алгоритм, который нужно было перевести на python
 import requests
with open('my_file.txt', 'w') as file:# открываю файл для записи
    print('идет процесс', end='')
    for i in range(7200, 7221): # для каждого i в диапазоне
        print('.', end='')
        resp = requests.get(f'https://www.remmers.ru/ru/c/c{i}') # ответ = запрос(url{i})
        if resp.status_code == 200: # если код ответа 200
            file.write(resp.url + '\n') # записываю в файл url
        else:# иначе
            file.write(f'category c{i} - {resp.status_code}') # записываю код и i
# с with файл закрывается автоматически
print('\nфайл записан')

Отредактировано xam1816 (Апрель 15, 2022 14:16:59)

Офлайн

#6 Апрель 15, 2022 15:20:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

Как записать правильно результат в файл csv

Brannigan1
Тем не менее буду благодарен за критику и советы по оптимизации.
Там у тебя файл открывается много раз, а нужно один раз его открыть. И если ты with используешь, то файл закрывается сам по себе в конце.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version