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.


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:


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.