191 votes

Raclage de sites Web avec Python

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 ?

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.

194voto

Utilisez urllib2 en combinaison avec le brillant BelleSoupe bibliothèque :

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

63voto

Sjaak Trekhaak Points 1988

Je recommande vraiment Scrapy.

Citation d'une réponse effacée :

  • Le crawling de Scrapy est plus rapide que celui de mechanize car il utilise des opérations asynchrones (en plus de Twisted).
  • Scrapy dispose d'une prise en charge meilleure et plus rapide de l'analyse syntaxique (x)html sur la base de libxml2.
  • Scrapy est un framework mature avec unicode complet, gère les redirections, les réponses gzippées, les encodages bizarres, le cache http intégré, etc.
  • Une fois que vous êtes dans Scrapy, vous pouvez écrire un spider en moins de 5 minutes qui télécharge des images, crée des vignettes et exporte les données extraites directement vers csv ou json.

14 votes

Je n'avais pas remarqué que cette question datait déjà de deux ans, mais je pense toujours que Scrapy devrait être nommé ici au cas où quelqu'un d'autre aurait la même question.

4 votes

Scrapy est un framework, il est donc horrible et pense qu'il est plus important que votre projet. C'est un framework à cause des horribles limitations (inutiles) de Twisted.

4 votes

@user1244215 : C'est un framework parce que les frameworks sont sympas. Si vous ne voulez pas l'utiliser comme un framework, il n'y a rien qui vous empêche de mettre tout votre code dans un seul fichier.

17voto

hoju Points 7182

J'ai rassemblé des scripts de mon travail de scraping web dans ce document bibliothèque de bit-bucket .

Exemple 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

11voto

scottmrogowski Points 461

Je vous conseille vivement de consulter pyquery . Il utilise une syntaxe semblable à celle de Jquery (c'est-à-dire semblable à celle de CSS), ce qui rend les choses vraiment faciles pour ceux qui viennent de ce milieu.

Dans 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

7voto

danben Points 35312

Vous pouvez utiliser urllib2 pour faire les requêtes HTTP, et ensuite vous aurez du contenu web.

Vous pouvez l'obtenir comme ça :

import urllib2
response = urllib2.urlopen('http://example.com')
html = response.read()

Une belle soupe est un analyseur HTML en python qui est supposé être bon pour le screen scraping.

En particulier, aquí est leur tutoriel sur l'analyse d'un document HTML.

Bonne chance !

0 votes

Ce serait une bonne idée de fixer un maximum d'octets lus. response.read(100000000) ou quelque chose comme ça pour que les URL des ISO ne remplissent pas votre RAM. Bonne navigation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X