2016-11-28 9 views
0

Я бы хотел использовать scrapy для копирования некоторых веб-сайтов, требующих аутентификации. Я читал, что это возможно с помощью formdata, но проблема, с которой я сталкиваюсь сейчас, заключается в том, что имя ввода генерируется случайным образом каждый раз, когда обновляется страница входа в систему.Scrapy with dynamic content forms

Вот HTML код:

<input type="text" name="MemberNameb326ccc51594e4" id="MemberNameb326ccc51594e4" size="15" maxlength="20" value="" tabindex="1"> 

Как я могу справиться с этим?

ответ

0

вы не можете использовать имя входа, так как это динамический, вы можете получить ссылку на этот вход, получив это окружающий элемент, например

<div id="static-id"><input type="text" name="MemberNameb326ccc51594e4" id="MemberNameb326ccc51594e4" size="15" maxlength="20" value="" tabindex="1"></div> 

как только вы, что окружающий контейнер, вы можете получить имя этого входа

+0

Так что я предполагаю, что это может быть возможно использовать response.xpath внутри данных формы. Кажется, я не могу найти примеров синтаксиса. – MDP

+0

https://doc.scrapy.org/en/latest/topics/request-response.html#using-formrequest-from-response-to-simulate-a-user-login вам нужно очистить форму, чтобы вы знайте текущее имя ввода, затем динамически создавайте свои данные формы –

0

может быть, это может быть лучше использовать Python Beautifulsoup4 модуль, и после того, как HTML суп будет сделано, вы можете использовать модуль re найти соответствующий идентификатор, например:

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 
import requests 
import re 
from bs4 import BeautifulSoup 
#get the url page content 
html = request.get("http://mysite.url/toscrap").content 
#soup the html content 
soup = BeautifulSoup(html) 
#find all inputs containing "MemberName" in id field 
my_inputs = soup.findAll("input",{"id":re.compile("MemberName")}) 

, который будет соответствовать вашим потребностям, предоставляя вам любые поля ввода, где идентификатор, содержащий «MemberName»

С уважением