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?
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
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.
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
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
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!
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'}]
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.
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.
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
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 .
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()
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
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.