[webpages] Clean up how we fetch webpage data
This commit is contained in:
@ -59,11 +59,9 @@ class WebPage(ScrobblableMixin):
|
|||||||
def _raw_domain(self):
|
def _raw_domain(self):
|
||||||
self.url.split("//")[-1].split("/")[0]
|
self.url.split("//")[-1].split("/")[0]
|
||||||
|
|
||||||
def _update_extract_from_web(self, force=True):
|
def _update_extract_from_web(self, raw_text: str = "", force=True):
|
||||||
headers = {
|
if not raw_text:
|
||||||
"headers": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0"
|
raw_text = requests.get(self.url, headers=headers).text
|
||||||
}
|
|
||||||
raw_text = requests.get(self.url, headers=headers).text
|
|
||||||
if not self.extract or force:
|
if not self.extract or force:
|
||||||
self.extract = trafilatura.extract(raw_text)
|
self.extract = trafilatura.extract(raw_text)
|
||||||
self.save(update_fields=["extract"])
|
self.save(update_fields=["extract"])
|
||||||
@ -95,34 +93,38 @@ class WebPage(ScrobblableMixin):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def clean_title(self, title: str, save=True):
|
def clean_title(self, title: str, save=True):
|
||||||
if len(title.split('|')) > 1:
|
if len(title.split("|")) > 1:
|
||||||
if "The Quietus" in title:
|
title = title.split("|")[0]
|
||||||
title = title.split('|')[-0]
|
if len(title.split("–")) > 1:
|
||||||
else:
|
title = title.split("–")[0]
|
||||||
title = title.split('|')[0]
|
if len(title.split(" - ")) > 1:
|
||||||
if len(title.split('–')) > 1:
|
title = title.split(" - ")[0]
|
||||||
title = title.split('–')[0]
|
|
||||||
if len(title.split(' - ')) > 1:
|
|
||||||
title = title.split(' - ')[0]
|
|
||||||
self.title = title.strip()
|
self.title = title.strip()
|
||||||
|
|
||||||
if save:
|
if save:
|
||||||
self.save(update_fields=["title"])
|
self.save(update_fields=["title"])
|
||||||
|
|
||||||
|
def _update_domain_from_url(self, save=False):
|
||||||
|
|
||||||
def _update_domain_from_url(self):
|
|
||||||
domain = self.url.split("//")[-1].split("/")[0].split("www.")[-1]
|
domain = self.url.split("//")[-1].split("/")[0].split("www.")[-1]
|
||||||
self.domain, created = Domain.objects.get_or_create(root=domain)
|
self.domain, created = Domain.objects.get_or_create(root=domain)
|
||||||
|
|
||||||
def _update_data_from_web(self, force=True):
|
if save:
|
||||||
headers = {
|
self.save(update_fields=["domain"])
|
||||||
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0"
|
|
||||||
}
|
def _update_title_from_web(self, raw_text: str, save=False):
|
||||||
raw_text = requests.get(self.url, headers=headers).text
|
self.title = raw_text[
|
||||||
if not self.title or force:
|
raw_text.find("<title>") + 7 : raw_text.find("</title>")
|
||||||
self.set_title(raw_text[
|
]
|
||||||
raw_text.find("<title>") + 7 : raw_text.find("</title>")
|
|
||||||
])
|
if not self.title and self.extract:
|
||||||
|
first_line = self.extract.split("\n")[0]
|
||||||
|
if len(first_line) < 254:
|
||||||
|
self.title = first_line
|
||||||
|
|
||||||
|
if save:
|
||||||
|
self.save(update_fields=["title"])
|
||||||
|
|
||||||
|
def _update_date_from_web(self, save=False):
|
||||||
try:
|
try:
|
||||||
date_str = find_date(str(self.url))
|
date_str = find_date(str(self.url))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@ -130,12 +132,19 @@ class WebPage(ScrobblableMixin):
|
|||||||
if date_str:
|
if date_str:
|
||||||
self.date = pendulum.parse(date_str).date()
|
self.date = pendulum.parse(date_str).date()
|
||||||
|
|
||||||
|
if save:
|
||||||
|
self.save(update_fields=["date"])
|
||||||
|
|
||||||
|
def fetch_data_from_web(self, save=True, force=True):
|
||||||
|
raw_text = trafilatura.fetch_url(self.url)
|
||||||
if not self.extract or force:
|
if not self.extract or force:
|
||||||
self.extract = trafilatura.extract(raw_text)
|
self.extract = trafilatura.extract(raw_text)
|
||||||
if not self.title:
|
|
||||||
first_line = self.extract.split("\n")[0]
|
if not self.title or force:
|
||||||
if len(first_line) < 254:
|
self._update_title_from_web(raw_text)
|
||||||
self.title = first_line
|
|
||||||
|
if not self.date or force:
|
||||||
|
self._update_date_from_web()
|
||||||
|
|
||||||
if not self.domain or force:
|
if not self.domain or force:
|
||||||
self._update_domain_from_url()
|
self._update_domain_from_url()
|
||||||
@ -143,15 +152,8 @@ class WebPage(ScrobblableMixin):
|
|||||||
if not self.run_time_seconds or force:
|
if not self.run_time_seconds or force:
|
||||||
self.run_time_seconds = self.estimated_time_to_read_in_seconds
|
self.run_time_seconds = self.estimated_time_to_read_in_seconds
|
||||||
|
|
||||||
self.save(
|
if save:
|
||||||
update_fields=[
|
self.save()
|
||||||
"title",
|
|
||||||
"domain",
|
|
||||||
"extract",
|
|
||||||
"run_time_seconds",
|
|
||||||
"date",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def find_or_create(cls, data_dict: Dict) -> "GeoLocation":
|
def find_or_create(cls, data_dict: Dict) -> "GeoLocation":
|
||||||
@ -167,6 +169,6 @@ class WebPage(ScrobblableMixin):
|
|||||||
webpage = cls.objects.filter(url=data_dict.get("url")).first()
|
webpage = cls.objects.filter(url=data_dict.get("url")).first()
|
||||||
|
|
||||||
if not webpage:
|
if not webpage:
|
||||||
webpage = cls.objects.create(url=data_dict.get("url"))
|
webpage = cls(url=data_dict.get("url"))
|
||||||
webpage._update_data_from_web()
|
webpage.fetch_data_from_web(save=True)
|
||||||
return webpage
|
return webpage
|
||||||
|
|||||||
Reference in New Issue
Block a user