Seite 1 von 1
Hilfe beim Auslesen einer Website
Verfasst: Montag 1. Mai 2017, 21:01
von vanillabigthunder
Hallo, ich bin ziemlich neu in Python, möchte aber arbeitsbedingt eine Website auslesen. Ich möchte auf folgender Seite (
http://www.sciencedirect.com/science/journal/0304405X) mir die Autoren, die Titel, und die Seitenanzahlen ausgeben lassen der einzelnen Research-Paper. Ich möchte mit den Autoren anfangen, komme aber nicht weiter

. Es wird nichts ausgegeben. Der HTML Quelltext ist recht umfangreich, ich habe ihn mir angeguckt und analysiert. Die Autorennamen sind in einer Liste, <li> mit der Klasse "authors ". Zusätzlich ist um die <ul> Umgebung eine geordnete Liste <ol>.
Code: Alles auswählen
import requests
from bs4 import BeautifulSoup
r = requests.get("http://www.sciencedirect.com/science/journal/0304405X")
soup = BeautifulSoup(r.content, 'lxml')
for oltag in soup.find_all('ol', {'class': 'articleList results'}):
for ultag in soup.find_all('ul', {'class': 'article'}):
for litag in ultag.find_all('li', {'class': 'authors '}):
Könnt ihr mir helfen? Vielen Dank

Re: Hilfe beim Auslesen einer Website
Verfasst: Montag 1. Mai 2017, 21:08
von BlackJack
@vanillabigthunder: Bei so etwas ist eine interaktive Python-Shell immer sehr praktisch wo man das Stück für Stück entwickeln und testen kann.
Code: Alles auswählen
In [10]: import requests
In [11]: from bs4 import BeautifulSoup
In [12]: r = requests.get("http://www.sciencedirect.com/science/journal/0304405X
...: ")
In [13]: soup = BeautifulSoup(r.content, 'lxml')
In [14]: soup.find_all('ol', {'class': 'articleList results'})
Out[14]: []
Die äussere Schleife hat schon nichts worüber sie iterieren könnte.
Re: Hilfe beim Auslesen einer Website
Verfasst: Montag 1. Mai 2017, 21:21
von vanillabigthunder
Ok, danke für den Tipp! Kann ich nicht einfach sofort nach allen <li>-tags suchen ohne Schleife?
Re: Hilfe beim Auslesen einer Website
Verfasst: Montag 1. Mai 2017, 22:02
von vanillabigthunder
Ich habe das mit der Shell mal ausprobiert, ein guter Tipp. Trotzdem weiss ich nicht, wo nach ich exakt suchen soll, um etwas näher an die Autoren zu kommen

Re: Hilfe beim Auslesen einer Website
Verfasst: Montag 1. Mai 2017, 22:20
von BlackJack
@vanillabigthunder: Schau Dir einfach mal an was Du da an Daten bekommst.
Re: Hilfe beim Auslesen einer Website
Verfasst: Dienstag 2. Mai 2017, 08:54
von alienskin
Schaust Du Dir die Rückgabe von Deinem request.get an, wirst Du fest stellen, dass ein Fehlercode 404 zurück kommt
Das heißt es wird gemeldet:
"ScienceDirect does not support the use of the crawler software. If you have any questions please contact your helpdesk."
Das heißt, mit der Anfrage an den Server kannst Du nichts anfangen...
Re: Hilfe beim Auslesen einer Website
Verfasst: Dienstag 2. Mai 2017, 09:21
von alienskin
Versuchst Du den Server mit für ihn sinnvollen und vor allem verständlichen Anfragen zu belästigen:
Code: Alles auswählen
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
USERAGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'
# Query
QUERY_HEADERS = {
'User-Agent': USERAGENT
}
QUERY_URL = 'http://www.sciencedirect.com/science/journal/0304405X'
QUERY_PAYLOAD = {
'pageMetaData': {
'cid': '',
'issn': '0304405X',
'allowVIA': ''
}
}
def main():
r_session = requests.session()
r = r_session.get(QUERY_URL, headers=QUERY_HEADERS, data=QUERY_PAYLOAD)
soup = BeautifulSoup(r.text, 'html.parser')
listQuery = soup.find_all('li', {'class': 'authors'})
for intIndex, actual in enumerate(listQuery):
print('Zeile: ' + str(intIndex) + ' Autor: ' + actual.text)
if __name__ == "__main__":
main()
kommt auch etwas sinnvolles bei raus:
Code: Alles auswählen
Zeile: 0 Autor:
Zeile: 1 Autor: Viral Acharya, Zhaoxia Xu
Zeile: 2 Autor: Sabrina Buti, Barbara Rindi, Ingrid M. Werner
Zeile: 3 Autor: Marco Di Maggio, Amir Kermani, Zhaogang Song
Zeile: 4 Autor: Cornelius Schmidt, Rüdiger Fahlenbrach
Zeile: 5 Autor: Benjamin Bennett, J. Carr Bettis, Radhakrishnan Gopalan, Todd Milbourn
Zeile: 6 Autor: Charles M.C. Lee, Eric C. So
Zeile: 7 Autor: Camelia M. Kuhnen, Andrei C. Miu
Zeile: 8 Autor: Byoung-Hyoun Hwang, Hugh Hoikwang Kim
Zeile: 9 Autor: Marti G. Subrahmanyam, Dragon Yongjun Tang, Sarah Qian Wang
Zeile: 10 Autor: Juan M. Londono, Hao Zhou
Re: Hilfe beim Auslesen einer Website
Verfasst: Dienstag 2. Mai 2017, 09:38
von BlackJack
@alienskin: Wenn man `request.session` verwendet, macht es Sinn die Sachen die sich bei den Anfragen nicht ändern, also in diesem Falle den User-Agent-Header, auf der Sitzung zu setzen und nicht bei den Anfragen anzugeben.
Die Typpräfixe wie `intSomething` oder `listSomething` gehören da nicht hin. Konvention ist ausserdem klein_mit_unterstrichen für alles ausser Klassen und Konstanten.
Bei `listQuery` ist zudem das `query` falsch denn es ist ja keine Anfrage sondern das Ergebnis einer Anfrage. Noch besser wäre es wenn der Name verraten würde was in dieser Antwort semantisch enthalten ist: Autoren(knoten), also wäre `authors` oder `author_nodes` passender/verständlicher.
Ziemlich sicher ist nicht `actual` (tatsächlich) sondern `current` (aktuell) gemeint, wobei das auch wieder ein ziemlich generischer Name ist, der besser transportieren könnte *was* denn da aktuell enthalten ist.
Da vanillabigthunder mehr als nur den Autor von jedem Artikel haben möchte, würde man über die Artikel-Listen iterieren und in der Schleife dann die einzelnen Listenpunkte wie Autor, Seitenzahlen, und so weiter, suchen.
Re: Hilfe beim Auslesen einer Website
Verfasst: Dienstag 2. Mai 2017, 09:57
von alienskin
Wenn man `request.session` verwendet, macht es Sinn die Sachen die sich bei den Anfragen nicht ändern, also in diesem Falle den User-Agent-Header, auf der Sitzung zu setzen und nicht bei den Anfragen anzugeben.
Ja Full ACK.
Die Typpräfixe wie `intSomething` oder `listSomething` gehören da nicht hin. Konvention ist ausserdem klein_mit_unterstrichen für alles ausser Klassen und Konstanten.
Ich weiß das Python Anhänger hier ihre eigene Konventionen haben. Da ich aus anderen Sprachen Präfixe gewohnt bin ist das ein Überbleibsel...
Da vanillabigthunder mehr als nur den Autor von jedem Artikel haben möchte, würde man über die Artikel-Listen iterieren und in der Schleife dann die einzelnen Listenpunkte wie Autor, Seitenzahlen, und so weiter, suchen.
Ja habe es gesehen. Vielleicht meldet sich der Autor und gibt bescheid ob er zunächst mit dem Code klar kommt...
Re: Hilfe beim Auslesen einer Website
Verfasst: Dienstag 2. Mai 2017, 10:26
von Sirius3
@alienskin: es scheint wohl, dass der Seitenbetreiber explizit das Crawlen verbietet. Ob es da ratsam ist, durch Täuschung die Nutzungsbedingungen zu umgehen, sei jedem selbst überlassen.
Re: Hilfe beim Auslesen einer Website
Verfasst: Dienstag 2. Mai 2017, 10:45
von vanillabigthunder
Hallo, vielen Dank für eure Beiträge. Ich bin gerade in der Uni und werde erst heute Abend mich an den PC setzen und die Diskussion genauer ansehen:)
Re: Hilfe beim Auslesen einer Website
Verfasst: Dienstag 2. Mai 2017, 10:48
von alienskin
Sirius3 hat geschrieben:@alienskin: es scheint wohl, dass der Seitenbetreiber explizit das Crawlen verbietet. Ob es da ratsam ist, durch Täuschung die Nutzungsbedingungen zu umgehen, sei jedem selbst überlassen.
Ja stimmt. Wie konnte ich das in meiner Überschwänglichkeit nur übersehen...
@Moderatoren: Bitte löscht meine Beiträge zu dem Thema...