試圖從公開搜索中自動獲取搜索結果,但遇到一些麻煩。該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來讓事情真正結束。
真棒!非常感謝,但還有一個更深層次的問題。它現在統一返回404個錯誤。有任何想法嗎? – 2013-03-22 18:57:39
404意味着服務器認爲該網址是錯誤的,那麼實際的網址是什麼?通常,如果POST數據錯誤,服務器通常會給出500-ish的錯誤。順便說一句:你剛剛把我撞到了1k大關,真好。 – 2013-03-22 19:02:29
另外,如果您正在處理.aspx,您可能還需要在POST數據中包含巨大的__VIEWSATE。 – 2013-03-22 19:07:22