Python Scrapy:登录网页
我正在尝试登录一个网页(我们称之为example.com/a1J5AEAQ)。首先,我将获得example.com的常规页面,当我手动输入用户名和密码时,我将被重定向到正确的页面。然而,当我尝试使用scrapy登录时,我会被重定向到'somethingelse.com' 这是表单html的第一部分:(之后只给出用户名和密码字段) 我的代码打印“做得好”,因为我不再在登录页面上,而是在somethingelse.com上(打印response.body时可以看到)。那不是我想去的地方Python Scrapy:登录网页,python,scrapy,Python,Scrapy,我正在尝试登录一个网页(我们称之为example.com/a1J5AEAQ)。首先,我将获得example.com的常规页面,当我手动输入用户名和密码时,我将被重定向到正确的页面。然而,当我尝试使用scrapy登录时,我会被重定向到'somethingelse.com' 这是表单html的第一部分:(之后只给出用户名和密码字段) 我的代码打印“做得好”,因为我不再在登录页面上,而是在somethingelse.com上(打印response.body时可以看到)。那不是我想去的地方 如果有人能帮
如果有人能帮忙,那就太好了 您会注意到,在浏览器中提交此表单将调用一些JavaScript代码(
return handleLogin();
),Scrapy既不解释也不理解这些代码。我建议您检查常规浏览器作为HTTP头和表单数据发送的内容,并尝试使用Scrapy复制这些内容。@paultrmbrth我对JavaScript不太了解。我也不知道如何检查常规浏览器发送的HTTP头和表单数据。关于从哪里开始探索这个问题,有什么建议吗?人们通常会查看现代浏览器的“开发工具”面板中的“网络”选项卡。例如您应该能够看到登录帖子发送到哪个URL,以及发送的HTTP头。这些是您应该尝试用ScrapyFormRequest
复制的内容。
<form action="https://somethingelse.com/" id="login_form" method="post" name="login" onsubmit="return handleLogin();" target="_top">
<input name="un" type="hidden">
<input name="width" type="hidden">
<input name="height" type="hidden">
<input name="hasRememberUn" type="hidden" value="true">
<input name="local" type="hidden">
<input name="startURL" type="hidden" value="/a1J5AEAQ">
<input name="loginURL" type="hidden" value="http://www.example.com">
<input name="loginType" type="hidden">
<input name="useSecure" type="hidden" value="true">
<input name="lt" type="hidden" value="standard">
<input name="qs" type="hidden">
<input name="locale" type="hidden" value="uk">
<input name="oauth_token" type="hidden">
<input name="oauth_callback" type="hidden"><span id="j_id0:j_id1:j_id57:j_id60">
from scrapy.item import Item, Field
import scrapy
class LoginSpider(scrapy.Spider):
name = "webpages"
start_urls = ["https://www.example.com/a1J5AEAQ"]
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={'username': 'xxxxxx@xxxxxxxx.nl', 'pw': 'xxxxxxxxx'},
formnumber=1,
callback=self.after_login
)
def after_login(self, response):
# print response.body
# print response.status
items = []
# check login succeed before going on
if 'Fout:' in response.body:
print "\n\n Login failed \n\n"
self.logger.error("Login failed")
elif 'Please provide your username and password:' in response.body:
print "\n\nstill on login page\n\n"
else:
print "\n\nWELL DONE\n\n"
print response.body
# scrape someting
return items