web-dev-qa-db-fra.com

Web racler avec Python

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?

177
3zzy

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
185
user235064

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.
59
Sjaak Trekhaak

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
16
hoju

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
10
scottmrogowski

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!

7
danben

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

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.

2
opyate

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.

Plus d'informations sur le Web Scraping

2
GowriShankar

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 
1
Umair

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 .

0
Harry Moreno

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()
0
Atul Chavan

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
0
SIM

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

0
Chris D'mello