Hilfe beim Auslesen einer Website

Django, Flask, Bottle, WSGI, CGI…
Antworten
vanillabigthunder
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 20:45

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 :)
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.
vanillabigthunder
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 20:45

Ok, danke für den Tipp! Kann ich nicht einfach sofort nach allen <li>-tags suchen ohne Schleife?
vanillabigthunder
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 20:45

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 :?
BlackJack

@vanillabigthunder: Schau Dir einfach mal an was Du da an Daten bekommst.
alienskin
User
Beiträge: 6
Registriert: Dienstag 2. Mai 2017, 08:39

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...
alienskin
User
Beiträge: 6
Registriert: Dienstag 2. Mai 2017, 08:39

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
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.
alienskin
User
Beiträge: 6
Registriert: Dienstag 2. Mai 2017, 08:39

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...
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
vanillabigthunder
User
Beiträge: 4
Registriert: Montag 1. Mai 2017, 20:45

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:)
alienskin
User
Beiträge: 6
Registriert: Dienstag 2. Mai 2017, 08:39

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...
Antworten