Grattage de la toile avec Python

j'aimerais prendre l'heure quotidienne du lever et du coucher du soleil sur un site web. Est-il possible de gratter du contenu web avec Python? quels sont les modules utilisés? Est-il un tutoriel disponible?

173
demandé sur ST4 2010-01-17 19:06:53

12 réponses

utiliser urllib2 en combinaison avec le brillant BeautifulSoup 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
181
répondu lesmana 2016-01-22 08:51:37

je recommande Scrapy.

citation tirée d'une réponse supprimée:

  • Scrapy l'analyse est plus rapide que de mécaniser car utilise les opérations asynchrones (sur le haut de Tordu).
  • Scrapy supporte mieux et plus rapidement le parsing (x)html sur libxml2.
  • Scrapy est un framework mature avec unicode complet, gère les redirections, les réponses gzippées, les encodages impairs, cache http intégré, etc.
  • une fois que vous êtes dans Scrapy, vous pouvez écrire une araignée en moins de 5 minutes qui télécharge des images, crée des vignettes et exporter les données extraites directement à csv ou json.
59
répondu Sjaak Trekhaak 2018-04-20 13:59:00

j'ai rassemblé des scripts de mon travail de grattage de 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
répondu hoju 2018-04-19 17:37:25

je suggère fortement de cocher pyquery . Il utilise la syntaxe jquery-like (alias CSS-like) qui rend les choses vraiment faciles pour ceux qui viennent de cet arrière-plan.

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
répondu scottmrogowski 2014-04-15 09:20:58

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 python qui est censé être bon pour le screen scraping.

en particulier, ici est leur tutoriel sur l'analyse D'un document HTML.

bonne chance!

7
répondu danben 2014-04-15 22:39:47

j'utilise une combinaison de Scrapemark (trouver des urls - py2) et httlib2 (télécharger des images - py2+3). Les scrapemark.py dispose de 500 lignes de code, mais utilise des expressions régulières, de sorte qu'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] ))

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'}]
4
répondu Nils 2014-04-15 09:20:33

j'ai juste vu RoboBrowser dans Pycoder Hebdomadaire .

Une bibliothèque pour le web scraping construit sur la Demande et BeautifulSoup. Comme mécaniser, mais avec des tests, des docs, et une interface pythonique.

2
répondu opyate 2014-02-18 15:29:23

Scrapy open source framework aidera à Web scrap en python.Ce cadre open source et collaboratif pour extraire les données dont vous avez besoin à partir de sites web.

le raclage Web est étroitement lié à l'indexation web, qui répertorie l'information sur le web à l'aide d'un bot ou d'un crawler web et est une technique universelle adoptée par la plupart des moteurs de recherche.

En Savoir Plus Sur Le Raclage De L'Âme

2
répondu GowriShankar 2014-11-19 05:16:04

facilitez votre vie en utilisant CSS Selectors

je sais que je suis arrivé en retard à la fête, mais j'ai une suggestion pour vous.

utilisant BeautifulSoup est déjà suggéré je préférerais utiliser CSS Selectors pour gratter des données à L'intérieur de 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
répondu Umair 2015-02-08 13:52:29

voici un simple crawler web, j'ai utilisé BeautifulSoup et nous allons chercher tous les liens(ancres) qui le nom de classe est _3NFO0d. J'ai utilisé Flipkar.com, it is an online retailing store.

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
répondu Atul Chavan 2017-03-21 15:01:19

si nous pensons obtenir le nom des articles de n'importe quelle catégorie spécifique, alors nous pouvons le faire en spécifiant le nom de classe de cette catégorie en utilisant le 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)

résultats de la recherche partielle:

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
répondu SIM 2017-08-19 16:37:07

Nouvelle réponse à cette question. lxml est apparu comme le moyen préféré pour faire du raclage web en Python. Elle n'est pas dépendante de Twisted contrairement à scrapy. Également approuvé par le Guide de L'auto-stoppeur pour Python .

0
répondu Harry Moreno 2018-01-11 21:30:58