6

私は、scraperwikihttp :/ /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の操作を示しています。

確かに、スクレイプしたいページが次のページをどのようにロードするのかわかりませんか?スクレーパーに何を投げても、最初の結果ページをロードすることしかできません。(1ページあたりの結果数を変更できることも便利ですが、その方法もわかりません!)

それで、N>0の1+ N番目の結果ページをスクレイプする方法についてのアイデアはありますか?

4

2 に答える 2

8

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

次に、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
于 2011-05-25T12:23:08.483 に答える
2

Mechanizeは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リンクをクリックします
于 2011-05-24T20:32:25.420 に答える