0

ここで.txtファイルをダウンロードしようとしています:http://www.namejet.com/Pages/Downloads.aspx

しかし、ダウンロードリンクは私が前に見たことがない形式になっています...

<a id="ctl00_ContentPlaceHolder1_hlPreRelease0" class="sIcoTxt" rel="nofollow" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$hlPreRelease0','')">Wednesday, September 19, 2012</a>

どこから始めればよいのかわかりません。ダウンロードページにアクセスし、このリンクの背後にあるファイルをダウンロードして保存するスクリプトが必要ですか?

4

1 に答える 1

0

ここのリンクは、javascript 関数の呼び出し__doPostBackです。

これを自動的に処理する唯一の方法は、スクリプトをダウンロード__doPostBackし、適切な環境で JS インタープリターで関数を実行することです。これを行う最も簡単な方法は、Greasemonkey などを使用して、ブラウザー環境内からスクリプトを作成することです。

ただし、スクリプトをダウンロードして読み取り、何__doPostBackが機能するかを理解し、手持ちの情報を使用して Python で同じロジックを実装できるかどうかを確認することで、これを半自動的に処理できるため、javascript:__doPostBack('ctl00$ContentPlaceHolder1$hlPreRelease0','')実際にダウンロードできる URL に変換できます。

非常に簡単な例を挙げると、これを見つけたとしましょう:

function __doPostBack(name, callback) {
  var url = 'http://' + window.location.hostname + '/postbacks/' + name + ".xml";
  var xhr = new XMLHttpRequest();
  xhr.open("POST", url, false);
  xhr.send();
  var xml = xhr.responseXML;
  if (callback) callback(xml);
}

したがって、次のようにします。

r = re.compile(r"javascript:__doPostBack\('(.*?)','')")

この正規表現に一致する href を取得したら、次のようにします。

nexturl = 'http://' + urlparse.urlparse(lasturl).netloc + '/postbacks/' + m.groups(1) + '.xml'
u = urllib2.urlopen(nexturl, '')
xml = u.read()

JS が非常に複雑で理解しにくい場合は、ブラウザーの Web 開発ツールを使用して、リンクをクリックしたときにダウンロードされる URL を監視し、変換をリバース エンジニアリングする方が簡単な場合があります。(もちろん、いくつかのファイルだけを取得する場合は、同じ場所からキャッシュ内でそれらを見つけることもできます。それで完了です。)

于 2012-09-19T19:28:56.927 に答える