I took the liberty of using requests_html instead of BeautifulSoup, but logic can be easily transferred:
from requests_html import HTMLSession
from datetime import datetime
import re
url = "https://dumps.wikimedia.org/other/pageviews/2018/2018-04/"
session = HTMLSession()
r = session.get(url)
pre = r.html.find('pre', first=True)
data_inicial = datetime(2018, 4, 2)
data_final = datetime(2018, 4, 5)
for link in sorted(pre.links):
# Tentar isolar número entre dois hífens. Se não conseguir, não é um dos links que queremos
try:
date_str = re.search(r"-(\d+)-", link).group(1)
except AttributeError:
continue # Ir pra próxima iteração do for
# Transformamos o número entre dois hífens em objeto datetime
data_link = datetime.strptime(date_str, "%Y%m%d")
# Printamos o link completo somente se estiver entre as datas inicial e final
if data_inicial <= data_link <= data_final:
print(url + link)
If we were to include the time and list only pageviews pages, we would have
from requests_html import HTMLSession
from datetime import datetime
import re
url = "https://dumps.wikimedia.org/other/pageviews/2018/2018-04/"
session = HTMLSession()
r = session.get(url)
pre = r.html.find('pre', first=True)
data_inicial = datetime(2018, 4, 2, 13, 0) # 02/04/2018, 13:00
data_final = datetime(2018, 4, 5, 9, 0) # 05/04/2018, 9:00
for link in sorted(pre.links):
# link não inclui a base da url; é algo como 'projectviews-20180402-150000'
# Tentar isolar número entre dois hífens. Se não conseguir, não é um dos links que queremos
try:
date_str = re.search(r"-(\d+-\d+)", link).group(1)
# Regex = encontrar e capturar (parênteses) um ou mais dígitos (\d+) seguidos por hífen e mais um ou mais
# dígitos. Exemplo - em 'pageviews-20180405-220000' é capturada a substring '20180405-220000' (padrão que
# está dentro do grupo de captura)
except AttributeError:
continue # Ir pra próxima iteração do for
# Transformamos o número entre dois hífens em objeto datetime com hora
data_link = datetime.strptime(date_str, "%Y%m%d-%H%M%S")
# Printamos o link completo somente se estiver entre as datas inicial e final e se contiver a string "pageviews".
if data_inicial <= data_link <= data_final and "pageviews" in link:
print(url + link)