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.

4voto

Nils Points 87

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'}]

2voto

opyate Points 3607

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.

1voto

Umair Points 5054

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

1voto

SIM Points 9725

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

0voto

Atul Chavan Points 765

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()

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