Код: Выделить всё
import scrapy
from playwright.async_api import Page
from scrapy_playwright.page import PageMethod
async def login(page : Page) -> str:
await page.wait_for_selector(selector="button[data-automation='signin-btn']")
await page.locator("button[data-automation='signin-btn']").click()
await page.wait_for_selector("button[data-automation='sign-in-button']")
await page.locator("input[name=txtusername]").click()
await page.locator("input[name=txtusername]").fill("00000")
await page.locator("input[name=txtpassword]").click()
await page.locator("input[name=txtpassword]").fill("11111")
await page.locator(selector = "button[data-automation='sign-in-button']").click()
return page.url
class MySpider(scrapy.Spider):
name = "myspider"
custom_settings = {
"TWISTED_REACTOR": "twisted.internet.asyncioreactor.AsyncioSelectorReactor",
"DOWNLOAD_HANDLERS": {
"https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
"http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
},
"PLAYWRIGHT_PROCESS_REQUEST_HEADERS": None,
}
def start_requests(self):
yield scrapy.Request(
url="https://",
meta=dict(
#proxy = "http://localhost:8888",
playwright = True,
playwright_page_methods = [
PageMethod(login)
]),
)
def parse(self, response):
pass
Когда я доберусь до этого момента после аутентификации. Все, что мне действительно нужно сделать дальше, это перейти к нескольким URL-адресам. конкретно "/api/board/casual-board?" и получите содержимое JSON. но если я попытаюсь сделать это в своем методе parse(), я получу ошибку 401. Я могу продолжить навигацию, чтобы открыть следующую страницу, и циклически переключаться между вещами, как будто я браузер, но затем я собираюсь мне приходится анализировать html со страницы драматурга, когда у меня есть отличный json-объект всего, что я хочу, поступающего от API...
т.е. Если я изменю свой метод анализа на этот после аутентификации, я получу ошибку 401.
Код: Выделить всё
def parse(self, response):
parsed_url = urlparse(response.url)
Path(quote(f"./original/{response.request.method}{parsed_url.path}-{parsed_url.query}")).write_bytes(response.body)
yield scrapy.Request(
"https:///api/board/casual-board?",
meta=dict(
playwright = True,
)
callback=self.navigate_to_boards,
)
def navigate_to_boards(self, response):
pass
Код: Выделить всё
def parse(self, response):
parsed_url = urlparse(response.url)
Path(quote(f"./original/{response.request.method}{parsed_url.path}-{parsed_url.query}")).write_bytes(response.body)
page = response.meta['playwright_page']
yield scrapy.Request(
url = "https:///api/board/casual-board?",
meta=dict(
playwright = True,
playwright_page = page
),
callback=self.navigate_to_boards,
)
Обновление: во второй версии вызова отсутствует токен носителя авторизации генерируется логином. Как мне получить это из входа в систему и передать его вместе со следующими запросами?
Я понял, как вызвать await page.context.storage_state(path="./auth/state. json") но как мне получить следующий запрос на его использование?
обновление 2: возможно, я нашел что-то, что подойдет мне . Размещение page.expect_response вокруг триггера на клик дает мне ответ json в качестве тела, что может быть именно тем, что я хочу. все еще не уверен, что это правильный способ сделать это.
Код: Выделить всё
async with page.expect_response("https:///api/board/casual-board?") as response_info:
await page.get_by_text("Casual Boards").click()
response = await response_info.value
await page.wait_for_selector("[data-automation='navigation-bar-title']")
return await response.body()
Нет, у меня это не сработает, в какой-то момент мне действительно нужно начать поиск и нужно получить/добавить токен доступа
обновление 4:
хорошо, прогресс.
изменив кнопку входа в систему, нажмите выше:
Код: Выделить всё
async with page.expect_response("https:///identity/connect/token") as response_info_login:
await page.locator("button[data-automation='sign-in-button']").click()
login_response = await response_info_login.value
Код: Выделить всё
return await login_response.body(),await board_response.body()
Код: Выделить всё
login_response = response.meta["playwright_page_methods"][0]
обновление 5.
Я был так близок... к получению вернул PageMethod, но не получил результат
Код: Выделить всё
login_response, board_response = response.meta["playwright_page_methods"][0].result
woot. теперь, чтобы выяснить правильные заголовки ..? отправить следующий запрос на решение моей проблемы с ошибкой 426
Подробнее здесь: https://stackoverflow.com/questions/791 ... logging-in
Мобильная версия