我想废弃这个网站:Meetic.fr,法语版的meetic.com。
目标是在认证之后知道有多少人连接(在页面顶部显示)。
这是蜘蛛:( [kobeddl,stack123456] 如果你想尝试一下就是真正的登录信息)
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import FormRequest, Request
from meetic.items import MeeticItem
class MeeticSpider(BaseSpider):
name = "meetic"
allowed_domains = ["meetic.fr"]
start_urls = ["http://www.meetic.fr/"]
def parse(self, response):
print 'TEST1'
return [FormRequest.from_response(response, formdata={'log': 'kobeddl', 'pwd': 'stack123456'}, callback=self.after_login)]
def after_login(self, response):
# check login succeed before going on
if "authentication failed" in response.body:
self.log("Login failed", level=log.ERROR)
print 'TEST2'
return
# We've successfully authenticated, let's have some fun!
else:
print 'TEST3'
return Request(url="http://www.meetic.fr/scheduler.php?url=", callback=self.parse_tastypage)
def parse_tastypage(self, response):
hxs = HtmlXPathSelector(response)
item = MeeticItem()
item['nb'] = hxs.select('/html/body/div/div/div/div/div/div/ul/li[2]/a/div/span').extract()
print 'TEST4'
return item
以下是命令提示符中的结果:
编辑:如您所见,只有第一个打印语句TEST1
正在运行。
我是python和scrapy的新手,所以原因可能是愚蠢的。
我认为我的蜘蛛有一个错误,在这里:if "authentication failed" in response.body:
我发现在另一只蜘蛛中,但我不知道如何将它调整到这只蜘蛛。
我还更改了设置文件中的用户代理
USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.7'
提前致谢
答案 0 :(得分:1)
如果您查看http://www.meetic.fr页面的来源,您会发现登录表单发布到secure.meetic.com
:
<form id="formLogin" name="formLogin" action="https://secure.meetic.com/authent/secure.php" method="post" onsubmit="javascript:submitMeeticForm(this.id);">
所以没有什么奇怪的,你POST
登录数据secure.meetic.com
,登录后你会被重定向回你的普通网站。
答案 1 :(得分:1)
如果仔细查看输出,您会看到一条“过滤非现场请求...”的行。那是因为表单的动作是secure.meetic.com。您需要将该域添加到蜘蛛上的allowed_domains
属性,以便它不会被过滤。
答案 2 :(得分:0)
您应该更新问题以反映关于您的代码无法正常工作的第二个问题,但是通过检查网站的源HTML,我认为您可能在表单响应中错误地标记了您的用户名和密码输入:< / p>
<input id="log" name="log" type="hidden"/>
<input id="pwd" name="pwd" type="hidden"/>
尝试修改parse
,如下所示:
def parse(self, response):
return [FormRequest.from_response(response, formdata={'log': 'kobeddl', 'pwd': 'stack123456'}, callback=self.after_login)]
如果没有,则可能是'txtHandle'和'txtPassword'。