2013-03-22 23 views
2

試圖從公開搜索中自動獲取搜索結果,但遇到一些麻煩。該URL的形式爲使用scrapy與javascript相關的問題__doPostBack方法

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

當我通過點擊頁面,訪問該頁面後,稍微更改爲

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

問題是,如果我再嘗試直接訪問第二個鏈接,而不首先訪問第一個鏈接,我被重定向到第一個鏈接。我目前的嘗試是在scrapy中定義一長串start_urls。

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)] 

目前這段代碼只是一遍又一遍地訪問第一頁。我覺得這可能很簡單,但我不知道如何解決這個問題。

更新: 對此進行了一些研究並發現網站使用__doPostBack(arg1,arg2)向前一頁發送POST請求來更新每個頁面。我現在的問題是我如何使用scrapy來模仿這個POST請求。我知道如何進行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請求就像一個形式和相應更新。然而,當我真正嘗試運行此我得到以下回溯(S)(濃縮爲簡單起見):

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) 

更改的問題進行更直指這是什麼職位已變成。

想法?

P.S.當第二個錯誤發生時,scrapy無法清理關閉,我必須發送兩次SIGINT來讓事情真正結束。

回答

2

FormRequest沒有在構造一個位置參數爲formdata

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

所以你確實有說formdata=

requests.append(FormRequest(url, formdata=data)) 
+0

真棒!非常感謝,但還有一個更深層次的問題。它現在統一返回404個錯誤。有任何想法嗎? – 2013-03-22 18:57:39

+0

404意味着服務器認爲該網址是錯誤的,那麼實際的網址是什麼?通常,如果POST數據錯誤,服務器通常會給出500-ish的錯誤。順便說一句:你剛剛把我撞到了1k大關,真好。 – 2013-03-22 19:02:29

+0

另外,如果您正在處理.aspx,您可能還需要在POST數據中包含巨大的__VIEWSATE。 – 2013-03-22 19:07:22