tutorial - web scraping python examples
Raspado web con Python (12)
Acabo de ver RoboBrowser en Pycoder''s Weekly .
Una biblioteca para raspar web basada en Solicitudes y BeautifulSoup. Me gusta Mechanize, pero con pruebas, documentos y una interfaz Pythonic.
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?
Aquí hay un rastreador web simple, utilicé BeautifulSoup y buscaremos todos los enlaces (anclas) cuyo nombre de 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()
El marco de código abierto de Scrapy ayudará a chatarra web en python. Este marco de código abierto y colaboración 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 mediante un robot o rastreador web y es una técnica universal adoptada por la mayoría de los motores de búsqueda.
Puede usar urllib2 para hacer las solicitudes HTTP, y luego tendrá contenido web.
Puedes obtenerlo así:
import urllib2
response = urllib2.urlopen(''http://example.com'')
html = response.read()
BeautifulSoup es un analizador HTML de python que se supone que es bueno para raspar la pantalla.
En particular, here está su tutorial sobre el análisis de un documento HTML.
¡Buena suerte!
Realmente recomendaría Scrapy.
Cita de una respuesta eliminada:
- El rastreo de Scrapy es más rápido que el mecanizado porque usa operaciones asíncronas (además de Twisted).
- Scrapy tiene soporte mejor y más rápido para analizar (x) html en la parte superior de libxml2.
- Scrapy es un marco maduro con unicode completo, maneja redirecciones, respuestas gzip, codificaciones impares, caché http integrada, etc.
- Una vez que esté en Scrapy, puede escribir una araña en menos de 5 minutos para descargar imágenes, crear miniaturas y exportar los datos extraídos directamente a csv o json.
Recopilé guiones de mi web scraping en esta biblioteca de bit-bucket .
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
Respuesta más reciente sobre 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 la guía del autoestopista de Python .
Si pensamos en obtener el nombre de los elementos de una categoría específica, podemos hacerlo especificando el nombre de clase de esa categoría usando 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)
Estos son los resultados de búsqueda parcial:
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
Use urllib2 en combinación con la brillante biblioteca BeautifulSoup :
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
Uso una combinación de Scrapemark (encontrando urls - py2) y httlib2 (descargando imágenes - py2 + 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 tu 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''}]
Yo recomendaría revisar a 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
Haz tu vida más fácil usando CSS Selectors
Sé que llegué tarde a la fiesta, pero tengo una buena sugerencia para ti.
El uso de BeautifulSoup
ya ha sido sugerido, prefiero usar CSS Selectors
para raspar 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