簡體   English   中英

使用 Python 機械化的屏幕截圖 aspx - Javascript 表單提交

[英]Screenscaping aspx with Python Mechanize - Javascript form submission

我正在嘗試在scraperwiki ( http :/ /scraperwiki.com/scrapers/food_standards_agency/ )但在嘗試遵循具有以下形式的“下一頁”鏈接時遇到問題:

<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 跟蹤顯示 __EVENTTARGET 為空? 我可以在其他刮刀上找到的所有嬰兒床都顯示了對 __EVENTTARGET 的操作作為處理下一頁的方式。

確實,我不確定我要抓取的頁面如何加載下一頁? 無論我向刮板扔什么,它都只能加載第一個結果頁面。 (即使能夠更改每頁的結果數量也會很有用,但我也不知道該怎么做!)

那么 - 關於如何為 N>0 抓取第 1+N 個結果頁面的任何想法?

Mechanize 不處理 javascript,但對於這種特殊情況,不需要它。

首先我們用mechanize打開結果頁面

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

然后我們select的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

在 mechanize 中,我們可以獲得如下形式的信息:

for form in br.forms():
    print form

機械化不處理 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. 如何單擊具有 JavaScript 的鏈接
  2. 單擊 Python 中的 JavaScript 鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM