0

ScraperWiki のツールを使用して、ASP を利用したサイトをスクレイピングしようとしています。

BBSmates.com Web サイトから特定の市外局番の BBS のリストを取得したいと考えています。このサイトには、一度に 20 件の BBS 検索結果が表示されるので、結果のあるページから次のページに移動するには、フォームを送信する必要があります。

このブログ投稿は、私が始めるのに役立ちました。次のコードは、市外局番 314 の BBS リストの最終ページ (79 ページ) を取得すると考えました。

ただし、取得した応答は FIRST ページです。

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に問題があったと述べているため、このフォームで 2 つの SubmitControl を無効にしてみました。

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

cmdLogin を無効にすると、HTTP エラー 500 が生成されました。

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

ContentPlaceHolder1$Button1 を無効にしても違いはありませんでした。送信は完了しましたが、返されたページはまだ検索結果の 1 ページ目でした。

このサイトでは「Page$Next」を使用していないことに注意してください。

ASPXフォームの送信を機能させるために何をする必要があるかを理解してくれる人はいますか?

4

1 に答える 1

0

ページが提供する値 (EVENTVALIDATION、VIEWSTATE など) を投稿する必要があります。

このコードは機能します ( Mechanize ではなく、すばらしいRequestsライブラリを使用していることに注意してください)。

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

于 2012-10-29T15:45:15.103 に答える