news-extractor / src /download.py
Ümit Gündüz
add dataset and update code documentation
f4f5cfb
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)