Web Scraping mit Python [geschlossen]

183

Ich möchte die täglichen Sonnenaufgangs- / Sonnenuntergangszeiten von einer Website abrufen. Ist es möglich, Webinhalte mit Python zu kratzen? Welche Module werden verwendet? Gibt es ein Tutorial?

eozzy
quelle
3
Python bietet verschiedene Optionen für das Web-Scraping. Ich habe einige der Optionen hier als Antwort auf eine ähnliche Frage aufgezählt .
Filippo
Warum nicht einfach den integrierten HTML-Parser in der Python-Standardbibliothek verwenden? Sicherlich sehe ich für eine so einfache und seltene Aufgabe (nur einmal am Tag) wenig Grund, nach anderen Werkzeugen zu suchen. docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare
Hoffe, dieser Beitrag könnte jemandem in dieser Hinsicht nützlich sein. Ein gutes Tutorial für einen Anfänger. samranga.blogspot.com/2015/08/web-scraping-beginner-python.html Es verwendet eine schöne Suppen-Python-Bibliothek für das Web-Scraping mit Python.
Samitha Chathuranga

Antworten:

187

Verwenden Sie urllib2 in Kombination mit der brillanten BeautifulSoup- Bibliothek:

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
Lesmana
quelle
7
Kleiner Kommentar: Dies kann mithilfe des Anforderungspakets leicht vereinfacht werden, indem Zeile 6 durch Folgendes ersetzt wird :oup = BeautifulSoup (request.get (' example.com'). Text )
D Coetzee
4
Danke für den Tipp. Das Anforderungspaket existierte noch nicht, als ich das obige Snippet schrieb
1
@DerrickCoetzee - Ihre Vereinfachung führt zu einem MissingSchema-Fehler (zumindest bei meiner Installation). Dies funktioniert:soup = BeautifulSoup(requests.get('http://example.com').text)
kmote
@kmote: das habe ich eingegeben, aber ich habe backticksden Code vergessen und ihn in einen Link umgewandelt. Vielen Dank!
D Coetzee
Wie sind Sie sicher, dass der Inhalt in td und tr sein wird? Es kann auch in ul und li sein oder?
Shashank Hegde
62

Ich würde Scrapy wirklich empfehlen.

Zitat aus einer gelöschten Antwort:

  • Das Scrapy-Crawlen ist am schnellsten als das Mechanisieren, da asynchrone Vorgänge (zusätzlich zu Twisted) verwendet werden.
  • Scrapy bietet eine bessere und schnellste Unterstützung für das Parsen von (x) HTML zusätzlich zu libxml2.
  • Scrapy ist ein ausgereiftes Framework mit vollständigem Unicode, das Umleitungen, komprimierte Antworten, ungerade Codierungen, integrierten http-Cache usw. verarbeitet.
  • Sobald Sie mit Scrapy vertraut sind, können Sie in weniger als 5 Minuten eine Spinne schreiben, die Bilder herunterlädt, Miniaturansichten erstellt und die extrahierten Daten direkt nach csv oder json exportiert.
Sjaak Trekhaak
quelle
13
Ich habe nicht bemerkt, dass diese Frage bereits 2 Jahre alt war. Ich bin immer noch der Meinung, dass Scrapy hier genannt werden sollte, falls jemand anderes die gleiche Frage hat.
Sjaak Trekhaak
4
Scrapy ist ein Framework und daher schrecklich und hält es für wichtiger als Ihr Projekt. Es ist ein Rahmen wegen der schrecklichen (unnötigen) Einschränkungen von Twisted.
user1244215
4
@ user1244215: Es ist ein Framework, weil Frameworks nett sind. Wenn Sie es nicht als Framework verwenden möchten, hindert Sie nichts daran, Ihren gesamten Code in einer Datei zusammenzufassen.
Blender
1
Python 3.x wird jedoch nicht unterstützt.
17

Ich habe Skripte aus meiner Web-Scraping-Arbeit in dieser Bit-Bucket-Bibliothek gesammelt .

Beispielskript für Ihren Fall:

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

Ausgabe:

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
hoju
quelle
10

Ich würde dringend empfehlen, sich Pyquery anzuschauen . Es verwendet eine jquery-ähnliche (auch bekannt als css-ähnliche) Syntax, die es denjenigen, die aus diesem Hintergrund kommen, wirklich einfach macht.

Für Ihren Fall wäre es so etwas wie:

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

Ausgabe:

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
Scottmrogowski
quelle
7

Sie können urllib2 verwenden , um die HTTP-Anforderungen zu stellen, und dann haben Sie Webinhalte.

Sie können es so bekommen:

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

Schöne Suppe ist ein Python-HTML-Parser, der sich gut zum Scraping von Bildschirmen eignet.

Insbesondere hier ist sie Tutorial ein HTML - Dokuments auf dem Parsen.

Viel Glück!

danben
quelle
Es könnte eine Idee sein, ein Maximum für die gelesenen Bytes festzulegen. response.read (100000000) oder so, damit diese URLs für ISO's Ihren RAM nicht füllen. Viel Spaß beim Bergbau.
Andrew Pate
4

Ich verwende eine Kombination aus Scrapemark (URLs finden - py2) und httlib2 (Bilder herunterladen - py2 + 3). Die Dateiäbchenmarke.py enthält 500 Codezeilen, verwendet jedoch reguläre Ausdrücke, sodass sie möglicherweise nicht so schnell ist und nicht getestet wurde.

Beispiel für das Scraping Ihrer Website:

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

Verwendung:

python2 sunscraper.py http://www.example.com/

Ergebnis:

[{'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'}]
Nils Lindemann
quelle
1

Erleichtern Sie sich das Leben mit CSS Selectors

Ich weiß, dass ich zu spät zum Feiern gekommen bin, aber ich habe einen schönen Vorschlag für dich.

Die Verwendung wurde BeautifulSoupbereits vorgeschlagen. Ich würde es vorziehen CSS Selectors, Daten in HTML zu kratzen

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

Wenn wir daran denken, den Namen von Elementen aus einer bestimmten Kategorie zu erhalten, können wir dies tun, indem wir den Klassennamen dieser Kategorie mit dem CSS-Selektor angeben:

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)

Dies sind die Teilsuchergebnisse:

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

Hier ist ein einfacher Webcrawler, ich habe BeautifulSoup verwendet und wir werden nach allen Links (Ankern) suchen, deren Klassenname _3NFO0d ist. Ich habe Flipkar.com verwendet, es ist ein Online-Einzelhandelsgeschäft.

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

Python hat gute Möglichkeiten, das Web zu kratzen. Das beste mit einem Rahmen ist kratzig . Für Anfänger kann es etwas schwierig sein, daher hier eine kleine Hilfe.
1. Installieren Sie Python über 3.5 (niedrigere bis 2.7 funktionieren).
2. Erstellen Sie eine Umgebung in conda (ich habe dies getan).
3. Installieren Sie Scrapy an einem Ort und führen Sie es von dort aus ein.
4. Scrapy shellbietet Ihnen eine interaktive Oberfläche zum Testen Ihres Codes.
5. Scrapy startproject projectnamewird einen Rahmen schaffen.
6. Scrapy genspider spidernameerstellt eine Spinne. Sie können so viele Spinnen erstellen, wie Sie möchten. Stellen Sie dabei sicher, dass Sie sich im Projektverzeichnis befinden.


Das einfachere ist, Anfragen und schöne Suppe zu verwenden . Bevor Sie beginnen, geben Sie eine Stunde Zeit, um die Dokumentation durchzugehen. Dadurch werden die meisten Ihrer Zweifel gelöst. BS4 bietet eine große Auswahl an Parsern, für die Sie sich entscheiden können. Verwenden Sie user-agentund sleep, um das Schaben zu erleichtern. BS4 gibt einen bs.tag zurück, also benutze variable[0]. Wenn js ausgeführt wird, können Sie nicht direkt mit Anfragen und bs4 kratzen. Sie können den API-Link erhalten und dann den JSON analysieren, um die benötigten Informationen zu erhalten oder es zu versuchen selenium.

Chris D'mello
quelle