WebScraping 用于下载某些 .csv 文件

WebScraping for downloading certain .csv files

我有这个问题。如标题所述,我需要从网站下载某些 .csv 文件,但我遇到了麻烦。我对编程非常陌生,尤其是这个主题(网络抓取)

from bs4 import BeautifulSoup as BS
import requests

DOMAIN = 'https://datos.gob.ar'
URL = 'https://datos.gob.ar/dataset/cultura-mapa-cultural-espacios-culturales/'
FILETYPE = ".csv"


def get_soup(url):
    return BS(requests.get(url).text, 'html.parser')


for link in get_soup(URL).find_all('a'):
    file_link = link.get('href')
    if FILETYPE in file_link:
        print(file_link)

此代码显示了所有可用的 .csv 文件,但我只需要下载以“biblioteca popular.csv”、“cine.csv”和“museos.csv”结尾的文件。 17=]

也许这是一个非常简单的任务,但我找不到

https://datos.cultura.gob.ar/dataset/37305de4-3cce-4d4b-9d9a-fec3ca61d09f/resource/456d1087-87f9-4e27-9c9c-1d9734c7e51d/download/biblioteca_especializada.csv

https://datos.cultura.gob.ar/dataset/37305de4-3cce-4d4b-9d9a-fec3ca61d09f/resource/01c6c048-dbeb-44e0-8efa-6944f73715d7/download/biblioteca_popular.csv

https://datos.cultura.gob.ar/dataset/37305de4-3cce-4d4b-9d9a-fec3ca61d09f/resource/8d0b7f33-d570-4189-9961-9e907193aebc/download/casas_bicentenario.csv

https://datos.cultura.gob.ar/dataset/37305de4-3cce-4d4b-9d9a-fec3ca61d09f/resource/4207def0-2ff7-41d5-9095-d42ae8207a5d/download/museos.csv

https://datos.cultura.gob.ar/dataset/37305de4-3cce-4d4b-9d9a-fec3ca61d09f/resource/392ce1a8-ef11-4776-b280-6f1c7fae16ae/download/cine.csv

https://datos.cultura.gob.ar/dataset/37305de4-3cce-4d4b-9d9a-fec3ca61d09f/resource/87ebac9c-774c-4ef2-afa7-044c41ee4190/download/teatro.csv

您可以提取包含该信息的 JavaScript 对象,否则这些信息将被加载到您在浏览器中通过 JavaScript 运行 看到的位置。然后您需要做一些 Unicode 代码点清理和字符串清理并解析为 JSON。您可以使用关键字列表从所需的网址 select。

Unicode 清理方法

import json
import requests
import re

URL = 'https://datos.gob.ar/dataset/cultura-mapa-cultural-espacios-culturales/'

r = requests.get(URL)
search = ["Bibliotecas Populares", "Salas de Cine", "Museos"]
s = re.sub( r'\n\s{2,}', '', re.search(r'"@graph": (\[[\s\S]+{0}[\s\S]+)}}'.format(search[0]), r.text).group(1))
data = json.loads(re.sub(r'\"', '', re.sub(r'\u([0-9a-fA-F]{4})',lambda m: chr(int(m.group(1),16)),s)))

for i in data:
    if 'schema:name' in i:
        name = i['schema:name']
        if name in search:
            print(name)
            print(i['schema:url'])