J'aimerais saisir les heures quotidiennes de lever/coucher de soleil sur un site Web. Est-il possible de gratter le contenu Web avec Python? quels sont les modules utilisés? Existe-t-il un tutoriel disponible?
Utilisez urllib2 en combinaison avec brillante BeautifulSoup library:
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
Je recommande vraiment Scrapy.
Citation d'une réponse supprimée:
- L'analyse simplifiée est plus rapide que la mécanisation, car elle utilise des opérations asynchrones (au-dessus de Twisted).
- Scrapy supporte mieux et plus rapidement l’analyse de (x) html au dessus de libxml2.
- Scrapy est un framework mature avec unicode complet, gère les redirections, les réponses compressées, les encodages impairs, le cache http intégré, etc.
- Une fois dans Scrapy, vous pouvez écrire une araignée en moins de 5 minutes pour télécharger des images, créer des vignettes et exporter les données extraites directement au format csv ou json.
J'ai rassemblé des scripts de mon travail Web dans cette bibliothèque bit-bucket .
Exemple de script pour votre cas:
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])
Sortie:
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
Je suggère fortement de vérifier pyquery . Il utilise une syntaxe semblable à jquery (c'est-à-dire semblable à css) qui facilite grandement les choses pour ceux qui viennent de ce contexte.
Pour votre cas, ce serait quelque chose comme:
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
Sortie:
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
Vous pouvez utiliser urllib2 pour faire les requêtes HTTP, puis vous aurez du contenu Web.
Vous pouvez l'obtenir comme ceci:
import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()
Beautiful Soup est un analyseur HTML en python censé être bon pour le grattage d'écran.
En particulier, ici est leur tutoriel sur l’analyse d’un document HTML.
Bonne chance!
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, n'a pas testé.
Exemple pour gratter 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] ))
Usage:
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 dans Pycoder Weekly .
Une bibliothèque pour le scraping Web construite sur Requests et BeautifulSoup. Comme Mechanize, mais avec des tests, une documentation et une interface Pythonic.
Scrapy Open Source Framework aidera à mettre au rebut le Web en python. Ce framework open source et collaboratif pour extraire les données dont vous avez besoin à partir de sites Web.
Le grattage Web est étroitement lié à l'indexation Web, qui indexe des informations sur le Web à l'aide d'un robot ou d'un robot d'exploration Web. Il s'agit d'une technique universelle adoptée par la plupart des moteurs de recherche.
Facilitez-vous la vie en utilisant CSS Selectors
Je sais que je suis venu tard pour faire la fête mais j'ai une bonne suggestion à vous faire.
L'utilisation de BeautifulSoup
est déjà suggérée. Je préférerais plutôt utiliser CSS Selectors
pour extraire des données dans 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
Réponse plus récente sur cette question. lxml est apparu comme le moyen privilégié de gratter Web en Python. N'a aucune dépendance sur Twisted contrairement à scrapy. Également approuvé par le Guide de l'auto-stoppeur sur Python .
Voici un simple robot d'exploration de sites Web. 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()
Si nous pensons 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
Python a de bonnes options pour gratter le web. Le meilleur avec un cadre est scrapy . Cela peut être un peu difficile pour les débutants, alors voici un petit coup de pouce.
1. Installez python au-dessus de 3.5 (les versions inférieures jusqu’à 2.7 fonctionneront)
2. Créer un environnement dans conda (c'est ce que j'ai fait).
3. Installez scrapy à un endroit et courez à partir de là.
4. Scrapy Shell
vous donnera une interface interactive pour tester votre code.
5. Scrapy startproject projectname
va créer un cadre.
6. Scrapy genspider spidername
va créer une araignée. Vous pouvez créer autant d'araignées que vous le souhaitez. Ce faisant, assurez-vous que vous vous trouvez dans le répertoire du projet.
Le plus simple est d’utiliser demandes et belle soupe . Avant de commencer, donnez une heure pour parcourir la documentation, cela résoudra la plupart de vos doutes. BS4 propose une large gamme d'analyseurs que vous pouvez choisir. Utilisez user-agent
et sleep
pour faciliter le grattage. BS4 renvoie un bs.tag, utilisez donc variable[0]
. Si js est en cours d'exécution, vous ne pourrez pas utiliser les requêtes et bs4 directement. Vous pouvez obtenir le lien api, puis analyser le JSON pour obtenir les informations dont vous avez besoin ou essayer Selenium
.