import glob import json import logging import os import ssl from http import HTTPStatus import requests from progress.bar import Bar logging.basicConfig(level=logging.INFO) ssl._create_default_https_context = ssl._create_unverified_context class NewsHtmlDowloader: """ Haber sitelerindeki HTML içeriklerini indirmek ve kaydetmek için kullanılan sınıf. Methods: __init__(): NewsHtmlDowloader sınıfını oluşturan yapıcı metot. save_html(name, id, raw_html_path, html): Belirtilen site ve id ile birlikte verilen HTML içeriğini bir dosyaya kaydeder. download(url): Belirtilen URL'den HTML içeriğini indirir. run(name, meta_path, raw_html_path): Belirtilen site adıyla ilişkili meta dosyasını okuyarak HTML içeriklerini indirir ve kaydeder. """ def __init__(self): """ NewsHtmlDowloader sınıfını oluşturan yapıcı metot. Returns: None """ logging.debug('NewsHtmlDowloader Sınıfı oluşturuldu') @staticmethod def save_html(name, id, raw_html_path, html): """ Belirtilen site ve id ile birlikte verilen HTML içeriğini bir dosyaya kaydeder. Args: name (str): Kaydedilecek sitenin adı. id (str): Kaydedilecek dosyanın id'si. raw_html_path (str): HTML dosyalarının kaydedileceği dizin yolunu belirtir. html (str): Kaydedilecek HTML içeriği. Returns: None Raises: IOError: Dosya veya dizin oluşturma hatası durumunda oluşabilir. """ file_dir = f"{raw_html_path}/{name}" if not os.path.exists(file_dir): os.makedirs(file_dir) file_path = f"{file_dir}/{id}.html" with open(file_path, 'w', encoding='utf-8') as output: output.write(html) @staticmethod def download(url): """ Belirtilen URL'den HTML içeriğini indirir. Args: url (str): İndirilecek URL. Returns: str: İndirilen HTML içeriği. Raises: Exception: İndirme başarısız olduğunda fırlatılır. """ resp = requests.get(url, headers={'User-Agent': 'Mozilla'}) if resp.status_code == HTTPStatus.OK: html = resp.text # if resp.encoding != "utf-8": # html = html.encode(resp.encoding).decode("utf-8") else: raise Exception( f"Failed Download: Status Code: {resp.status_code}") return html def run(self, name, meta_path, raw_html_path): """ Belirtilen site adıyla ilişkili meta dosyasını okuyarak HTML içeriklerini indirir ve kaydeder. Args: name (str): Site adı. meta_path (str): Meta dosyalarının bulunduğu dizin yolunu belirtir. raw_html_path (str): HTML dosyalarının kaydedileceği dizin yolunu belirtir. Returns: None """ lfs = glob.glob(f"{meta_path}/{name}.json") for lf in lfs: with open(lf, 'r') as json_file: links = json.load(json_file) _max = len(links) logging.info(f"{name} html dosyaları inidirlmeye başlandı.") with Bar(f'{name} Download Links', max=_max, suffix='%(percent).1f%% | %(index)d | %(remaining)d | %(max)d | %(eta)ds') as bar: for link in links: _id = link["id"] _source = link["source"] _url = link["url"] html = self.download(_url) self.save_html(name, _id, raw_html_path, html) bar.next() bar.finish() logging.info(f"{name} dosyası indirme işlemi tamamlandı.") if __name__ == '__main__': """ Uygulamanın ana çalıştırma noktası. Belirtilen sitelerin HTML içeriklerini indirir ve kaydeder. Returns: None """ downloader = NewsHtmlDowloader() sites = ["aa", "aksam", "cnnturk", "cumhuriyet", "ensonhaber", "haber7", "haberglobal", "haberler", "haberturk", "hurriyet", "milliyet", "ntv", "trthaber"] _meta_path = "../data/meta" _raw_html_path = "../data/html/raw" for _name in sites: downloader.run(name=_name, meta_path=_meta_path, raw_html_path=_raw_html_path)