2017-07-13 1 views
1

Ich versuche, einen Web-Scraper, der Tabellen von einer Website ziehen und dann in eine Excel-Tabelle einfügen wird. Ich bin ein EXTREMER Anfänger bei Python (und Codierung im Allgemeinen) - begann buchstäblich vor ein paar Tagen zu lernen.Python Web Scraper/Crawler - HTML-Tabellen zu Excel Spreadsheet

Also, wie mache ich diesen Web-Scraper/Crawler? Hier ist der Code, den ich habe:

import csv 
import requests 
from BeautifulSoup import BeautifulSoup 

url = 'https://www.techpowerup.com/gpudb/?mobile=0&released%5B%5D=y14_c&released%5B%5D=y11_14&generation=&chipname=&interface=&ushaders=&tmus=&rops=&memsize=&memtype=&buswidth=&slots=&powerplugs=&sort=released&q=' 
response = requests.get(url) 
html = response.content 

soup = BeautifulSoup(html) 
table = soup.find('table', attrs={'class': 'processors'}) 

list_of_rows = [] 
for row in table.findAll('tr')[1:]: 
list_of_cells = [] 
for cell in row.findAll('td'): 
    text = cell.text.replace(' ', '') 
    list_of_cells.append(text) 
list_of_rows.append(list_of_cells) 

outfile = open("./GPU.csv", "wb") 
writer = csv.writer(outfile) 
writer.writerow(["Product Name", "GPU Chip", "Released", "Bus", "Memory", "GPU clock", "Memory clock", "Shaders/TMUs/ROPs"]) 
writer.writerows(list_of_rows) 

Jetzt funktioniert das Programm für die Website im Code oben.

Jetzt will ich die Tabellen auf der folgenden Website kratzen: https://www.techpowerup.com/gpudb/2990/radeon-rx-560d

Hinweis, dass es mehrere Tabellen auf dieser Seite. Was muss ich hinzufügen/ändern, damit das Programm auf dieser Seite funktioniert? Ich versuche alle Tische zu bekommen, aber wenn jemand mir helfen könnte, einen von ihnen zu bekommen, würde ich das sehr schätzen!

+0

Es gibt einige sehr gute Tutorien und Dokumentation, die Sie lernen helfen! [Wie dieser (Web Scraping Workshop)] (https://gist.github.com/bradmontgomery/1872970). – cosinepenguin

+0

@cosinepenguin Danke für den Link! Ich versuche Datentabellen zu kratzen. Haben Sie irgendwelche Links, die so etwas abdecken, oder besser noch, wissen Sie, ob es eine kleine Korrektur in meinem Code gibt, die mir dabei helfen wird, einen dieser Tabellen im zweiten Link, den ich erwähnt habe, zu entfernen? Vielen Dank für deine Hilfe! –

+0

Ich hoffe die folgende Antwort hilft! Ansonsten gibt es eine Menge toller Tutorials, die erklären, wie man * alles * mit BeautifulSoup macht! Eine der gründlichsten ist aus Stanford: [Web Scraping with Beautiful Suppe] (http: //web.stanford.edu/~ zlotnick/TextAsData/Web_Scraping_mit_Beautiful_Soup.html). Dies hebt auch DOM-Modelle in Websites hervor und wie man mit ihnen interagieren kann. Sobald Sie diese Grundlagen beherrschen, ist alles andere erstaunlich einfach! Viel Glück! – cosinepenguin

Antwort

0

Im Wesentlichen müssen Sie nur den Code ändern, den Sie in Ihrer Frage haben, um die Tatsache zu berücksichtigen, dass die Seite mehrere Tabellen hat!

Was ist wirklich ordentlich (oder, ich wage zu sagen, schön) über BeautifulSoup (BS) ist die findAll Methode! Dies erzeugt ein BS-Objekt, über das Sie iterieren können!

Also, sagen Sie, Sie haben 5 Tabellen in Ihrer Quelle. Sie könnten möglicherweise tables = soup.findAll("table") ausführen, die eine Liste jedes Tabellenobjekts im Quellcode zurückliefern würde! Sie könnten dann über das BS-Objekt iterieren und Informationen aus der jeweiligen Tabelle abrufen.

könnte Ihr Code wie folgt aussehen:

import csv 
import requests 
import bs4 

url = 'https://www.techpowerup.com/gpudb/2990/radeon-rx-560d' 
response = requests.get(url) 
html = response.content 

soup = bs4.BeautifulSoup(html, "lxml") 

tables = soup.findAll("table") 

tableMatrix = [] 
for table in tables: 
    #Here you can do whatever you want with the data! You can findAll table row headers, etc... 
    list_of_rows = [] 
    for row in table.findAll('tr')[1:]: 
     list_of_cells = [] 
     for cell in row.findAll('td'): 
      text = cell.text.replace(' ', '') 
      list_of_cells.append(text) 
     list_of_rows.append(list_of_cells) 
    tableMatrix.append((list_of_rows, list_of_cells)) 
print(tableMatrix) 

Dieser Code funktioniert, obwohl ich, dass ich die Formatierung einer der CSV-Datei nicht hinzufügen, wird feststellen, dass der ursprüngliche Code hatte! Sie müssen das neu gestalten, aber es funktioniert für Sie. Aber ich habe an der Stelle kommentiert, an der Sie die Freiheit haben, für jeden Tisch in der Quelle zu tun, was immer Sie wollen. Sie können findAll("th") Elemente in jedem Tabellenobjekt auswählen und Ihre CSV-Datei so füllen, oder Sie könnten die Informationen aus den Zellen selbst extrahieren. Momentan speichere ich die Zellendaten für jede Tabelle in einem Tupel, das ich an die Liste tableMatrix anfüge.

Ich hoffe, das hilft dir bei deinem Python und BeautifulSoup Abenteuer!

Quellen:

+0

Hallo @ Cosinepenguin! Vielen Dank für Ihre Hilfe! Mit welchem ​​Befehl würden Sie jedes Element in eine eigene Zelle in einer Excel-Tabelle einfügen? Ihre Beratung wird sehr geschätzt! :) –