2016-07-26 11 views
2

Ich habe eine URL:wie Website kratzen, in den Seiten-URL nicht geändert wird, aber die nächste Taste unter der gleichen URL-Seite Daten hinzufügen

http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant 

Auf dieser Seite gibt es eine „nächste Ergebnisse“ -Taste, die laden weitere 20 Datenpunkte, während immer noch der erste Datensatz angezeigt wird, ohne die URL zu aktualisieren. Ich schrieb ein Skript, um diese Seite in Python zu scrappen, aber es kratzt nur die ersten 22 Datenpunkte, obwohl die Schaltfläche "nächste Ergebnisse" angeklickt wird und ungefähr 40 Daten anzeigt.

Wie kann ich diese Art von Website kratzen, die dynamisch

Mein Skript Inhalt laden ist

import csv 
import requests 
from bs4 import BeautifulSoup 


url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/" 
r = requests.get(url) 
r.content 

soup = BeautifulSoup(r.content) 
print (soup.prettify()) 

g_data2 = soup.find_all("a", {"class": "heading"}) 
for item in g_data2: 
    try: 
     name = item.text 
     print name 
    except IndexError: 
     name = '' 
     print "No Name found!" 

Antwort

1

Statt sich auf HTML Schaben Ich glaube, Sie an der JSON aussehen sollte, die über AJAX abgerufen werden. Ich denke, dass die JSON-Datei in Zukunft weniger geändert wird als die Markup-Funktion der Seite. Darüber hinaus ist es viel einfacher, eine JSON-Struktur zu durchlaufen, als ein DOM zu scrappen.

Wenn Sie zum Beispiel die von Ihnen bereitgestellte Seite laden, wird eine URL angezeigt, um JSON unter http://www.goudengids.be/q/ajax/business/results.json zu erhalten.

Dann bietet es einige URL-Parameter, um die Unternehmen abzufragen. Ich glaube, Sie mehr in Verwendung aussehen sollten Ihre Daten zu erhalten, im Gegensatz zu der Seite Schaben und Tastenklicks zu simulieren, und usw.

Edit:

Und es sieht aus wie es die Header ist mit Set von einem Besuch die Website zunächst, um sicherzustellen, dass Sie eine gültige Sitzung haben. Daher müssen Sie möglicherweise zuerst die Website aufrufen, um die Cookie-Header zu erhalten, und diese für nachfolgende Anforderungen festlegen, um den JSON vom obigen Endpunkt abzurufen. Ich denke immer noch, dass dies einfacher und berechenbarer sein wird, als HTML zu scrappen.

2

Wenn Sie es mit requests zu lösen waren, müssen Sie imitieren, welchen Browser nicht, wenn Sie die „Mehr laden“ klicken - es sendet eine XHR Anfrage zum http://www.goudengids.be/q/ajax/business/results.json Endpunkt, simulieren sie in Ihrem Code im Web Aufrechterhaltung -Scraping-Sitzung. Die XHR Antworten sind im JSON-Format - keine Notwendigkeit für BeautifulSoup in diesem Fall überhaupt:

import requests 

main_url = "http://www.goudengids.be/qn/business/advanced/where/Provincie%20Antwerpen/what/restaurant/" 
xhr_url = "http://www.goudengids.be/q/ajax/business/results.json" 
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'} 

    # visit main URL 
    session.get(main_url) 

    # load more listings - follow the pagination 
    page = 1 
    listings = [] 
    while True: 
     params = { 
      "input": "restaurant Provincie Antwerpen", 
      "what": "restaurant", 
      "where": "Provincie Antwerpen", 
      "type": "DOUBLE", 
      "resultlisttype": "A_AND_B", 
      "page": str(page), 
      "offset": "2", 
      "excludelistingids": "nl_BE_YP_FREE_11336647_0000_1746702_6165_20130000, nl_BE_YP_PAID_11336647_0000_1746702_7575_20139729427, nl_BE_YP_PAID_720348_0000_187688_7575_20139392980", 
      "context": "SRP * A_LIST" 
     } 
     response = requests.get(xhr_url, params=params, headers={ 
      "X-Requested-With": "XMLHttpRequest", 
      "Referer": main_url 
     }) 
     data = response.json() 

     # collect listing names in a list (for example purposes) 
     listings.extend([item["bn"] for item in data["overallResult"]["searchResults"]]) 

     page += 1 

     # TODO: figure out exit condition for the while True loop 

    print(listings) 

ich für Sie einen wichtigen TODO verlassen habe - Figur, die eine Austrittsbedingung aus - bei der Erhebung Inserate zu stoppen.

+0

, als ich das Skript lief es gab mir eine Fehlermeldung Traceback (jüngste Aufforderung zuletzt): Datei "C: \ Benutzer \ Benutzer \ Desktop \ Python \ script \ 3url.py", Zeile 3, in mit requests.Session() als Sitzung: NameError: Name 'Anfragen' ist nicht definiert Wie kann ich es beheben ?? – vishnu

+0

@vishnu se diese 'import requests' Zeile oben? Das ist wichtig. Und Sie müssen 'Requests' Modul installiert haben. – alecxe

+0

ya du bist richtig @alecxe Ich habe es wirklich vergessen. Danke für Ihre große Hilfe und auch ich brauche Sie in Zukunft – vishnu