2011-05-24 77 views
6

我想湊英國食品評級機構數據ASPX SEACH結果頁面上scraperwiki(http://scraperwiki.com/scrapers/food_standards_agency/)使用機械化/ Python的,但拿出一個(E,G http://ratings.food.gov.uk/QuickSearch.aspx?q=po30)。問題當試圖按照其具有的形式是「下一個」頁面鏈接:Screenscaping ASPX與Python機械化 - JavaScript表單提交

<input type="submit" name="ctl00$ContentPlaceHolder1$uxResults$uxNext" value="Next >" id="ctl00_ContentPlaceHolder1_uxResults_uxNext" title="Next >" /> 

表單處理程序是這樣的:

<form method="post" action="QuickSearch.aspx?q=po30" onsubmit="javascript:return WebForm_OnSubmit();" onkeypress="javascript:return WebForm_FireDefaultButton(event, 'ctl00_ContentPlaceHolder1_buttonSearch')" id="aspnetForm"> 
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" /> 

的HTTP跟蹤時,我手動點擊下一步鏈接顯示__e VENTTARGET爲空?我可以在其他刮板上找到的所有嬰兒牀都顯示__EVENTTARGET作爲處理下一頁的方式。

事實上,我不知道我要刮的頁面是如何加載下一頁的?無論我扔在刮板上,它只會加載第一個結果頁面。 (即使能夠改變每個頁面的結果數量也是有用的,但是我也看不出如何做到這一點)。

所以 - 關於如何刮取1 + N結果頁面的任何想法N> 0?

回答

8

機械化doesn't處理javascript,但對於這種特殊情況,它並不是t需要。

首先我們打開結果頁面與機械化

url = 'http://ratings.food.gov.uk/QuickSearch.aspx?q=po30' 
br = mechanize.Browser() 
br.set_handle_robots(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
br.open(url) 
response = br.response().read() 

然後我們選擇ASPNET形式:

br.select_form(nr=0) #Select the first (and only) form - it has no name so we reference by number 

的表單已經5提交按鈕 - 我們要提交一個需要我們去接下來的結果頁面:

response = br.submit(name='ctl00$ContentPlaceHolder1$uxResults$uxNext').read() #"Press" the next submit button 

其他形式提交按鈕:

ctl00$uxLanguageSwitch # Switch language to Welsh 
ctl00$ContentPlaceHolder1$uxResults$Button1 # Search submit button 
ctl00$ContentPlaceHolder1$uxResults$uxFirst # First result page 
ctl00$ContentPlaceHolder1$uxResults$uxPrevious # Previous result page 
ctl00$ContentPlaceHolder1$uxResults$uxLast # Last result page 

在機械化,我們可以得到這樣的形式信息:

for form in br.forms(): 
    print form 
2

機械化不處理JavaScript。

有許多方法來處理這個問題,但是,包括QtWebKitpython-spidermonkeyHtmlUnit(用Jython),或SeleniumRC

這裏是怎樣與SeleniumRC來完成:

import selenium 
sel=selenium.selenium("localhost",4444,"*firefox", "http://ratings.food.gov.uk") 
sel.start() 
sel.open("QuickSearch.aspx?q=po30") 
sel.click('ctl00$ContentPlaceHolder1$uxResults$uxNext') 

參見以下相關SO問題:

  1. How to click a link that has JavaScript
  2. Click on a JavaScript link within Python