Lenguaje de programación para extraer y analizar texto y estadísticas de foros en línea. Microsoft Windows 7 -

He estado jubilado durante algunos años, pero solía ser un programador consumado. He usado lenguajes orientados a objetos y funcionales, así como Lisp y Prolog.

Estoy usando una PC de escritorio con Windows 7 de alta especificación.

Pregunta

Quiero piratear rápidamente algún software que inicie sesión automáticamente en un sitio web específico y extraiga texto. Tendrá que ser capaz de paginar a través de los foros. Preprocesaré mientras hago la extracción y luego postprocesaré los archivos que haya creado.

Estoy muy desactualizado con los idiomas que se usan en estos días. Podría hacerlo todo en VBA para Excel , pero no creo que sea la mejor opción. También me gustaría poder pasar el software a amigos que tal vez no tengan Excel.

Idealmente, estoy buscando un lenguaje de descarga gratuita con un IDE simple que esté orientado al procesamiento de texto. Me gustaría una curva de aprendizaje realmente rápida, así que estoy evitando los lenguajes de uso general pesados ​​​​que requieren que me equivoque sobre la carga de bibliotecas, etc.

Todas las sugerencias y el motivo de su elección son bienvenidas. Gracias.

Respuestas (3)

Python más uno o más de Scrapy , Requests , Mechanize , etc.

  • Gratis Gratis y de código abierto
  • Python funcional, procedimental o orientado a objetos, según su elección, los hace todos
  • Multiplataforma Desde una RaspberryPi hasta un clúster de supercomputadoras
  • Muy rápido de desarrollar y depurar Lenguaje muy sucinto pero claro con una curva de aprendizaje poco profunda y muy buenos informes de errores, seguimiento de pila, etc.
  • Mucha importación, manipulación y exportación de datos tanto en las bibliotecas estándar como en las bibliotecas de soporte
  • Gran apoyo de la comunidad

Ejemplo usando Scrapy, del sitio de documentación :

import scrapy

class StackOverflowSpider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['http://stackoverflow.com/questions?sort=votes']

    def parse(self, response):
        for href in response.css('.question-summary h3 a::attr(href)'):
            full_url = response.urljoin(href.extract())
            yield scrapy.Request(full_url, callback=self.parse_question)

    def parse_question(self, response):
        yield {
            'title': response.css('h1 a::text').extract()[0],
            'votes': response.css('.question .vote-count-post::text').extract()[0],
            'body': response.css('.question .post-text').extract()[0],
            'tags': response.css('.question .post-tag::text').extract(),
            'link': response.url,
        }

Esto se puede ejecutar como:

scrapy runspider stackoverflow_spider.py -o top-stackoverflow-questions.json

Lo acabo de probar en mi computadora y tomó menos de 5 segundos producir un archivo json de 47k que comienza:

captura de pantalla

IDE simple y gratuito

Hay una gran cantidad de IDE de Python gratuitos disponibles y la preferencia es en gran medida una cuestión de elección personal.

Python por defecto viene con inactividad que es factible pero limitada, personalmente puedo recomendar: - Wing IDE , la versión 101 es gratuita , - SPE , - Spyder , - eric ide

El wiki enumera una gran cantidad de entornos de desarrollo: puede usar incluso Eclipse con el paquete pyDev para una funcionalidad IDE completa.

Información suplementaria

Como se mencionó en los comentarios, también debo mencionar Beautiful Soup para completar (y seguir con Scrapy ,-) Para un IDE, algunos no creen que pueda vencer a la edición comunitaria de PyCharm , que también se puede usar comercialmente. – (Gracias Mawg )

Estoy de acuerdo, pero también mencionaría Beautiful Soup crummy.com/software/BeautifulSoup para completar (y seguir con Scrapy ,-) Para IDE, no creo que puedas vencer a la edición comunitaria de PyChaerm jetbrains.com/pycharm que también se puede utilizar comercialmente.

Si se siente cómodo con Windows y VBA, supongo que logrará escribir un código de pegamento en C#.

En general, necesitas al menos 3 cosas:

  1. Clase HttpClient (y clases relacionadas), que le permitirá realizar solicitudes http con soporte de sesión http (mediante el uso de cookies). Aquí hay un ejemplo:

https://stackoverflow.com/questions/12373738/how-do-i-set-a-cookie-on-httpclients-httprequestmessage

  1. Biblioteca para extraer texto de html. Por supuesto, puede hacerlo directamente convirtiendo html a DOM y extrayendo fragmentos individuales del árbol de objetos DOM, pero sugiero usar la biblioteca Readability en su lugar. Aquí está el puerto de legibilidad a C#:

https://github.com/marek-stoj/NReadability

  1. En cuanto al IDE gratuito para C#, busque Visual Studio Community 2013. También es gratuito para uso comercial (para particulares o hasta 250 ordenadores en una sola empresa).

Aquí hay un vbscript que escribí que hace eso.

Comprueba el clima local.

Utiliza expresiones regulares para analizar el texto.

    Option Explicit

    Dim shell   : Set shell = CreateObject("WScript.Shell")
    Const url = "http://www.cdcc.usp.br/clima"
    Dim html, temp, umid, hora

    Function getHtml(byRef url)
        Dim xmlHttp : Set xmlHttp = CreateObject("MSXML2.XMLHTTP.6.0")
        xmlHttp.open "get", url, false
        xmlHttp.send
        getHtml = xmlHttp.responseText
    End Function

    Function parseRegEx(byRef sText, byRef regEx)
        Dim oRegx, matches, match, i
        Dim aResults : Redim aResults(0)
        Set oRegx = New RegExp
        With oRegx
            .Pattern    = replace(regEx, "`", chr(34) )
            .IgnoreCase = True
            .Global     = True
        End With

        Set matches = oRegx.Execute(sText)
        if (matches.Count>1) Then
            For Each match in matches
                'msgbox match.Value, 0, "Found Match"
                If match.SubMatches.Count > 0 Then
                    For i = 0 To match.SubMatches.Count-1
                        Redim Preserve aResults(UBound(aResults)+1)
                        aResults(UBound(aResults)-1) = match.SubMatches(i)
                    Next
                Else ' one reult only
                    aResults = match.Value
                End If

            Next
        ElseIf (matches.Count=1) then ' only one match found
            'msgbox matches(0).SubMatches(0)
            'aResults = matches(0).SubMatches(0)
            Redim aResults(1)
            aResults(0) = matches(0).SubMatches(0)
        end If 

        Set oRegx = nothing
        parseRegEx = aResults

    End Function


    html = getHtml(url)
    temp = parseRegEx(html, "<font face=`Arial` size=`5`>(.+)&deg;C<\/font><\/b><\/td>")(0)
    umid = parseRegEx(html, "umidade(?:.+\n).+(\d{2})%")(0)
    hora = parseRegEx(html, "Atualizada &agrave;s: <b>(\S+) <\/b>")(0)

    msgbox temp & "°C", "Umidade: " & umid & "%" & chr(9) & "(" & hora & ")"