J'aimerais récupérer les heures quotidiennes de lever et de coucher du soleil sur un site web. Est-il possible de gratter du contenu web avec Python ? Quels sont les modules utilisés ? Y a-t-il un tutoriel disponible ?
Réponses
Trop de publicités?J'utilise une combinaison de Scrapemark (recherche d'urls - py2) et httlib2 (téléchargement d'images - py2+3). Le scrapemark.py a 500 lignes de code, mais utilise des expressions régulières, donc il peut ne pas être si rapide, je n'ai pas testé.
Exemple pour le scraping de votre site 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] ))
Utilisation :
python2 sunscraper.py http://www.example.com/
Résultat :
[{'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'}]
Je viens de voir RoboBrowser sur Pycoder's Weekly .
Une bibliothèque pour le scraping web construite sur Requests et BeautifulSoup. Comme Mechanize, mais avec des tests, de la documentation et une interface Python.
Simplifiez-vous la vie en utilisant CSS Selectors
Je sais que je suis arrivé en retard à la fête mais j'ai une bonne suggestion à vous faire.
Utilisation de BeautifulSoup
a déjà été suggéré, je préférerais utiliser CSS Selectors
pour récupérer des données dans du 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
Si nous voulons obtenir le nom des éléments d'une catégorie spécifique, nous pouvons le faire en spécifiant le nom de la classe de cette catégorie à l'aide du sélecteur 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)
Voici les résultats partiels de la recherche :
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
Voici un simple web crawler, j'ai utilisé BeautifulSoup et nous allons rechercher tous les liens (ancres) dont le nom de classe est _3NFO0d. J'ai utilisé Flipkar.com, c'est un magasin de vente au détail en ligne.
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()
5 votes
Python dispose de plusieurs options pour le scraping web. J'ai énuméré certaines de ces options aquí en réponse à une question similaire.
0 votes
Pourquoi ne pas simplement utiliser l'analyseur HTML intégré à la bibliothèque standard de Python ? Certainement pour une tâche aussi simple et peu fréquente (juste une fois par jour), je ne vois guère de raison de chercher d'autres outils. docs.python.org/2.7/library/htmlparser.html
0 votes
J'espère que cet article pourra être utile à quelqu'un à ce sujet. Un bon tutoriel pour un débutant. samranga.blogspot.com/2015/08/web-scraping-beginner-python.html Il utilise la belle bibliothèque python de soup pour le scraping web avec python.