To jest kolejne pytanie uzupełniające do one I asked earlier.Korzystanie z funkcji InitSpider z splash: czy parsowanie strony logowania?
Próbuję zeskrobać stronę internetową, która mam się zalogować, aby osiągnąć pierwszy. Ale po uwierzytelnieniu strona, której potrzebuję, wymaga trochę kodu Javascript, zanim będzie można wyświetlić zawartość. To, co zrobiłem, było zgodne z instrukcjami here, aby zainstalować splash, aby spróbować renderować JavaScript. Jednak ...
Zanim przeszedłem na zachlapanie, uwierzytelnianie z Scrapy na InitSpider
było w porządku. Przechodziłem przez stronę logowania i zdrapywałem stronę docelową w porządku (oczywiście bez działającej Javascript, oczywiście). Ale po dodaniu kodu, aby przekazać żądania za pomocą powitania, wygląda na to, że nie analizuję strony docelowej.
Pająk poniżej. Jedyną różnicą między wersją splash (tutaj) a wersją inną niż splash jest funkcja def start_requests()
. Wszystko inne jest takie samo między nimi.
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)
Co się dzieje teraz jest to, że test.html
, wynik parse()
, jest teraz po prostu sama strona logowania zamiast strony mam być przekierowany po zalogowaniu.
Mówi się w dzienniku, zobaczyłbym linię "Zalogowanie się powiodło" z check_login_response()
, ale jak widać poniżej, wydaje się, że nie mam nawet dostępu do tego kroku. Czy to dlatego, że scrapy przesyłają również żądania uwierzytelnienia przez splash i że jest on zawieszany? Jeśli tak, to czy istnieje sposób obejścia splash tylko dla części uwierzytelniania?
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)
Jestem prawie pewien, że nie używam poprawnie splasha. Czy ktoś może wskazać mi jakąś dokumentację, w której mogę dowiedzieć się, co się dzieje?
Dlaczego nie renderujesz się po zalogowaniu? –
@PadraicCunningham Ja ... nie zorientowałem się, jak to zrobić, czytając dokumenty. Czy oznacza to na przykład skonfigurowanie oprogramowania pośredniczącego do pobierania za pomocą PhantomJS? – gogurt
Co chcesz uzyskać po zalogowaniu? http://www.bridgebase.com/myhands/index.php?offset=0 pozwoli ci również przejść do strony "Kliknij tutaj, aby zobaczyć wyniki" bez żadnych js –