2017-08-03 2 views
0

Ich versuche Produktinformationen von lowes.com zu scraphen. Mein Test ist speziell dieses Produkt AirStone 8-sq ft Autumn Mountain Faux Stone Veneer. Wenn ich die Seite ohne aktiviertes JavaScript besuche (um sicherzustellen, dass ich keine Sachen sehe, die urllib/requests nicht aufnehmen können), bekomme ich eindeutig einen Preis für den Gegenstand, wenn ich versuche, eines der oben genannten Pakete zu verwenden die Webseite.Webscraping nicht Urlib gesamte Anfrage oder Anfragen abrufen

Es ist einfach so, dass diese Abschnitte die Abschnitte sind, die ich zum Scraping brauche (Preisinformationen speziell, alles andere ist magisch noch immer verfügbar). Ich würde es vorziehen, Selen nicht für Geschwindigkeiten zu verwenden. Meine aktuelle Nutzung für beide Anfragen und urllib suchen thusly

Gemeinsame Elemente

from urlopen import Request, urlopen 
import requests # switch as needed with urlopen 
import gzip # manual deflation required with Request object urlopen or so I've found 

url = "https://www.lowes.com/pd/AirStone-8-sq-ft-Autumn-Mountain-Faux-Stone-Veneer/50247201" 
headers = { 
     "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", 
     "Accept-Encoding": "gzip, deflate, br", 
     "Accept-Language": "en-US,en;q=0.8", 
     "Cache-Control": "no-cache", 
     "Connection": "keep-alive", 
     "DNT": "1", 
     # "Host": "www.lowes.com", Tried, no difference 
     "Pragma": "no-cache", 
     # "Referer": "https://www.lowes.com/", Tried, no difference 
     "Upgrade-Insecure-Requests": "1", 
     "User-Agent": "Mozilla/5.0 (Windows NT 6.1 Win64 x64) AppleWebKit/537.36 (KHTML," 
     " like Gecko) Chrome/59.0.3071.115 Safari/537.36" # <=- Tried placing all on one line, didn't make a difference 
    } 

urlopen

req = Request(url, None, headers) 
page = gzip.decompress(urlopen(req).read()).decode('utf-8') 
with open("content.txt", "w") as f: 
    f.write(page) # <=- missing the 59.97 price tag anywhere in the document :(

Anfragen

sessions = requests.Session() 
page = sessions.get(self.url, headers=headers) 

with open("content.txt", "w") as f: 
    f.write(page) # <=- Also missing the 59.97 price tag anywhere in the document :'(

So Frage ist, bin ich etwas fehlt? Gibt es dafür einen Grund? Es ist nicht mit Javascript verwandt, da ich es absichtlich deaktiviere, bevor ich versuche, die Daten zu scrappen, da ich gesehen habe, dass das ein Problem war.

Jede Hilfe würde sehr geschätzt werden.

+0

Die Seite, die Sie zurück erhalten, sagt "Geben Sie Ihren Standort für Preise und Verfügbarkeit ein" - in einem tatsächlichen Browser haben Sie wahrscheinlich einen Cookie von einem früheren Besuch, der Ihren Standort der Website zur Verfügung stellt. Ich bin mir sicher, dass es möglich ist, einen Cookie mit einer Ihrer Anfrage-Methoden zu integrieren, aber ich kenne die Details nicht. – jasonharper

+0

Das ist ein erstaunlicher Fang Ich dachte ich hätte Cookies gelöscht. Anscheinend hatte ich nicht. Das ist sehr geschätzt guter Internet-Bewohner :) Tally-Ho zu sehen, was ich herausfinden kann – Akidi

Antwort

0

Per Kommentar von jasonharper. Cookies waren die Antwort. Durch die Suche nach dem richtigen konnte ich alle notwendigen Daten extrahieren.

Kurz gesagt, deaktivieren/löschen Sie immer Cookies, bevor Sie versuchen, eine Website zu scratchen, wenn Sie aus einem anderen Grund sicherstellen, dass Sie sehen, was das Skript sieht.

Für die Neugierigen ist der spezifische Cookie {"sn": "####"} (Filialnummer) Sie können einfach einen Shop auswählen und den Mauszeiger darüber bewegen, wenn Javascript aktiviert ist die Filialnummer. Ändern auf