Dies ist eine Art von Follow-up-Frage zu one I asked earlier.InitSpider mit Splash verwenden: nur die Anmeldeseite analysieren?
Ich versuche, eine Webseite zu kratzen, die ich als Erster zu erreichen um sich einzuloggen. Aber nach der Authentifizierung benötigt die Webseite, die ich brauche, ein wenig Javascript, um ausgeführt zu werden, bevor Sie den Inhalt sehen können. Was ich getan habe, ist den Anweisungen here gefolgt, um Splash zu installieren, um zu versuchen, das Javascript zu rendern. Allerdings ...
Bevor ich spritzen geschaltet, die Authentifizierung mit Scrapy der InitSpider
war in Ordnung. Ich kam durch die Login-Seite und kratzte die Zielseite in Ordnung (außer, ohne dass das Javascript funktionierte). Aber sobald ich den Code hinzufüge, um die Anfragen durch Splash zu übergeben, sieht es so aus, als würde ich die Zielseite nicht analysieren.
Spider unten. Der einzige Unterschied zwischen der Splash-Version (hier) und der Nicht-Splash-Version ist die Funktion def start_requests()
. Alles andere ist zwischen den beiden gleich.
import scrapy
from scrapy.spiders.init import InitSpider
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
class BboSpider(InitSpider):
name = "bbo"
allowed_domains = ["bridgebase.com"]
start_urls = [
"http://www.bridgebase.com/myhands/index.php"
]
login_page = "http://www.bridgebase.com/myhands/myhands_login.php?t=%2Fmyhands%2Findex.php%3F"
# authentication
def init_request(self):
return scrapy.http.Request(url=self.login_page, callback=self.login)
def login(self, response):
return scrapy.http.FormRequest.from_response(
response,
formdata={'username': 'USERNAME', 'password': 'PASSWORD'},
callback=self.check_login_response)
def check_login_response(self, response):
if "recent tournaments" in response.body:
self.log("Login successful")
return self.initialized()
else:
self.log("Login failed")
print(response.body)
# pipe the requests through splash so the JS renders
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, self.parse, meta={
'splash': {
'endpoint': 'render.html',
'args': {'wait': 0.5}
}
})
# what to do when a link is encountered
rules = (
Rule(LinkExtractor(), callback='parse_item'),
)
# do nothing on new link for now
def parse_item(self, response):
pass
def parse(self, response):
filename = 'test.html'
with open(filename, 'wb') as f:
f.write(response.body)
Was jetzt passiert, ist, dass test.html
, das Ergebnis parse()
, ist jetzt einfach die Login-Seite selbst, anstatt die Seite ich soll nach der Anmeldung umgeleitet werden.
Dies ist in der Log - normalerweise würde ich die "Login erfolgreich" -Linie von check_login_response()
sehen, aber wie Sie unten sehen können, scheint es, als ob ich nicht einmal zu diesem Schritt. Liegt das daran, dass scrapy jetzt die Authentifizierungsanfragen auch überspritzt und dass es dort aufgelegt wird? Wenn das der Fall ist, gibt es eine Möglichkeit, Splash nur für den Authentifizierungsteil zu umgehen?
2016-01-24 14:54:56 [scrapy] INFO: Spider opened
2016-01-24 14:54:56 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-01-24 14:54:56 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-01-24 14:55:02 [scrapy] DEBUG: Crawled (200) <POST http://localhost:8050/render.html> (referer: None)
2016-01-24 14:55:02 [scrapy] INFO: Closing spider (finished)
Ich bin mir ziemlich sicher, ich bin nicht spritzen funktioniert nicht richtig. Kann mir jemand auf eine Dokumentation hinweisen, in der ich herausfinden kann, was vor sich geht?
Warum rendern Sie nicht nach dem Login? –
@PadraicCunningham I ... habe nicht herausgefunden, wie man das macht, wenn man die Dokumente liest. Würde das bedeuten, eine Downloader-Middleware beispielsweise mit PhantomJS einzurichten? – gogurt
Was möchten Sie nach dem Login erhalten? http://www.bridgebase.com/myhands/index.php?offset=0 können Sie auch auf die "Klicken Sie hier für Ergebnisse .." Seite ohne js –