繁体   English   中英

尝试从站点抓取搜索结果 - Python

[英]Attempt to scrape search results from a site - Python

我需要使用 python 从以下地址中抓取电话号码和 email 地址:

url = 'https://rma.cultura.gob.ar/#/app/museos/resultados?provincias=Buenos%20Aires'

source = requests.get(url).text

soup = BeautifulSoup(source, 'lxml')

print(soup)

问题是我从 requests.get 得到的不是我需要的 html。 我想该站点使用 javascript 来显示这些结果,但我对此并不熟悉,因为我刚刚开始使用 python 编程。 我通过将每个结果页面的代码复制到一个唯一的文本文件,然后使用正则表达式提取电子邮件来解决这个问题,但我很好奇是否有一些简单的事情可以直接访问数据。

您在页面上看到的数据是从外部 URL 通过 JavaScript 加载的。要获取数据,您可以使用requests / json模块,例如:

import json
import requests

api_url = "https://rmabackend.cultura.gob.ar/api/museos"

params = {
    "estado": "Publicado",
    "grupo": "Museo",
    "o": "p",
    "ordenar": "nombre_oficial_institucion",
    "page": 1,
    "page_size": "12",
    "provincias": "Buenos Aires",
}

while True:
    data = requests.get(api_url, params=params).json()

    # uncomment this to print all data:
    # print(json.dumps(data, indent=4))

    for d in data["data"]:
        print(d["attributes"]["nombre-oficial-institucion"])

    if params["page"] == data["meta"]["pagination"]["pages"]:
        break

    params["page"] += 1

印刷:

2 Museos, Bellas Artes y MAC
Archivo Histórico y Museo "Astillero Río Santiago" (ARS)
Archivo Histórico y Museo del Servicio Penitenciario Bonaerense
Archivo y Museo Historico Municipal Roberto T. Barili "Villa Mitre"
Asociación Casa Bruzzone
Biblioteca Popular y Museo "José Manuel Estrada"
Casa Museo "Haroldo Conti"
Casa Museo "Xul Solar" -  Tigre
Complejo Histórico y Museográfico "Dr. Alfredo Antonio Sabaté"


...and so on.

该页面正在使用 AJAX 加载内容。 使用类似 Selenium 的东西来模拟浏览器将允许所有 javascript 运行,然后您可以提取源代码:

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome()
url = 'https://rma.cultura.gob.ar/#/app/museos/resultados?provincias=Buenos%20Aires'

# navigate to the page
driver.get(url)
# wait until a link with text 'ficha' has loaded
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, 'ficha')))
source = driver.page_source
soup = BeautifulSoup(source, features='lxml')
driver.quit()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM