ScraperWiki/Python: filtrado de registros cuando la propiedad es falsa
Frecuentes
Visto 573 veces
0
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
1 Respuestas
1
¿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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python twitter scraperwiki or haz tu propia pregunta.
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 comodata['media_url'] = result['media_url']
, ya quemedia_url
está contenido en una matriz. es posible? - Martin