Spaces:
Build error
Build error
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') | |
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) | |
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) | |