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
Respuesta
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
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) –
gracias por la sugerencia. el paquete de solicitud aún no existía, cuando escribí el fragmento anterior ;-) –
@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
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!
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 –
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
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.
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. –
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
@ 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
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'}]
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
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.
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.
Ver [http://scrapy.org/](http://scrapy.org/) –
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
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()
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
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.
- 1. Web scraping con Python
- 2. Web Scraping con Haskell
- 3. Python 3 web scraping options
- 4. Web scraping de Python que implica etiquetas HTML con atributos
- 5. Etiqueta web scraping
- 6. Web scraping en PHP
- 7. Proxies rotativos para scraping web
- 8. Web Scraping con Google App Engine
- 9. Python data scraping
- 10. Scraping para una "vista previa" de una página web - Python
- 11. RUBY - web scraping - (OpenURI :: HTTPError)
- 12. Web scraping - cómo identificar contenido principal en una página web
- 13. Screen Scraping desde una página web con mucho Javascript
- 14. Power Shell Web Scraping SSL/TSL Issue
- 15. Scraping sitios que requieren iniciar sesión con Python
- 16. ¿Cuál es la diferencia entre web-crawling y web-scraping?
- 17. web scraping para completar (y recuperar) formularios de búsqueda?
- 18. heavy iTunes Connect scraping
- 19. Python Web Scraping - urlopen error [Errno -2] Nombre o servicio no conocido
- 20. Scraping Library para PHP - phpQuery?
- 21. HTML Scraping en Php
- 22. Screen Scraping HTML with C#
- 23. html scraping y css consultas
- 24. Buena libre/pagada Web Scraping Library en C# .NET que maneja javascripts
- 25. ¿Tiene contenido de páginas web con Python?
- 26. Web Python Pregunta
- 27. Framework web Python con CRUD con tecnología AJAX
- 28. Programación web Python
- 29. frameworks web Python vs frameworks web Java (¿cómo se hace el desarrollo web en Python?)
- 30. python web programming
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
¿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
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. –