Vorrei prendere orari giornalieri di alba / tramonto da un sito web. È possibile raschiare il contenuto Web con Python? quali sono i moduli utilizzati? C'è qualche tutorial disponibile?
Vorrei prendere orari giornalieri di alba / tramonto da un sito web. È possibile raschiare il contenuto Web con Python? quali sono i moduli utilizzati? C'è qualche tutorial disponibile?
Risposte:
Usa urllib2 in combinazione con la brillante libreria 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
soup = BeautifulSoup(requests.get('http://example.com').text)
backticks
il codice around e lo ha convertito in un link. Grazie!
Consiglio vivamente Scrapy.
Citazione da una risposta cancellata:
- La scansione strisciante è più veloce della meccanizzazione perché utilizza operazioni asincrone (oltre a Twisted).
- Scrapy ha un supporto migliore e più veloce per l'analisi (x) html su libxml2.
- Scrapy è un framework maturo con unicode completo, gestisce reindirizzamenti, risposte gzip, codifiche dispari, cache http integrata, ecc.
- Una volta che sei in Scrapy, puoi scrivere un ragno in meno di 5 minuti per scaricare immagini, creare miniature ed esportare i dati estratti direttamente su CSV o JSON.
Ho raccolto insieme script dal mio lavoro di scraping web in questa libreria di bit-bucket .
Script di esempio per il tuo 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])
Produzione:
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
Consiglio vivamente di dare un'occhiata al pyquery . Usa una sintassi simile a jquery (aka css-like) che rende le cose davvero facili per coloro che provengono da quel background.
Per il tuo caso, sarebbe qualcosa del tipo:
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
Produzione:
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
Puoi usare urllib2 per effettuare le richieste HTTP, quindi avrai contenuti web.
Puoi ottenerlo in questo modo:
import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()
Bella zuppa è un parser HTML in pitone che dovrebbe essere buono per lo scraping dello schermo.
In particolare, ecco il loro tutorial sull'analisi di un documento HTML.
In bocca al lupo!
Uso una combinazione di Scrapemark (trovando urls - py2) e httlib2 (scaricando immagini - py2 + 3). Scrapemark.py ha 500 righe di codice, ma usa espressioni regolari, quindi potrebbe non essere così veloce, non testato.
Esempio per raschiare il tuo sito 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/
Risultato:
[{'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'}]
Semplifica la tua vita usando CSS Selectors
So di essere arrivato tardi alla festa, ma ho un bel suggerimento per te.
L'uso BeautifulSoup
è già stato suggerito Preferirei preferire l'uso CSS Selectors
per raschiare dati all'interno di 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
Se pensiamo di ottenere il nome degli articoli da una categoria specifica, possiamo farlo specificando il nome della classe di quella categoria usando il selettore 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)
Questi sono i risultati della ricerca parziale:
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
Ecco un semplice crawler web, ho usato BeautifulSoup e cercheremo tutti i collegamenti (ancore) il cui nome di classe è _3NFO0d. Ho usato Flipkar.com, è un negozio di vendita online.
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()
Python ha buone opzioni per raschiare il web. Il migliore con un framework è sciatto . Può essere un po 'complicato per i principianti, quindi ecco un piccolo aiuto.
1. Installa python sopra 3.5 (quelli inferiori fino alla 2.7 funzioneranno).
2. Creare un ambiente in conda (ho fatto questo).
3. Installare scrapy in una posizione ed eseguire da lì.
4. Scrapy shell
ti fornirà un'interfaccia interattiva per testare il tuo codice.
5. Scrapy startproject projectname
creerà un framework.
6. Scrapy genspider spidername
creerà un ragno. Puoi creare quanti ragni vuoi. Mentre lo fai, assicurati di essere nella directory del progetto.
Il più semplice è usare le richieste e la bella zuppa . Prima di iniziare, dai un'ora di tempo per consultare la documentazione, risolverà la maggior parte dei tuoi dubbi. BS4 offre una vasta gamma di parser che puoi scegliere. Utilizzare user-agent
e sleep
per facilitare la raschiatura. BS4 restituisce un bs.tag quindi usa variable[0]
. Se js è in esecuzione, non sarai in grado di eseguire lo scraping utilizzando le richieste e bs4 direttamente. È possibile ottenere il collegamento API quindi analizzare JSON per ottenere le informazioni necessarie o provare selenium
.