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?
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?
Antworten:
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
soup = BeautifulSoup(requests.get('http://example.com').text)
backticks
den Code vergessen und ihn in einen Link umgewandelt. Vielen Dank!
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.
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
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
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!
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'}]
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 BeautifulSoup
bereits 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
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
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()
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 shell
bietet Ihnen eine interaktive Oberfläche zum Testen Ihres Codes.
5. Scrapy startproject projectname
wird einen Rahmen schaffen.
6. Scrapy genspider spidername
erstellt 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-agent
und 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
.