Это своего рода следующий вопрос к тому, который я задал ранее.
Я пытаюсь очистить веб-страницу, которую я должен войти, чтобы достичь первой. Но после аутентификации веб-страницы, которая мне нужна, требуется немного Javascript для запуска, прежде чем вы сможете просматривать содержимое. То, что я сделал, соответствует инструкциям здесь, чтобы установить всплеск, чтобы попытаться отобразить Javascript. Однако...
Прежде чем переключиться на всплеск, проверка подлинности с помощью Scrapy InitSpider
была прекрасной. Я прошел через страницу входа в систему и очистил целевую страницу ОК (кроме, конечно, без работы Javascript). Но как только я добавляю код для передачи запросов через всплеск, похоже, что я не разбираю целевую страницу.
Паук ниже. Единственная разница между версией блэша (здесь) и версией без всплеска - это функция def start_requests()
. Все остальное одинаково между ними.
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)
Теперь происходит то, что test.html
, результат parse()
, теперь просто сама страница входа в систему, а не страница, на которую я должен быть перенаправлен после входа в систему.
Это сообщение в журнале - обычно, я вижу строку "Успешно подключен" от check_login_response()
, но, как вы можете видеть ниже, кажется, что я даже не дошел до этого шага. Это потому, что scrapy теперь ставит запросы на аутентификацию через всплеск тоже, и что она повесилась там? Если это так, есть ли способ обойти всплеск только для части аутентификации?
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)
Я уверен, что неправильно использую всплеск. Может ли кто-нибудь указать мне какую-нибудь документацию, где я могу выяснить, что происходит?