簡體   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