Request url wikipedia by date

0

Hello, a great friend made me this code, I'm very new to python: '

from bs4 import BeautifulSoup
import requests

url = "https://dumps.wikimedia.org/other/pageviews/2018/2018-04/"

page_html = requests.get(url).content

soup = BeautifulSoup(page_html, "html5lib")

links = [ (url+link['href'])
          for link in soup.find_all('a')
          if "pageviews-" in link['href'] ]

for link in links: print(link)

It's listing perfect dumps for wikipedia, but I need to be listed by the date of the file, step a range of dates and it lists me the files in this range of dates.

Follow the wikipedia link link

Can anyone help me?

    
asked by anonymous 09.04.2018 / 13:20

2 answers

0

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)
    
09.04.2018 / 17:54
0

In the example below I'm using datetime to display only those of today.

from bs4 import BeautifulSoup
import requests
import datetime

url = "https://dumps.wikimedia.org/other/pageviews/2018/2018-04/"
proxies = {
    'http': 'http://10.1.101.101:8080',
    'https': 'http://10.1.101.101:8080',
    'ftp': 'http://10.1.101.101:8080',

}

page_html = requests.get(url, proxies=proxies).content

soup = BeautifulSoup(page_html, "html5lib")

links = [ (url+link['href'])

          for link in soup.find_all('a')
          if "pageviews-" in link['href'] 
          and datetime.datetime.now().strftime('%Y%m%d') in link['href']]

for link in links: print(link)
    
09.04.2018 / 17:46