我正在尝试使用Mechanper / Python在scraperwiki(http://ratings.food.gov.uk/QuickSearch.aspx?q=po30)上搜索英国食品评级机构数据 aspx 搜索结果页面(例如,g 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个结果页面的任何想法?
答案 0 :(得分: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
在机械化中,我们可以获得这样的表单信息:
for form in br.forms():
print form
答案 1 :(得分:2)
Mechanize不处理JavaScript。
有许多方法可以解决此问题,包括QtWebKit,python-spidermonkey,HtmlUnit(使用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问题: