Kratzen Sie mehrere Seiten mit Python und BeautifulSoup
Meinen code erfolgreich Schrammen die tr align=center-tags aus [ http://my.gwu.edu/mod/pws/courses.cfm?campId=1&termId=201501&subjId=ACCY ] und schreibt die td-Elemente in eine text-Datei.
Allerdings gibt es mehrere Seiten auf der Website oben in die ich möchte in der Lage sein zu kratzen.
Beispielsweise mit der url oben, wenn ich auf den link auf "Seite 2" die gesamte url NICHT ändern. Ich schaute auf die Seite Quelle und sah einen javascript-code, um auf die nächste Seite.
Wie kann mein code geändert werden, kratzen Sie die Daten aus allen verfügbaren aufgeführten Seiten?
Mein code, der arbeitet für die Seite 1 nur:
import bs4
import requests
response = requests.get('http://my.gwu.edu/mod/pws/courses.cfm?campId=1&termId=201501&subjId=ACCY')
soup = bs4.BeautifulSoup(response.text)
soup.prettify()
acct = open("/Users/it/Desktop/accounting.txt", "w")
for tr in soup.find_all('tr', align='center'):
stack = []
for td in tr.findAll('td'):
stack.append(td.text.replace('\n', '').replace('\t', '').strip())
acct.write(", ".join(stack) + '\n')
Es ist nicht wirklich poosible mit Anfragen oder jede andere Hole html-Zeug-tool, wenn Sie wollen, zu tun, dass Sie mit einem go-web-driver wie selenium oder WebDriver, aber es ist viel komplizierter, dass die Anfrage.. viel Glück
Es ist nur die einfache URL-manipulation, wirklich. Prüfen Sie einfach die
man sollte vielleicht erklären, wie das zu tun, was Sie vorschlagen deine Antwort
Tun, Kumpel. Nur code hinzufügen, wie gut. 🙂
Jungs, btw, danke Euch beiden für die Aufbewahrung von web-scraping-tag in Form! 🙂
Es ist nur die einfache URL-manipulation, wirklich. Prüfen Sie einfach die
POST
Anfragen, die mit Google Chrome inspection-tool oder Firebug für Firefox. Siehe meine Antwort unten.man sollte vielleicht erklären, wie das zu tun, was Sie vorschlagen deine Antwort
Tun, Kumpel. Nur code hinzufügen, wie gut. 🙂
Jungs, btw, danke Euch beiden für die Aufbewahrung von web-scraping-tag in Form! 🙂
InformationsquelleAutor Philip McQuitty | 2014-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der trick hier ist, um die Anfragen, die kommen in und aus der Seite-ändern Sie die Aktion beim klicken auf den link zum anzeigen von der anderen Seiten. Die Art und Weise, um dies zu überprüfen, ist die Verwendung von Chrome inspection-tool (via drücken von F12) oder installieren das Firebug-extension im Firefox. Ich werde mit Chrome inspection-tool in dieser Antwort. Siehe unten für meine Einstellungen.
Nun, was wir sehen wollen, ist entweder ein
GET
Anforderung an eine andere Seite oder einPOST
verlangen, dass änderungen der Seite. Während das tool geöffnet ist, klicken Sie auf eine Seitenzahl. Für einen wirklich kurzen moment, wird es nur eine Anfrage, die angezeigt wird, und es ist einPOST
Methode. Alle anderen Elemente werden schnell Folgen, und füllen Sie die Seite. Siehe unten für das, was wir suchen.Klicken Sie auf die obigen
POST
Methode. Sollte es um ein sub-Fenster sortiert werden, hat tabs. Klicken Sie auf dieHeaders
tab. Diese Seite listet die Anfrage-Header, so ziemlich die Identifizierung, was die andere Seite (die Seite, zum Beispiel) muss von Ihnen verbinden zu können (jemand anderes erklären kann, muuuch besser als ich).Immer, wenn die URL-Variablen, wie z.B. Seitenzahlen, Ort Marker, oder Kategorien, mehr oft, dass nicht, die Website verwendet den query-strings. Lange Geschichte kurz, es ist ähnlich einer SQL-Abfrage (eigentlich ist es eine SQL-Abfrage, manchmal), dass die Website zu ziehen, die Informationen, die Sie benötigen. Wenn dies der Fall ist, können Sie die request-Header für die query-string-Parameter. Blättern Sie nach unten ein wenig, und Sie sollten es finden.
Wie Sie sehen können, wird die query-string-Parameter entsprechen den Variablen in unserer URL. Ein bisschen weiter unten, können Sie sehen
Form Data
mitpageNum: 2
darunter. Dies ist der Schlüssel.POST
Anfragen sind allgemein bekannt als Formular Anfragen, da diese die Art von Anfragen, wenn Sie uns Formulare, log-in auf Webseiten, etc. Im Grunde genommen, so ziemlich alles, wo Sie haben, Informationen zu übermitteln. Was die meisten Menschen nicht sehen, ist, dassPOST
- Anfragen über eine URL-Adresse, die Sie Folgen. Ein gutes Beispiel HIERFÜR ist, wenn Sie sich in eine website und, ganz kurz, sehen Sie in der Adressleiste verwandeln sich in eine Art von Kauderwelsch-URL, bevor Sie sich auf/index.html
oder somesuch.Was die obige Absatz bedeutet im Grunde, dass Sie können (aber nicht immer) hängen Sie den Formular-Daten auf Ihrer URL und es wird die Durchführung der
POST
Anfrage für Sie bei der Ausführung. Zu wissen, die genaue Zeichenfolge, die Sie haben, um anzufügen, klicken Sie aufview source
.Testen, ob es funktioniert, indem es die URL.
Et voila, es funktioniert. Jetzt die eigentliche Herausforderung: immer die Letzte Seite automatisch und das kratzen von allen Seiten. Dein code ist ziemlich viel es. Das einzige, was noch zu tun ist, sind immer die Anzahl der Seiten, die Konstruktion einer Liste von URLs zu kratzen, und iteriert.
Geänderten code ist unten:
Wir reguläre Ausdrücke verwenden, um die ordnungsgemäße links. Dann mit list comprehension, Bauten wir eine Liste von URL-Zeichenfolgen. Endlich, wir iterieren über Sie.
Ergebnisse:
Hoffe, das hilft.
EDIT:
Aus lauter Langeweile, ich denke, ich gerade erstellt ein Schaber für die gesamte Klasse directory. Auch ich update sowohl für die oben-und unten-codes keine Fehlermeldung heraus, wenn es nur eine einzelne Seite zur Verfügung.
Das ist, was ich jetzt mache. 🙂 Warten Sie, bis die Bearbeitung im Handumdrehen.
Cheers @Nanashi wirklich dankbar für die Hilfe !
Dort gehen Sie. Ich denke, dass so ziemlich alles abdeckt was über dieses kratzen.
Sie ging über das hinaus, was ich hoffte, aus dieser Frage. Stackoverflow braucht mehr user wie dich, dies ist eine riesige riesige Hilfe.
InformationsquelleAutor Manhattan