¿Cómo puedo hacer web scraping en Julia?

8

Quiero extraer los nombres de las universidades y sus sitios web de este sitio en listas.

En Python lo hice con BeautifulSoup v4:

import requests
from bs4 import BeautifulSoup
import pandas as pd

page = requests.get('https://thebestschools.org/features/best-computer-science-programs-in-the-world/')
content = BeautifulSoup(page.text, 'html.parser')

college_name = []
college_link = []
college_name_list = content.find_all('h3',class_='college')
for college in college_name_list:
    if college.find('a'):
        college_name.append(college.find('a').text)
        college_link.append(college.find('a')['href'])

Realmente me gusta programar en Julia y, dado que es muy similar a Python, quería saber si puedo hacer scraping web también en Julia. Cualquier ayuda sería apreciada.

PseudoCodeNerd
fuente
1
Consejo: Nunca pregunte qué paquetes existen para hacer X en el desbordamiento de pila. Siempre pregunte cómo hacer X. Por dos razones: 1 las preguntas de compra se cierran rápidamente. 2 obtenga mejores respuestas que muestren cómo usar el paquete o las funciones estándar de la biblioteca.
Lyndon White
Si desea explorar usted mismo, vaya a pkg.julialang.org y escriba 'html' en el campo de búsqueda. También 'xml'. Encontrarás muchos paquetes que te permiten explorar documentos similares a xml.
Tasos Papastylianou

Respuestas:

4

Su código de Python no funciona del todo. Supongo que el sitio web ha sido actualizado recientemente. Desde que han eliminado los enlaces por lo que puedo decir,. Aquí hay un ejemplo similar usando Gumbo.jl y Cascadia.jl .

Estoy usando el downloadcomando integrado para descargar la página web. que lo escribe en el disco en un archivo temporal, que luego leí en String. Puede ser más limpio usar HTTP.jl , que podría leerlo directamente en una cadena. Pero para este simple ejemplo está bien

using Gumbo
using Cascadia

url = "https://thebestschools.org/features/best-computer-science-programs-in-the-world/"

page = parsehtml(read(download(url), String))


college_name = String[]
college_location = String[]


sections = eachmatch(sel"section", page.root)
for section in sections
    maybe_col_heading = eachmatch(sel"h3.college", section)
    if length(maybe_col_heading) == 0
        continue
    end
    col_heading = first(maybe_col_heading)

    name = strip(text(last(col_heading.children)))
    push!(college_name, name)

    loc = first(eachmatch(sel".school-location", section))
    push!(college_location, text(loc[1]))
end


[college_name college_location]

Salidas

julia> [college_name college_location]
51×2 Array{String,2}:
 "Massachusetts Institute of Technology (MIT)"  "Cambridge, Massachusetts"
 "Massachusetts Institute of Technology (MIT)"  "Cambridge, Massachusetts"
 "Stanford University"                          "Stanford, California"
 "Carnegie Mellon University"                   "Pittsburgh, Pennsylvania"
 

 "Shanghai Jiao Tong University"                "Shanghai, China"
 "Lomonosov Moscow State University"            "Moscow, Russia"
 "City University of Hong Kong"                 "Hong Kong"

Parece que aparece MIT dos veces. Probablemente el código de filtrado en mi demo no sea silencioso. Pero: encogimiento de hombros: el MIT es una gran universidad que escucho. Julia fue inventada allí: alegría:

Lyndon White
fuente
3

Si.

Con el fin de raspar la web, Julia tiene tres bibliotecas:

  • HTTP.jl para descargar el código fuente frontend del sitio web (esto es comparable a la requestsbiblioteca de Python ),
  • Gumbo.jl para analizar el código fuente descargado en un objeto estructurado jerárquico,
  • y Cascadia.jl para finalmente raspar usando una API de selector CSS.

Vi que eres joven (16) desde tu perfil y tu implementación de Python también es correcta.

Por lo tanto, le sugiero que intente hacer una tarea de raspado web con estas tres bibliotecas para comprender mejor cómo funcionan.

La tarea que desea hacer, desafortunadamente, aún no se puede lograr con Cascadia ya que h3está en un <span>SelectorType implementado actualmente en Cascadia.jl
Source

PseudoCodeNerd
fuente
1
Estoy bastante seguro de que puedes hacer esto con Cascadia. Creo que spanpor sí solo funciona bien? Vía selectores de estilo CSS
Lyndon White
1
También vale la pena señalar que uno podría usar beautifulsoup a través de la interfaz de python dentro de julia.
Tasos Papastylianou
¿@tasos tal vez haga una respuesta separada que muestre cómo hacer eso?
Lyndon White
@LyndonWhite eh, estoy seguro de que ya hay suficientes ejemplos malos de Pycall en SO sin que yo agregue otro ...: p
Tasos Papastylianou