0

我想废弃这个网站:Meetic.fr,meetic.com 的法语版本。

目标是在authentication后知道有多少人连接(显示在页面顶部)。

这是蜘蛛:([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'

提前致谢

4

3 回答 3

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并在登录后被重定向回您的正常网站。

于 2012-12-30T15:11:34.123 回答
1

如果您仔细查看输出,您将看到一行显示“Filtered offsite request to...”。那是因为表单的操作是secure.meetic.com。您需要将该域添加到allowed_domains蜘蛛的属性中,这样它就不会被过滤。

于 2013-01-12T22:43:27.540 回答
0

您可能应该更新问题以反映关于为什么您的代码不起作用的第二个问题,但是通过检查网站的源 HTML,我认为您可能在表单响应中错误地标记了您的用户名和密码输入:

<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”。

于 2012-12-30T22:27:32.337 回答