wake-up-neo.net

Web-Scraping mit Python

Ich möchte täglich Sonnenaufgang/Sonnenuntergang von einer Website abrufen. Ist es möglich, Webinhalte mit Python zu kratzen? Was sind die Module? Gibt es ein Tutorial?

177
3zzy

Verwenden Sie urllib2 in Kombination mit der brillanten 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

Ich würde Scrapy wirklich empfehlen.

Zitat aus einer gelöschten Antwort:

  • Scrapy-Crawling ist schneller als mechanisieren, da asynchrone Operationen (zusätzlich zu Twisted) verwendet werden.
  • Scrapy bietet eine bessere und schnellere Unterstützung für das Parsing (x) von HTML neben libxml2.
  • Scrapy ist ein ausgereiftes Framework mit vollem Unicode, das Umleitungen, gezippte Antworten, ungerade Kodierungen, integrierten http-Cache usw. handhabt.
  • Sobald Sie mit Scrapy vertraut sind, können Sie in weniger als 5 Minuten eine Spinne schreiben, die Bilder herunterlädt, Miniaturbilder erstellt und die extrahierten Daten direkt in csv oder json exportiert.
59
Sjaak Trekhaak

Ich sammelte Skripte aus meiner Web-Scrap-Arbeit in dieser Bit-Bucket-Bibliothek .

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

Ich würde dringend empfehlen, pyquery auszuprobieren. Es verwendet eine jquery-artige (auch als css-artige) Syntax, die es für diejenigen, die aus diesem Hintergrund kommen, sehr einfach macht.

Für Ihren Fall wäre das ungefähr so:

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

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

Sie können es so bekommen:

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

Beautiful Soup ist ein Python-HTML-Parser, der für das Screen-Scraping geeignet ist.

Insbesondere ist hier das Tutorial zum Parsen eines HTML-Dokuments.

Viel Glück!

7
danben

Ich verwende eine Kombination aus Scrapemark (URLs suchen - py2) und httlib2 (Bilder herunterladen - py2 + 3). Die Datei scrapemark.py enthält 500 Codezeilen, verwendet jedoch reguläre Ausdrücke, sodass es 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] ))

Verwendungszweck:

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

Ich habe gerade RoboBrowser in Pycoders Weekly gesehen.

Eine Bibliothek für das Web-Scraping basierend auf Requests und BeautifulSoup. Wie Mechanize, aber mit Tests, Dokumenten und einer Pythonic-Schnittstelle.

2
opyate

Das Open Source-Framework von Scrapy wird dazu beitragen, Web-Scrap in Python zu verwenden. Dieses Open-Source- und kollaborative Framework zum Extrahieren der von Websites benötigten Daten. 

Web-Scraping steht in engem Zusammenhang mit der Web-Indexierung, bei der Informationen über einen Bot oder Web-Crawler im Web indiziert werden. Dies ist eine universelle Technik, die von den meisten Suchmaschinen verwendet wird.

Weitere Informationen zum Web-Scraping

2
GowriShankar

Erleichtere dein Leben mit CSS Selectors

Ich weiß, ich bin zu spät zur Party gekommen, aber ich habe einen schönen Vorschlag für Sie.

Die Verwendung von BeautifulSoup ist bereits vorgeschlagen worden. Ich würde lieber CSS Selectors verwenden, um Daten innerhalb von 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 
1
Umair

Neuere Antwort auf diese Frage. lxml hat sich als bevorzugte Methode für das Web-Scraping in Python herausgestellt. Hat im Gegensatz zu Scrapy keine Abhängigkeit von Twisted. Befürwortet auch die Anhalterin für Python .

0
Harry Moreno

Hier ist ein einfacher Web-Crawler, ich habe BeautifulSoup verwendet und wir werden nach allen Links (Ankern) suchen, deren Klassenname _3NFO0d ist. Ich habe Flipkar.com benutzt, 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()
0
Atul Chavan

Wenn wir an den Namen von Elementen aus einer bestimmten Kategorie denken, können Sie dies tun, indem Sie 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 ist das teilweise Suchergebnis:

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 hat gute Möglichkeiten, das Web zu kratzen. Das beste mit einem Framework ist scrapy . Für Anfänger kann es etwas knifflig sein, hier ist eine kleine Hilfe. 
1. Installiere 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 von dort ein. 
4. Scrapy Shell gibt Ihnen eine interaktive Schnittstelle, um Ihren Code zu testen. 
5. Scrapy startproject projectname erstellt ein Framework.
6. Scrapy genspider spidername erstellt eine Spinne. Sie können beliebig viele Spinnen erstellen. Stellen Sie dabei sicher, dass Sie sich im Projektverzeichnis befinden. 


Das einfachere ist die Verwendung von request und beautiful soup . Bevor Sie beginnen, geben Sie sich eine Stunde Zeit, um die Dokumentation durchzugehen. Sie wird die meisten Ihrer Zweifel lösen. BS4 bietet eine breite Palette von Parsern, für die Sie sich entscheiden können. Verwenden Sie user-agent und sleep, um das Scraping zu vereinfachen. BS4 liefert einen bs.tag zurück, also variable[0]. Wenn js ausgeführt wird, können Sie die Anforderungen und bs4 nicht direkt verwenden. Sie könnten den API-Link erhalten und dann die JSON-Datei analysieren, um die benötigten Informationen zu erhalten, oder Selenium versuchen. 

0
Chris D'mello