@Weishaupt

Задача. Скачать файлы(robot.txt и sitemap.xml) с сайтов которые находятся в файле site_base.txt, как пройти по всем значениям?

Задача:
На­пиши прог­рамму, которая про­ходит сай­ты по спис­ку, ска­чива­ет фай­лы robots.txt и sitemap.xml и сох­раня­ет на диск. В слу­чае если файл не най­ден, выводит­ся сооб­щение об этом.
Проблема:
Не могу понять как структурировать код для правильной работы, как пройти по списку сайтов из site_base.txt с двумя и более запросами (robot.txt и sitemap.xml) к каждому сайту из списка и вывести сообщение об ошибке в случае отрицательного ответа.
У https://xakep.ru и https://vc.ru есть оба необходимых запроса (robot.txt и sitemap.xml), habr не отдает ничего(для него необходим вывод сообщения об этом)
Формат в site_base.txt:
https://xakep.ru
https://habr.com
https://vc.ru
...
Наброски:
import requests
import shutil
import os
import urllib
with open('site_base.txt', 'r') as f:
    for line in f:
        line = line.strip() + '/robots.txt'
        print(line)
        dirname, filename = os.path.split(line)
        try:
            r = requests.get(line, stream=True)
        except ConnectionError:
            print('Error')
            continue
        if r.status_code == 200:
            with open(urllib.parse.urlsplit(line).netloc + ".txt", 'wb') as j:
                r.raw.decode_content = True
                shutil.copyfileobj(r.raw, j)
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
AlexNest
@AlexNest Куратор тега Python
Работаю с Python/Django
Как-то так? Возможно несколько переусложнено и нет проверки на статускод (сами допишите, если надо), но оно работает
# site_base.txt
https://xakep.ru
https://habr.com
https://vc.ru

# [file_name].py
import requests
import os
def append_filename(url:str, filename:str) ->tuple:
    domain = url.split('//')[-1] 
    data = (domain,  url + '/' + filename)
    return data


def save_file_to_disk(filename:str):
    if not os.path.exists('files'): os.mkdir('files')
    with open('site_base.txt', 'r', encoding='UTF-8') as site_base:
        sites_list = site_base.read().split('\n')

    urls_list = [append_filename(url, filename) for url in sites_list]
    for url in urls_list:
        try:
            domain = url[0]
            requested_url = url[1]

            response = requests.get(requested_url)

            saved_filename = domain+'_'+filename
            file_path = os.path.join('files',saved_filename)

            with open(file_path, 'a', encoding='UTF-8') as robots:
                robots.write(response.text)
        except requests.exceptions.RequestException as e:
            print(e) 

save_file_to_disk('robots.txt')
save_file_to_disk('sitemap.xml')
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Оставляя в стороне шероховатости, надо то, что после for line in f:, превратить в функцию, которая принимает line и filename(который либо “robot” либо “sitemap”), естественно, подставляя line и filename куда надо в коде, а в остальном функция должна практически повторять всё, что в коде. Ну и вызывать эту функцию дважды для каждого line, подставляя то robot то sitemap.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы