Проблема с использованием скрапа для очистки группы Yahoo - PullRequest
4 голосов
/ 04 февраля 2011

Я новичок в изучении веб-страниц и только что начал экспериментировать с Scrapy , фреймворком, написанным на Python. Моя цель - очистить старую группу Yahoo, поскольку они не предоставляют API или другие средства для извлечения архивов сообщений. Группа Yahoo настроена так, что вам необходимо войти в систему, прежде чем вы сможете просматривать архивы.

Мне кажется, нужно выполнить следующие шаги:

  1. Войти в Yahoo
  2. Посетите URL первого сообщения и очистите его
  3. Повторите шаг 2 для следующего сообщения и т. Д.

Я начал вырубать паука-скрапа, чтобы выполнить вышесказанное, и вот что у меня есть до сих пор. Все, что я хочу заметить, это то, что логин работает, и я могу получить первое сообщение. Я закончу остальное, как только у меня получится так много работать:

class Sg101Spider(BaseSpider):
    name = "sg101"
    msg_id = 1              # current message to retrieve
    max_msg_id = 21399      # last message to retrieve

    def start_requests(self):
        return [FormRequest(LOGIN_URL,
            formdata={'login': LOGIN, 'passwd': PASSWORD},
            callback=self.logged_in)]

    def logged_in(self, response):
        if response.url == 'http://my.yahoo.com':
            self.log("Successfully logged in. Now requesting 1st message.")
            return Request(MSG_URL % self.msg_id, callback=self.parse_msg,
                    errback=self.error)
        else:
            self.log("Login failed.")

    def parse_msg(self, response):
        self.log("Got message!")
        print response.body

    def error(self, failure):
        self.log("I haz an error")

Когда я запускаю паука, я вижу, как он входит в систему и выдает запрос на первое сообщение. Тем не менее, все, что я вижу в выводе отладочной информации от scrapy, - это 3 перенаправления, которые в конечном итоге приводят к URL, который я запрашивал в первую очередь. Но скрапинг не вызывает мой обратный вызов parse_msg(), и сканирование прекращается. Вот фрагмент результатов скрапа:

2011-02-03 19:50:10-0600 [sg101] INFO: Spider opened
2011-02-03 19:50:10-0600 [sg101] DEBUG: Redirecting (302) to <GET https://login.yahoo.com/config/verify?.done=http%3a//my.yahoo.com> from <POST https://login.yahoo.com/config/login>
2011-02-03 19:50:10-0600 [sg101] DEBUG: Redirecting (meta refresh) to <GET http://my.yahoo.com> from <GET https://login.yahoo.com/config/verify?.done=http%3a//my.yahoo.com>
2011-02-03 19:50:12-0600 [sg101] DEBUG: Crawled (200) <GET http://my.yahoo.com> (referer: None)
2011-02-03 19:50:12-0600 [sg101] DEBUG: Successfully logged in. Now requesting 1st message.
2011-02-03 19:50:12-0600 [sg101] DEBUG: Redirecting (302) to <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?done=http%3A%2F%2Flaunch.groups.yahoo.com%2Fgroup%2FMyYahooGroup%2Fmessage%2F1> from <GET http://launch.groups.yahoo.com/group/MyYahooGroup/message/1>
2011-02-03 19:50:12-0600 [sg101] DEBUG: Redirecting (302) to <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?check=G&done=http%3A%2F%2Flaunch%2Egroups%2Eyahoo%2Ecom%2Fgroup%2FMyYahooGroup%2Fmessage%2F1> from <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?done=http%3A%2F%2Flaunch.groups.yahoo.com%2Fgroup%2FMyYahooGroup%2Fmessage%2F1>
2011-02-03 19:50:13-0600 [sg101] DEBUG: Redirecting (302) to <GET http://launch.groups.yahoo.com/group/MyYahooGroup/message/1> from <GET http://launch.groups.yahoo.com/group/MyYahooGroup/auth?check=G&done=http%3A%2F%2Flaunch%2Egroups%2Eyahoo%2Ecom%2Fgroup%2FMyYahooGroup%2Fmessage%2F1>
2011-02-03 19:50:13-0600 [sg101] INFO: Closing spider (finished)
2011-02-03 19:50:13-0600 [sg101] INFO: Spider closed (finished)

Я не могу понять это. Похоже, что Yahoo перенаправляет паука (может быть, для проверки подлинности?), Но, кажется, возвращается к URL, который я хотел посетить в первую очередь. Но scrapy не вызывает мой обратный вызов, и у меня нет шанса почистить данные или продолжить сканирование.

Есть ли у кого-нибудь идеи о том, что происходит и / или как отладить это дальше? Спасибо!

1 Ответ

5 голосов
/ 04 февраля 2011

Я думаю, что Yahoo перенаправляет для проверки авторизации и, наконец, перенаправляет меня на страницу, которую я действительно хотел получить. Однако Scrapy уже видел этот запрос и останавливается, потому что не хочет зацикливаться. Решение, в моем случае, заключается в добавлении dont_filter=True в конструктор запроса. Это будет указывать Scrapy не отфильтровывать повторяющиеся запросы. В моем случае это нормально, потому что я заранее знаю, какие URL я хочу сканировать.

def logged_in(self, response):
    if response.url == 'http://my.yahoo.com':
        self.log("Successfully logged in. Now requesting message page.",
                level=log.INFO)
        return Request(MSG_URL % self.msg_id, callback=self.parse_msg,
                errback=self.error, dont_filter=True)
    else:
        self.log("Login failed.", level=log.CRITICAL)
...