2014-05-25 21 views
0

我想用Scrapy刮https://a836-propertyportal.nyc.gov/Default.aspx。我在使用FormRequest時遇到了困難 - 具體而言,我不知道如何告訴Scrapy如何填充塊和批次表單,然後獲取頁面的響應。我嘗試了在這裏找到的Scrapy網站上的FormRequest例子(http://doc.scrapy.org/en/latest/topics/request-response.html#using-formrequest-from-response-to-simulate-a-user-login),但仍然難以正確點擊「搜索」按鈕。需要JavaScript交互的刮頁

如果您能提供任何建議以便我可以從提交的頁面提取數據,我將非常感激。 SO上的一些海報表明,Scrapy不能很好地處理JS事件,而是使用CasperJS之類的其他庫。

更新:我將非常感激,如果有人可以請點我到Java/Python的/ JS庫,讓我提交表單,並獲取後續信息

更新的代碼(以下帕維爾的評論):我的代碼可以在這裏找到:

from scrapy.spider import Spider 
from scrapy.selector import Selector 
from scrapy.http import FormRequest, Request 

class MonshtarSpider(Spider): 
name = "monshtar" 
allowed_domains = ["https://a836-propertyportal.nyc.gov/Default.aspx"] 
start_urls = (
    'https://a836-propertyportal.nyc.gov/Default.aspx/', 
    ) 

def parse(self, response): 
    print "entered the parsing section!!" 

    yield Request("https://a836-propertyportal.nyc.gov/ExemptionDetails.aspx", 
     cookies = {"borough":"1", "block":"01000", "style":"default", "lot":"0011"}, callback = self.aftersubmit) 


def aftersubmit(self, response): 
    #get the data.... 
    print "SUCCESS!!\n\n\n" 

回答

2

你的頁面有點麻煩,很難解析,在提交有效的POST請求後,頁面響應302 http狀態和一堆cookie(你的formdata是無效的,你需要用你的參數中的美元替換下劃線) 。

內容可以發送GET到https://a836-propertyportal.nyc.gov/ExemptionDetails.aspx

最令人吃驚的事情後,被看作是可以抓取只用餅乾這個網站,不POST請求。 POST只是爲了給你cookies,它不會重定向到html響應或者響應。您可以從蜘蛛中操縱這些cookie。你只需要做出第一個GET獲得會話cookie,並與市鎮然後連續GETS,阻斷等

在scrapy殼試試這個:在這一點上

[email protected]:~/stack/scrapy$ scrapy shell "https://a836-propertyportal.nyc.gov/Default.aspx" 

In [1]: from scrapy.http import Request 

In [2]: req = Request("https://a836-propertyportal.nyc.gov/ExemptionDetails.aspx", cookies = {"borough":"1", "block":"01000", "style":"default", "lot":"0011"}) 

In [3]: fetch(req) 

In [4]: view(response) 

Out[5]: True # opening browser window 

響應將包含數據的屬性與給定的塊,自治市鎮和很多。現在你只需要在蜘蛛中使用這些知識。只需用GET代替你的POST,在你的shell中添加回調,它應該可以正常工作。

如果這仍然不起作用,或者以某種方式不適合您的目的嘗試提取隱藏的ajax參數(nullctl00_ScriptManager1_HiddenField的值),將其添加到formdata中(當然要更正您的formdata,以便它與瀏覽器發送的內容相同) 。

+0

Hi @Pawel:我現在可以打印出答覆,非常感謝!但是,並非所有感興趣的值都出現。例如,當我打印出響應的主體時,稅率確實出現,但所有者名稱沒有。你會如何建議我補救這一點? – NumenorForLife

0

你不點擊搜索按鈕,但你做一個POST請求一個頁面中的所有數據。但是檢查代碼,它會發送大量數據。下面我張貼我的請求...

ctl00_ScriptManager1_HiddenField:;;AjaxControlToolkit, Version=3.0.11119.25904, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e:en-US:f48478dd-9360-4d50-94c1-5c5fa55bd379:865923e8:411fea1c:e7c87f07:91bd373d:1d58b08c:8e72a662:acd642d2:596d588c:77c58d20:14b56adc:269a19ae:bbfda34c:30a78ec5:5430d994 
__EVENTTARGET: 
__EVENTARGUMENT: 
__VIEWSTATE:/wEPDwULLTEwMDA4NDY4ODAPZBYCZg9kFgICBQ9kFgQCAg9kFgQCAQ8WAh4HVmlzaWJsZWhkAgcPFgIfAGgWAgIBDxYCHglpbm5lcmh0bWwFGEFsZXJ0IGZvcjxiciAvPiBCQkwgOiAtLWQCBA9kFgQCAg9kFgQCAQ9kFgRmDw8WBB4IQ3NzQ2xhc3MFF2FjY29yZGlvbkhlYWRlclNlbGVjdGVkHgRfIVNCAgJkZAIBDw8WBB8CBRBhY2NvcmRpb25Db250ZW50HwMCAhYCHgVzdHlsZQUOZGlzcGxheTpibG9jaztkAgIPZBYEZg8PFgQfAgUPYWNjb3JkaW9uSGVhZGVyHwMCAmRkAgEPDxYEHwIFEGFjY29yZGlvbkNvbnRlbnQfAwICFgIfBAUNZGlzcGxheTpub25lOxYCAgEPZBYCZg9kFgZmDw9kFgIfBAUNZGlzcGxheTpub25lO2QCDA8PFgIfAGhkZAINDw8WAh8AaGRkAgMPD2QWBh4FU3R5bGUFN3dpZHRoOjM1MHB4O2JhY2tncm91bmQ6d2hpdGU7ZGlzcGxheTpub25lO29wYWNpdHk6MC45MjseC29ubW91c2VvdmVyBQ93d2hIZWxwLnNob3coKTseCm9ubW91c2VvdXQFD3d3aEhlbHAuaGlkZSgpO2Rky2sFuMlw1iy/E0GN9cB65RXg7Aw= 
__EVENTVALIDATION:/wEWGgKWm9a2BgL687aTAwLmha0BAujn2IECAo3DtaEJAtLdz/kGAr3g5K4DAu78ttcEAvOB3+MGAvKB3+MGAvGB3+MGAvCB3+MGAveB3+MGAoHAg44PArT/mOoPAqrvlMAJAtzQstcEAoDswboFAoHswboFAoLswboFAoPswboFAoTswboFAtjqpO8KAujQ7b0GAqvgnb0NAsPa/KsBQz19YIqBRvCWvZh8bk6XKxp+wQo= 
grpStyle:blue 
ctl00$SampleContent$MyAccordion_AccordionExtender_ClientState:0 
ctl00$SampleContent$ctl01$TextBox1:(unable to decode value) 
ctl00$SampleContent$ctl01$ddlParclBorough:1 
ctl00$SampleContent$ctl01$txtBlock:100 
ctl00$SampleContent$ctl01$txtLot:200 
ctl00$SampleContent$ctl01$btnSearchBBL:Please Wait... 
ctl00$SampleContent$ctl03$TextBox2:(unable to decode value) 
ctl00$SampleContent$ctl03$ddlParclBoroughPropAddr:1 
ctl00$SampleContent$ctl03$txtHouseNbr: 
ctl00$SampleContent$ctl03$txtStreetNm: 
ctl00$SampleContent$ctl03$txtAptNbr: 

我的建議是使用支持執行JS的廢料庫。或者使用別的東西。我有很多成功的使用Selenium和WebDriver在瀏覽器中執行代碼,它支持JS。

更新:

你有一個例子How to submit a form using PhantomJS

+0

什麼刮圖書館,你會推薦我使用呢?你使用Scrapy + Selenium/WebDriver嗎? – NumenorForLife

+0

我在使用JavaScript處理非JavaScript網站和硒時使用scrapy。afaik硒不是爲刮刮而建的,但它起作用。 請確保你檢查周圍,我很確定有用於刮取哪些支持JS的庫/項目。 – FrEaKmAn

+0

嘗試美容湯由http://www.crummy.com/software/BeautifulSoup/ – eddwinpaz