Como posso fazer raspagem na web na Julia?

8

Quero extrair os nomes das universidades e seus sites deste site em listas.

Em Python, eu fiz isso com o 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'])

Eu realmente gosto de programar em Julia e, como é muito parecido com o Python, eu queria saber se também posso fazer scraping na Web. Qualquer ajuda seria apreciada.

PseudoCodeNerd
fonte
1
Dica: nunca pergunte quais pacotes existem para fazer o X no estouro de pilha. Sempre pergunte como executar o X. Por dois motivos: 1 perguntas sobre compras são fechadas rapidamente. 2 obtenha melhores respostas mostrando como usar as funções de pacote ou biblioteca padrão.
Lyndon White
Se você quiser se explorar, vá para pkg.julialang.org e digite 'html' no campo de pesquisa. Também 'xml'. Você encontrará muitos pacotes que permitem explorar documentos semelhantes a xml.
Tasos Papastylianou 21/01

Respostas:

4

Seu código python não funciona muito bem. Eu acho que o site foi atualizado recentemente. Desde que eles removeram os links, tanto quanto eu posso dizer ,. Aqui está um exemplo semelhante usando Gumbo.jl e Cascadia.jl .

Estou usando o downloadcomando interno para baixar a página da web. que grava no disco em um arquivo temporário, que eu leio em String. Pode ser mais limpo usar o HTTP.jl , que pode ser lido diretamente em uma String. Mas, para este exemplo simples, tudo bem

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]

Saídas

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 listou o MIT duas vezes. provavelmente o código de filtragem na minha demonstração não está tranquilo. Mas: encolher de ombros: o MIT é uma ótima universidade que eu ouvi. Julia foi inventada lá: alegria:

Lyndon White
fonte
3

Sim.

Para fins de raspagem na web, Julia possui três bibliotecas:

  • HTTP.jl para baixar o código-fonte front-end do site (isso é comparável à requestsbiblioteca do python ),
  • Gumbo.jl para analisar o código-fonte baixado em um objeto estruturado hierárquico,
  • e Cascadia.jl para finalmente raspar usando uma API seletora de CSS.

Vi que você é jovem (16) no seu perfil e sua implementação em python também está correta.

Portanto, sugiro que você tente executar uma tarefa de raspagem da Web com essas três bibliotecas para entender melhor como elas funcionam.

A tarefa que você deseja fazer, infelizmente, ainda não pode ser realizado com Cascadia desde o h3é em um <span>que atualmente não é uma SelectorType implementado em Cascadia.jl
Fonte

PseudoCodeNerd
fonte
1
Certeza de que você pode fazer isso com o Cascadia. Eu acho que spanpor si só funciona bem? Via seletores de estilo CSS
Lyndon White
1
Também vale ressaltar que é possível usar o beautifulsoup em si através da interface python na julia.
Tasos Papastylianou 21/01
@tasos talvez faça uma resposta separada mostrando como fazer isso?
Lyndon White
@LyndonWhite eh, eu tenho certeza que existem exemplos pycall ruins suficientes no SO, já sem que eu tenha adicionado outro ...: p
Tasos Papastylianou