ScraperWiki/Python: filtrado de registros cuando la propiedad es falsa


Estoy usando el siguiente código en ScraperWiki para buscar en Twitter un hashtag específico.
Funciona muy bien y selecciona cualquier código postal proporcionado en el tweet (o regresa false si no hay ninguno disponible). Esto se logra con la línea data['location'] = scraperwiki.geo.extract_gb_postcode(result['text']).
Pero soy , solamente interesado en tweets que incluyen información de código postal (esto se debe a que se agregarán a un mapa de Google en una etapa posterior).
¿Cuál sería la forma más fácil de hacer esto? Estoy relativamente familiarizado con PHP, pero Python es un área completamente nueva para mí. Gracias de antemano por tu ayuda.
Los mejores deseos,
Martin

import scraperwiki
import simplejson
import urllib2

QUERY = 'enter_hashtag_here'
RESULTS_PER_PAGE = '100'
NUM_PAGES = 10

for page in range(1, NUM_PAGES+1):
    base_url = 'http://search.twitter.com/search.json?q=%s&rpp=%s&page=%s' \
         % (urllib2.quote(QUERY), RESULTS_PER_PAGE, page)
    try:
        results_json = simplejson.loads(scraperwiki.scrape(base_url))
        for result in results_json['results']:
            #print result
            data = {}
            data['id'] = result['id']
            data['text'] = result['text']
            data['location'] = scraperwiki.geo.extract_gb_postcode(result['text'])
            data['from_user'] = result['from_user']
            data['created_at'] = result['created_at']
            print data['from_user'], data['text']
            scraperwiki.sqlite.save(["id"], data)
    except:
        print 'Oh dear, failed to scrape %s' % base_url
        break

preguntado el 03 de mayo de 12 a las 20:05

1 Respuestas

¿Solo quieres esto? Probé en la página de prueba gratuita de ScraperWiki y parece hacer lo que quieres. Si buscas algo más complicado, házmelo saber.

import scraperwiki
import simplejson
import urllib2

QUERY = 'meetup'
RESULTS_PER_PAGE = '100'
NUM_PAGES = 10

for page in range(1, NUM_PAGES+1):
    base_url = 'http://search.twitter.com/search.json?q=%s&rpp=%s&page=%s' \
         % (urllib2.quote(QUERY), RESULTS_PER_PAGE, page)
    try:
        results_json = simplejson.loads(scraperwiki.scrape(base_url))
        for result in results_json['results']:
            #print result
            data = {}
            data['id'] = result['id']
            data['text'] = result['text']
            data['location'] = scraperwiki.geo.extract_gb_postcode(result['text'])
            data['from_user'] = result['from_user']
            data['created_at'] = result['created_at']
            if data['location']:
                print data['location'], data['from_user']
                scraperwiki.sqlite.save(["id"], data)
    except:
        print 'Oh dear, failed to scrape %s' % base_url
        break

Salidas:

P93JX VSDC
FV36RL Bootstrappers
Ci76fP Eli_Regalado
UN56fn JasonPalmer1971
iQ3H6zR GNOTP
Qr04eB fcnewtech
sE79dW melindaveee
ud08GT MariaPanlilio
c9B8EE akibantech
ay26th Thepinkleash

Lo he refinado un poco, por lo que es un poco más selectivo que la verificación de scraperwiki para extraer códigos postales de gb, lo que permite obtener bastantes falsos positivos. Básicamente tomé la respuesta aceptada de aquíy agregó algunas miradas negativas hacia atrás y hacia adelante para filtrar algunas más. Parece que la comprobación de la wiki del raspador hace la expresión regular sin la mirada negativa hacia atrás/adelante. Espero que esto ayude un poco.

import scraperwiki
import simplejson
import urllib2
import re

QUERY = 'sw4'
RESULTS_PER_PAGE = '100'
NUM_PAGES = 10

postcode_match = re.compile('(?<![0-9A-Z])([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {0,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)(?![0-9A-Z])', re.I)

for page in range(1, NUM_PAGES+1):
    base_url = 'http://search.twitter.com/search.json?q=%s&rpp=%s&page=%s' \
         % (urllib2.quote(QUERY), RESULTS_PER_PAGE, page)
    try:
        results_json = simplejson.loads(scraperwiki.scrape(base_url))
        for result in results_json['results']:
            #print result
            data = {}
            data['id'] = result['id']
            data['text'] = result['text']
            data['location'] = scraperwiki.geo.extract_gb_postcode(result['text'])
            data['from_user'] = result['from_user']
            data['created_at'] = result['created_at']
            if data['location'] and postcode_match.search(data['text']):
                print data['location'], data['text']
                scraperwiki.sqlite.save(["id"], data)
    except:
        print 'Oh dear, failed to scrape %s' % base_url
        break

contestado el 23 de mayo de 17 a las 11:05

Hola Andrés, gracias por tu respuesta. No del todo... Busco buscar tweets que contengan un determinado hashtag (digamos #comida, ¡tengo hambre!), pero solo me interesan los que contienen un código postal. Entonces, tweets como "¿Alguien sabe dónde conseguir algo de #comida cerca de SW4 0JA?" son lo que busco, mientras que tweets como "¡¿Alguien sabe dónde puedo conseguir algo de #comida decente por aquí?!" sería descartado. Espero que eso lo explique, ¡y gracias de nuevo por su ayuda! - Martin

¿No es eso lo que hace lo anterior? Solo estoy imprimiendo/guardando tweets que tienen un código postal. Solo usé SW4 como el hashtag para obtener datos rápidamente. - andres barrett

Lo he cambiado para que busque el #meetup en su lugar, y escriba solo el código hash y el nombre de usuario. Si eso no es lo que buscas, ¡no estoy seguro de lo que buscas! - andres barrett

Hola, Andrew. Lo siento, me perdí el código adicional que agregaste. Eso es genial... ¡muchas gracias por tu ayuda! - Martin

Eso es genial, muchas gracias por tu ayuda Andrew. Yendo un paso más allá, me gustaría poder extraer el media_url atributo (ver: (dev.twitter.com/docs/tweet-entities)) pero eso no es tan fácil como data['media_url'] = result['media_url'], ya que media_url está contenido en una matriz. es posible? - Martin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.