with tutorial spider soup scraping library examples code beautiful python screen-scraping

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.

Más sobre Web Scraping


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