2016-07-21 3 views
1

Ich habe folgenden Code verwendet, um die Webseite unter dem Link https://www.blogforacure.com/members.php zu analysieren. Es wird erwartet, dass der Code die Links aller Mitglieder der angegebenen Seite zurückgibt.Wie kann ich lange Webseiten mit einer schönen Suppe analysieren?

from bs4 import BeautifulSoup 
    import urllib 
    r = urllib.urlopen('https://www.blogforacure.com/members.php').read() 
    soup = BeautifulSoup(r,'lxml') 
    headers = soup.find_all('h3') 
    print(len(headers)) 
    for header in headers: 
     a = header.find('a') 
     print(a.attrs['href']) 

Aber ich bekomme nur die ersten 10 Links von der obigen Seite. Auch wenn ich die Option "Verschönern" drucke, sehe ich nur die ersten 10 Links. Kann mir jemand helfen, das Problem zu lösen?

+0

Ergebnisse werden durch Ajax-Aufrufe geladen. Wenn Sie das Seitenende erreichen, werden neue Ergebnisse vom Server abgerufen. – neetesh

+0

Wie kann ich damit umgehen? – athira

+0

Mein Ansatz ist Selenium zu verwenden, um mit der Seite zu verbinden und nach unten zu scrollen, wie beschrieben in: http://stackoverflow.com/questions/25870906/scrolling-web-page-using-selenium-python-webdriver – jinksPadlock

Antwort

1

Die Ergebnisse werden dynamisch geladen, indem AJAX-Anforderungen an den Endpunkt https://www.blogforacure.com/site/ajax/scrollergetentries.php gestellt werden.

Simulieren sie in Ihrem Code mit requests eine Web-Scraping-Sitzung beibehalten:

from bs4 import BeautifulSoup 
import requests 

url = "https://www.blogforacure.com/site/ajax/scrollergetentries.php" 
with requests.Session() as session: 
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} 
    session.get("https://www.blogforacure.com/members.php") 

    page = 0 
    members = [] 
    while True: 
     # get page 
     response = session.post(url, data={ 
      "p": str(page), 
      "id": "#scrollbox1" 
     }) 
     html = response.json()['html'] 

     # parse html 
     soup = BeautifulSoup(html, "html.parser") 
     page_members = [member.get_text() for member in soup.select(".memberentry h3 a")] 
     print(page, page_members) 
     members.extend(page_members) 

     page += 1 

Es druckt die aktuelle Seitenzahl und die Liste der Mitglieder pro Seite Mitgliedernamen in eine members Liste zu akkumulieren. Nicht veröffentlichen, was gedruckt wird, da es Namen enthält.

Beachten Sie, dass ich die Schleife absichtlich endlos verlassen habe, bitte herauszufinden, die Ausgangsbedingung. Kann sein, wenn response.json() einen Fehler auslöst.

+0

Danke, dass funktioniert gut – athira

+0

Ich bin neu dazu und ich habe eine sehr grundlegende Frage wie auf, wie Sie über Site/ajax/scrollergetentries.php erfahren haben? Wie man das für eine andere Seite bekommt. und können Sie mir erklären, session.post() – athira

+0

@athira Ich habe Browser-Entwickler-Tools verwendet, Netzwerk-Tab, wenn die Seite geladen wurde, dann gescrollt und sah mehrere Anfragen an die 'scrollergeentries.php' Endpunkt. Ich hoffe, das hilft. – alecxe