Почему этот ScraperWiki для сайта ASPX возвращает только ту же страницу результатов поиска?

Я пытаюсь очистить ASP-сайт с помощью инструментов ScraperWiki.

Я хочу получить список BBS в определенном регионе с веб-сайта BBSmates.com. На сайте одновременно отображается 20 результатов поиска BBS, поэтому мне придется отправлять формы, чтобы переходить с одной страницы результатов на другую.

Этот сообщение в блоге помог мне начать. Я думал, что следующий код захватит последнюю страницу списков BBS для кода города 314 (стр. 79).

Однако ответ, который я получаю, это ПЕРВАЯ страница.

url = 'http://bbsmates.com/browsebbs.aspx?BBSName=&AreaCode=314'
br = mechanize.Browser()
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')]
response = br.open(url)

html = response.read()

br.select_form(name='aspnetForm')
br.form.set_all_readonly(False)
br['__EVENTTARGET'] = 'ctl00$ContentPlaceHolder1$GridView1'
br['__EVENTARGUMENT'] = 'Page$79'
print br.form
response2 = br.submit()

html2 = response2.read()
print html2

В сообщении в блоге, которое я цитировал выше, упоминается, что в их случае возникла проблема с SubmitControl, поэтому я попытался отключить два SubmitControls в этой форме.

br.find_control("ctl00$cmdLogin").disabled = True

Отключение cmdLogin вызвало ошибку HTTP 500.

br.find_control("ctl00$ContentPlaceHolder1$Button1").disabled = True

Отключение ContentPlaceHolder1$Button1 не имело никакого значения. Отправка прошла, но страница, которую она вернула, по-прежнему была страницей 1 результатов поиска.

Стоит отметить, что этот сайт НЕ использует «Page$Next».

Может ли кто-нибудь помочь мне понять, что мне нужно сделать, чтобы заставить форму ASPX работать?


person Kirkman14    schedule 29.10.2012    source источник
comment
Вам может понравиться эта запись в блоге лучше   -  person pguardiario    schedule 29.10.2012
comment
Я не знаю Ruby (пока), но я буду возиться с вашим кодом.   -  person Kirkman14    schedule 29.10.2012


Ответы (1)


Вам нужно опубликовать значения, которые дает страница (EVENTVALIDATION, VIEWSTATE и т. д.).

Этот код будет работать (обратите внимание, что он использует замечательную библиотеку Requests, а не Mechanize).

import lxml.html 
import requests
starturl = 'http://bbsmates.com/browsebbs.aspx?BBSName=&AreaCode=314'
s = requests.session() # create a session object 
r1 = s.get(starturl) #get page 1
html = r1.text
root = lxml.html.fromstring(html)

#pick up the javascript values 
EVENTVALIDATION = root.xpath('//input[@name="__EVENTVALIDATION"]')[0].attrib['value'] 
#find the __EVENTVALIDATION value 
VIEWSTATE = root.xpath('//input[@name="__VIEWSTATE"]')[0].attrib['value'] 
#find the __VIEWSTATE value
# build a dictionary to post to the site with the values we have collected. The __EVENTARGUMENT can be changed to fetch another result page (3,4,5 etc.)
payload = {'__EVENTTARGET': 'ctl00$ContentPlaceHolder1$GridView1','__EVENTARGUMENT':'Page$25','__EVENTVALIDATION':EVENTVALIDATION,'__VIEWSTATE':VIEWSTATE,'__VIEWSTATEENCRYPTED':'','ctl00$txtUsername':'','ctl00$txtPassword':'','ctl00$ContentPlaceHolder1$txtBBSName':'','ctl00$ContentPlaceHolder1$txtSysop':'','ctl00$ContentPlaceHolder1$txtSoftware':'','ctl00$ContentPlaceHolder1$txtCity':'','ctl00$ContentPlaceHolder1$txtState':'','ctl00$ContentPlaceHolder1$txtCountry':'','ctl00$ContentPlaceHolder1$txtZipCode':'','ctl00$ContentPlaceHolder1$txtAreaCode':'314','ctl00$ContentPlaceHolder1$txtPrefix':'','ctl00$ContentPlaceHolder1$txtDescription':'','ctl00$ContentPlaceHolder1$Activity':'rdoBoth','ctl00$ContentPlaceHolder1$drpRPP':'20'}
# post it 
r2 = s.post(starturl, data=payload)
# our response is now page 2 
print r2.text

Когда вы дойдете до конца результатов (страница результатов 21), вам нужно снова выбрать значения VIEWSTATE и EVENTVALIDATION (и делать это каждые 20 страниц).

Обратите внимание, что некоторые значения, которые вы публикуете, пусты, а некоторые содержат значения. Полный список такой:

'ctl00$txtUsername':'','ctl00$txtPassword':'','ctl00$ContentPlaceHolder1$txtBBSName':'','ctl00$ContentPlaceHolder1$txtSysop':'','ctl00$ContentPlaceHolder1$txtSoftware':'','ctl00$ContentPlaceHolder1$txtCity':'','ctl00$ContentPlaceHolder1$txtState':'','ctl00$ContentPlaceHolder1$txtCountry':'','ctl00$ContentPlaceHolder1$txtZipCode':'','ctl00$ContentPlaceHolder1$txtAreaCode':'314','ctl00$ContentPlaceHolder1$txtPrefix':'','ctl00$ContentPlaceHolder1$txtDescription':'','ctl00$ContentPlaceHolder1$Activity':'rdoBoth','ctl00$ContentPlaceHolder1$drpRPP':'20'

Вот обсуждение аналогичной проблемы в списке рассылки Scraperwiki: https://groups.google.com/forum/#!topic/scraperwiki/W0Xi7AxfZp0

person pallih    schedule 29.10.2012