2017-01-03 3 views
-1

Ich möchte Lulu webstore verschrotten. Ich habe folgende Probleme damit.Scrape Daten von JavaScript-gerenderten Website

  • Der Inhalt der Website wird dynamisch geladen.
  • Die Website, wenn versucht, zuzugreifen, umgeleitet, um die Länderseite auszuwählen.
  • Nach der Auswahl des Landes erscheint der Lieferort und wird zur Startseite weitergeleitet.
  • Wenn Sie versuchen, die Endseite programmgesteuert zu erreichen, erhalten Sie eine leere Antwort, da der Inhalt dynamisch geladen wird.

Ich habe eine Liste der End-URLs, aus denen ich Daten schaben muss. Betrachten Sie beispielsweise mobile accessories. Jetzt möchte ich

  • Holen Sie sich das HTML-Quelle dieser Seite direkt, die dynamisch geladen Land, Ort wählen Popups Umgehung wählen, so dass ich meine Scrapy XPath-Selektoren verwenden können, Daten zu extrahieren.
  • Wenn Sie vorschlagen, Selenium, PhantomJS, Ghost oder etwas anderes zu verwenden, um mit dynamischen Inhalten umzugehen, bitte verstehen Sie, dass ich die End-HTML-Quelle wie in einem Webbrowser nach Verarbeitung aller dynamischen Inhalte, die an Scrapy gesendet werden soll.
  • Ich habe auch versucht, mit Proxies zu überspringen wählen Sie Land Popup, aber immer noch lädt es und wählen Sie Lieferort.
  • Ich habe versucht, Splash zu verwenden, aber es gibt mir die Quelle der Länderauswahlseite zurück.
+0

Gut Dynamic Inhalt bedeuten AJAX Anruf. Holen Sie sich einfach die Struktur der Anfrage, und rufen Sie sie in einer Schleife mit den IDs der Produkte auf. In der Regel benötigen Sie dazu nur das Modul "Anfragen" in Kombination mit "BeautifulSoup". Gleiches gilt für den Standort. –

+0

@Cal Eliacheff Danke für den Kommentar, aber das Problem mit Ihrem Weg ist, dass, selbst wenn ich Anfragen mit Cookies und User-Agenten als auch einen Web-Browser noch die gleiche Antwort bekomme. Ich brauche etwas zwischen Antwort vom Server und Skript, die diesen dynamischen Inhalt verarbeitet und das Endergebnis gibt, damit ich es zum scrapy einziehen kann. – Mani

+0

Sie sollten bei den Anrufen besser aussehen. Der Speicherort wird in dem Cookie gespeichert, den Sie von 'SelectLocation.aspx' erhalten. Zum Beispiel: http: //www.luluwebstore.com/SelectLocation.aspx? Location = 13241 & DeliveryMode = H & ReturnUrl = http: // www.luluwebstore.com? Ermöglichen es Ihnen, die Länderauswahl zu umgehen. Es sieht so aus, als gäbe es nur GET-Anfragen, die in der Regel einfacher zu benutzen sind. IMHO wollen Sie nicht Scrapy für diese Art von Websites verwenden. –

Antwort

1

Endlich fand ich die Antwort. Ich habe das EditThisCookie-Plugin verwendet, um die Cookies anzuzeigen, die von der Webseite geladen werden. Ich habe festgestellt, dass es 3 Cookies CurrencyCode,ServerId,Site_Config in meinem lokalen Speicher speichert. Ich habe das oben erwähnte Plugin verwendet, um die Cookies im JSON-Format zu kopieren. Ich habe this manual für das Setzen von Cookies in den Anfragen verwiesen.

Jetzt kann ich diese Position, Lieferadresse Popups überspringen. Danach habe ich festgestellt, dass die dynamischen Seiten über <script type=text/javascript> geladen werden und festgestellt, dass ein Teil der Seiten-URL in einer Variablen gespeichert ist. Ich habe den Wert mit split() extrahiert. Hier ist der Skriptteil, um die dynamische Seiten-URL zu erhalten.

from lxml import html 
page_source=requests.get(url,cookies=jar) 
tree=html.fromstring(page_source.content)  
dynamic_pg_link=tree.xpath('//div[@class="col3_T02"]/div/script/text()')[0] #entire javascript to load product pages 
dynamic_pg_link=dynamic_pg_link.split("=")[1].split(";")[0].strip()#obtains the dynamic page url. 
page_link="http://www.luluwebstore.com/Handler/ProductShowcaseHandler.ashx?ProductShowcaseInput="+dynamic_pg_link 

Jetzt kann ich Daten aus diesen LInks extrahieren.

Dank @Cal Eliacheff für die vorherige Anleitung.