2010-01-17 13 views
172

Me gustaría aprovechar las horas diarias de salida y puesta del sol desde un sitio web. ¿Es posible raspar contenido web con Python? ¿Cuáles son los módulos usados? ¿Hay algún tutorial disponible?Web scraping con Python

+3

Python tiene varias opciones para raspar web. He enumerado algunas de las opciones [aquí] (http://stackoverflow.com/questions/2861/options-for-html-scraping/1970411#1970411) en respuesta a una pregunta similar. – filippo

+0

¿Por qué no utilizar simplemente el analizador HTML incorporado en la biblioteca estándar de Python? Ciertamente, para una tarea tan simple e infrecuente (solo una vez al día), veo pocas razones para buscar otras herramientas. https://docs.python.org/2.7/library/htmlparser.html – ArtOfWarfare

+0

Espero que esta publicación sea útil para alguien al respecto. Un buen tutorial para un principiante. http://samranga.blogspot.com/2015/08/web-scraping-beginner-python.html Utiliza la hermosa sopa de la biblioteca de python para raspar web con python. –

Respuesta

181

Uso urllib2 en combinación con el brillante BeautifulSoup biblioteca:

import urllib2 
from BeautifulSoup import BeautifulSoup 
# or if you're using BeautifulSoup4: 
# from bs4 import BeautifulSoup 

soup = BeautifulSoup(urllib2.urlopen('http://example.com').read()) 

for row in soup('table', {'class': 'spad'})[0].tbody('tr'): 
    tds = row('td') 
    print tds[0].string, tds[1].string 
    # will print date and sunrise 
+4

Pequeño comentario: esto se puede simplificar ligeramente utilizando el paquete de solicitudes al reemplazar la línea 6 por: soup = BeautifulSoup (requests.get ('http://example.com') .text) –

+2

gracias por la sugerencia. el paquete de solicitud aún no existía, cuando escribí el fragmento anterior ;-) –

+0

@DerrickCoetzee: su simplificación genera un error de MissingSchema (al menos en mi instalación). Esto funciona: 'soup = BeautifulSoup (requests.get ('http://example.com') .text)' – kmote

7

Puede usar urllib2 para realizar las solicitudes HTTP, y luego tendrá contenido web.

Usted puede obtener de esta manera:

import urllib2 
response = urllib2.urlopen('http://example.com') 
html = response.read() 

Beautiful Soup es un analizador de Python HTML que se supone que es bueno para la captura de imágenes.

En particular, here es su tutorial sobre el análisis de un documento HTML.

¡Buena suerte!

+0

Podría ser una idea establecer un máximo en los bytes leídos. respuesta.read (100000000) o algo así, esas URL para ISO no llenan su RAM. Feliz minería –

16

me recogió junto guiones de mi web raspado trabajo en this library.

Script de ejemplo para su caso:

from webscraping import download, xpath 
D = download.Download() 

html = D.get('http://example.com') 
for row in xpath.search(html, '//table[@class="spad"]/tbody/tr'): 
    cols = xpath.search(row, '/td') 
    print 'Sunrise: %s, Sunset: %s' % (cols[1], cols[2]) 

Salida:

Sunrise: 08:39, Sunset: 16:08 
Sunrise: 08:39, Sunset: 16:09 
Sunrise: 08:39, Sunset: 16:10 
Sunrise: 08:40, Sunset: 16:10 
Sunrise: 08:40, Sunset: 16:11 
Sunrise: 08:40, Sunset: 16:12 
Sunrise: 08:40, Sunset: 16:13 
59

que realmente recomiendo Scrapy, por razones que se elabora en this question - "Is it worth learning Scrapy?".

Presupuesto de la respuesta:

  • Scrapy rastreo es más rápido que mecanizar, porque utiliza las operaciones asincrónicas (en la parte superior de la espiral).
  • Scrapy tiene mejor y más rápido soporte para analizar (x) html en la parte superior de libxml2.
  • Scrapy es un marco madura con plena Unicode, maneja redirecciones, respuestas gzipped, codificaciones impares, caché HTTP integrado, etc.
  • Una vez que esté en Scrapy, puede escribir una araña en menos de 5 minutos que se descargan las imágenes, crea miniaturas y exporta los datos extraídos directamente a csv o json.
+12

No me di cuenta de que esta pregunta ya tenía 2 años, aún siento que se debe nombrar a Scrapy aquí en caso de que alguien más tenga la misma pregunta. –

+4

Scrapy es un marco, y por lo tanto es horrible y cree que es más importante que su proyecto. Es un marco debido a las limitaciones horribles (innecesarias) de Twisted. – user1244215

+4

@ user1244215: Es un marco porque los marcos son agradables. Si no desea utilizarlo como marco, no hay nada que le impida atascar todo su código en un archivo. – Blender

4

que utilizan una combinación de Scrapemark (URL Diagnóstico - AP2) y httlib2 (descarga de imágenes - Año 2 + 3). El scrapemark.py tiene 500 líneas de código, pero usa expresiones regulares, por lo que puede no ser tan rápido, no probar.

Ejemplo para raspar su sitio web:

import sys 
from pprint import pprint 
from scrapemark import scrape 

pprint(scrape(""" 
    <table class="spad"> 
     <tbody> 
      {* 
       <tr> 
        <td>{{[].day}}</td> 
        <td>{{[].sunrise}}</td> 
        <td>{{[].sunset}}</td> 
        {# ... #} 
       </tr> 
      *} 
     </tbody> 
    </table> 
""", url=sys.argv[1])) 

Uso:

python2 sunscraper.py http://www.example.com/ 

Resultado:

[{'day': u'1. Dez 2012', 'sunrise': u'08:18', 'sunset': u'16:10'}, 
{'day': u'2. Dez 2012', 'sunrise': u'08:19', 'sunset': u'16:10'}, 
{'day': u'3. Dez 2012', 'sunrise': u'08:21', 'sunset': u'16:09'}, 
{'day': u'4. Dez 2012', 'sunrise': u'08:22', 'sunset': u'16:09'}, 
{'day': u'5. Dez 2012', 'sunrise': u'08:23', 'sunset': u'16:08'}, 
{'day': u'6. Dez 2012', 'sunrise': u'08:25', 'sunset': u'16:08'}, 
{'day': u'7. Dez 2012', 'sunrise': u'08:26', 'sunset': u'16:07'}] 
10

Me gustaría sugerir fuertemente retirar pyquery.Utiliza la sintaxis similar a jquery (aka css-like) que hace las cosas realmente fáciles para aquellos que provienen de ese fondo.

Para su caso, sería algo así como:

from pyquery import * 

html = PyQuery(url='http://www.example.com/') 
trs = html('table.spad tbody tr') 

for tr in trs: 
    tds = tr.getchildren() 
    print tds[1].text, tds[2].text 

Salida:

5:16 AM 9:28 PM 
5:15 AM 9:30 PM 
5:13 AM 9:31 PM 
5:12 AM 9:33 PM 
5:11 AM 9:34 PM 
5:10 AM 9:35 PM 
5:09 AM 9:37 PM 
2

solo vi RoboBrowser en Pycoder's Weekly.

Una biblioteca para raspado web basada en Solicitudes y BeautifulSoup. Me gusta Mechanize, pero con pruebas, documentos y una interfaz Pythonic.

2

El marco de código abierto de Scrapy ayudará a chatarra web en python. Este marco de código abierto y colaborativo para extraer los datos que necesita de los sitios web.

El raspado web está estrechamente relacionado con la indexación web, que indexa la información en la web utilizando un rastreador web o bot y es una técnica universal adoptada por la mayoría de los motores de búsqueda.

More About Web Scraping

+0

Ver [http://scrapy.org/](http://scrapy.org/) –

1

hacer su vida más fácil mediante el uso de CSS Selectors

Sé que he llegado tarde a la fiesta, pero tengo una buena sugerencia para usted.

Usando BeautifulSoup ya se ha sugerido que preferiría prefieren utilizar CSS Selectors para raspar los datos dentro de HTML

import urllib2 
from bs4 import BeautifulSoup 

main_url = "http://www.example.com" 

main_page_html = tryAgain(main_url) 
main_page_soup = BeautifulSoup(main_page_html) 

# Scrape all TDs from TRs inside Table 
for tr in main_page_soup.select("table.class_of_table"): 
    for td in tr.select("td#id"): 
     print(td.text) 
     # For acnhors inside TD 
     print(td.select("a")[0].text) 
     # Value of Href attribute 
     print(td.select("a")[0]["href"]) 

# This is method that scrape URL and if it doesnt get scraped, waits for 20 seconds and then tries again. (I use it because my internet connection sometimes get disconnects) 
def tryAgain(passed_url): 
    try: 
     page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text 
     return page 
    except Exception: 
     while 1: 
      print("Trying again the URL:") 
      print(passed_url) 
      try: 
       page = requests.get(passed_url,headers = random.choice(header), timeout = timeout_time).text 
       print("-------------------------------------") 
       print("---- URL was successfully scraped ---") 
       print("-------------------------------------") 
       return page 
      except Exception: 
       time.sleep(20) 
       continue 
0

Aquí es un simple rastreador web, solía BeautifulSoup y vamos a buscar todos los enlaces (anclas) que está el nombre de la clase es _3NFO0d. Utilicé Flipkar.com, es una tienda minorista en línea.

import requests 
from bs4 import BeautifulSoup 
def crawl_flipkart(): 
    url = 'https://www.flipkart.com/' 
    source_code = requests.get(url) 
    plain_text = source_code.text 
    soup = BeautifulSoup(plain_text, "lxml") 
    for link in soup.findAll('a', {'class': '_3NFO0d'}): 
     href = link.get('href') 
     print(href) 

crawl_flipkart() 
0

Si pensamos en hacer que el nombre de elementos de cualquier categoría específica, entonces podemos hacer eso, especificando el nombre de la clase de esa categoría utilizando el selector CSS:

import requests ; from bs4 import BeautifulSoup 

soup = BeautifulSoup(requests.get('https://www.flipkart.com/').text, "lxml") 
for link in soup.select('div._2kSfQ4'): 
    print(link.text) 

Se trata de los resultados de búsqueda parciales:

Puma, USPA, Adidas & moreUp to 70% OffMen's Shoes 
Shirts, T-Shirts...Under ₹599For Men 
Nike, UCB, Adidas & moreUnder ₹999Men's Sandals, Slippers 
Philips & moreStarting ₹99LED Bulbs & Emergency Lights 
0

Más reciente respuesta en esta pregunta. lxml ha surgido como la forma preferida de hacer web scraping en Python. No tiene dependencia de Twisted a diferencia de scrapy. También respaldado por el Hitchhiker's guide to Python.