Форум сайта python.su
Всем добрый день.
Я новичок в 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)
Офлайн
открываешь файл для записи
для каждого i в диапазоне(7200, 7220)
ответ = запрос(url{i})
если код ответа == 200:
файл.записать(то что нужно записать)
Офлайн
Brannigan1categories = range(7200, 7220, 1)
categories = range(7200, 7220 + 1)
Brannigan1Так ты прочитай сначала, как пользоваться модулем csv.
В файл записывается только url c последним значением из range.
Brannigan1
В файл записывается только url c последним значением из range.
Brannigan1Да у тебя просто на каждом шаге цикла файл по новой открывается, в нём всё стирается, естественно, и потом в пустой файл записывается одна текущая запись.
Что я делаю не так?
Отредактировано py.user.next (Апрель 12, 2022 05:53:10)
Офлайн
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)
Офлайн
[code python]между этими тегами вставлять код, для правильного отображения,список тегов в редакторе сообщений рядом со смайлом[/code]
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)
Офлайн
Brannigan1Там у тебя файл открывается много раз, а нужно один раз его открыть. И если ты with используешь, то файл закрывается сам по себе в конце.
Тем не менее буду благодарен за критику и советы по оптимизации.
Офлайн