Scrapy не может найти форму на странице - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь написать паука, который будет автоматически заходить на этот сайт . Однако, когда я пытаюсь использовать scrapy.FormRequest.from_response в оболочке, я получаю сообщение об ошибке:

No <form> element found in <200 https://www.athletic.net/account/login/?ReturnUrl=%2Fdefault.aspx>

Я определенно вижу форму, когда проверяю элемент на сайте, но он просто не появился в Scrapy, когда я пытался найти его с помощью response.xpath(). Возможно ли как-то скрыть содержание формы от моего паука? Если да, то как мне это исправить?

1 Ответ

0 голосов
/ 01 июля 2018

Форма создана с использованием Javascript, она не является частью статического исходного кода HTML. Scrapy не разбирает Javascript, поэтому его невозможно найти.

Соответствующая часть статического HTML (где они вводят форму с использованием Javascript):

<div ng-controller="AppCtrl as appC" class="m-auto pt-3 pb-5 container" style="max-width: 425px;">
    <section ui-view></section>
</div>

Чтобы найти подобные проблемы, я бы либо:

  • сравнить исходный код из "Просмотр исходного кода" и "Осмотреть" друг с другом
  • просмотр веб-страницы с помощью браузера без Javascript (когда я разрабатываю скребки, у меня обычно есть один браузер с Javascript для исследований и документации и другой для проверки веб-страниц без Javascript)

В этом случае вам необходимо вручную создать запрос формы для этой веб-страницы. Мне не удалось обнаружить какую-либо форму защиты CSRF в их форме, поэтому это может быть так просто:

FormRequest(url='https://www.athletic.net/account/auth.ashx',
            formdata={"e": "foo@example.com", "pw": "secret"})

Однако я думаю, что вы не можете использовать formdata, но вместо этого они ожидают, что вы отправите JSON. Не уверен, что FormRequest справится с этим, я думаю, вы просто хотите использовать стандартный Request.

Так как они интенсивно используют Javascript на своем внешнем интерфейсе, вы не можете использовать исходный код страницы, чтобы найти эти параметры. Вместо этого я использовал консоль разработчика своего браузера и проверил запрос / ответ, который произошел, когда я попытался войти с неверными учетными данными.

Это дало мне:

General:
Request URL: https://www.athletic.net/account/auth.ashx
[...]

Request Payload:
{e: "foo@example.com", pw: "secret"}
...