Проблемы с использованием скрапа с использованием метода javascript __doPostBack

Попытка автоматически получить результаты поиска из открытого поиска, но столкнулась с некоторыми проблемами. URL имеет форму

http://www.website.com/search.aspx?keyword=#&&page=1&sort=Sorting

Когда я нажимаю на страницы, после посещения этой страницы она слегка меняется на

http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page=2

Проблема в том, что если я затем пытаюсь напрямую перейти ко второй ссылке, не посетив сначала первую ссылку, я перенаправлен на первую ссылку. Моя текущая попытка это определить длинный список start_urls в scrapy.

class websiteSpider(BaseSpider):
    name = "website"
    allowed_domains = ["website.com"]
    baseUrl = "http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page="
    start_urls = [(baseUrl+str(i)) for i in range(1,1000)]

В настоящее время этот код просто посещает первую страницу снова и снова. Я чувствую, что это, вероятно, просто, но я не совсем знаю, как обойти это.

ОБНОВЛЕНИЕ: проделал некоторый прогресс в расследовании этого и обнаружил, что сайт обновляет каждую страницу, отправляя запрос POST на предыдущую страницу с помощью __doPostBack(arg1, arg2). Мой вопрос сейчас заключается в том, как именно я имитирую этот запрос POST, используя scrapy. Я знаю, как сделать запрос POST, но не совсем так, как передать ему аргументы, которые я хочу.

ВТОРОЕ ОБНОВЛЕНИЕ: я добился большого прогресса! Я думаю... Я просмотрел примеры и документацию и в итоге собрал воедино эту версию того, что, по моему мнению, должно сработать:

def start_requests(self):
    baseUrl = "http://www.website.com/search.aspx?keyword=#&&sort=Sorting&page="
    target = 'ctl00$empcnt$ucResults$pagination'
    requests = []
    for i in range(1, 5):
        url = baseUrl + str(i)
        argument = str(i+1)
        data = {'__EVENTTARGET': target, '__EVENTARGUMENT': argument}
        currentPage = FormRequest(url, data)
        requests.append(currentPage)
    return requests

Идея состоит в том, что это обрабатывает запрос POST точно так же, как форму и обновляет соответственно. Тем не менее, когда я на самом деле пытаюсь запустить это, я получаю следующие трассировки (сокращенно для краткости):

2013-03-22 04:03:03-0400 [guru] ERROR: Unhandled error on engine.crawl()
dfd.addCallbacks(request.callback or spider.parse, request.errback)
      File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 280, in addCallbacks
        assert callable(callback)
    exceptions.AssertionError: 

2013-03-22 04:03:03-0400 [-] ERROR: Unhandled error in Deferred:
2013-03-22 04:03:03-0400 [-] Unhandled Error
    Traceback (most recent call last):
    Failure: scrapy.exceptions.IgnoreRequest: Skipped (request already seen)

Изменение вопроса, чтобы быть более направленным на то, во что превратился этот пост.

Мысли?

PS Когда происходят вторые ошибки, scrapy не может очистить выключение, и мне приходится дважды отправлять SIGINT, чтобы все закончилось.

1 ответ

Решение

FormRequest не имеет позиционного аргумента в конструкторе для formdata:

class FormRequest(Request):
    def __init__(self, *args, **kwargs):
        formdata = kwargs.pop('formdata', None)

так что вы на самом деле должны сказать formdata=:

requests.append(FormRequest(url, formdata=data))
Другие вопросы по тегам