16

Chromeに直接ダウンロードできるFLVファイルがWeb上にあります。このファイルは、CCTV(China Central Television)によって公開されているテレビ番組です。CCTVは非営利の国営放送局であり、中国の納税者が資金を提供しているため、著作権を侵害することなくコンテンツをダウンロードできます。

を使用しwgetて、別のアドレスからファイルをダウンロードできますが、Chromeで機能するアドレスからはダウンロードできません。

これは私がやろうとしたことです:

url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302'  

wget -c  $url --user-agent="" -O  xfgs.f4v

これも機能しません:

wget -c  $url   -O  xfgs.f4v

出力は次のとおりです。

Connecting to 118.26.57.12:80... connected.  
HTTP request sent, awaiting response... 403 Forbidden  
2013-02-13 09:50:42 ERROR 403: Forbidden.  

私は何が間違っているのですか?

最終的にはPythonライブラリと一緒にダウンロードしたいと思いますmechanize。これが私がそのために使用しているコードです:

import mechanize  
br = mechanize.Browser()  
br = mechanize.Browser()  
br.set_handle_robots(False)  
br.set_handle_equiv(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')]  
url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302' 
r = br.open(url).read()  
tofile=open("/tmp/xfgs.f4v","w")  
tofile.write(r)  
tofile.close()

結果は次のとおりです。

Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open  
   return self._mech_open(url, data, timeout=timeout)  
  File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open  
raise response  
mechanize._response.httperror_seek_wrapper: HTTP Error 403: Forbidden

mechanize誰かがコードを機能させる方法を説明できますか?

4

11 に答える 11

25

まず、何らかのスクレイピングを試みている場合(HTMLを解析している必要はありませんが、これはスクレイピングとしてカウントされます)、ある程度の予備調査を実行する必要があります。

FirefoxFirebugをまだお持ちでない場合は、入手してください。次に、 Chromeをまだお持ちでない場合は、入手してください。

Firefox / FirebugとChromeを起動し、Cookieなどをすべてクリアします。次にFirebugを開き、Chromeで[表示]->[開発者]->[開発者ツール]を開きます。

次に、取得しようとしているビデオのメインページをロードします。ページの読み込み時に設定されているCookie/ヘッダー/POST変数/クエリ文字列変数に注意してください。この情報をどこかに保存することをお勧めします。

次に、ビデオのダウンロードを試みます。もう一度、ビデオのロード時に設定されているCookie/ヘッダー/POST変数/クエリ文字列変数に注意してください。最初にページをロードしたときに、実際にビデオファイルをプルするために必要なCookieまたはPOST変数が設定されている可能性があります。

Pythonを作成するときは、この相互作用を可能な限りエミュレートする必要があります。python-requestsを使用します。これはおそらく利用可能な最も単純なURLライブラリであり、何らかの形で壁にぶつからない限り(それができないこと)、私は他に何も使用しません。2番目にpython-requestsを使い始めましたが、すべてのURLフェッチコードが5分の1に縮小されました。

さて、あなたがそれらを最初に試すとき、物事はおそらくうまくいかないでしょう。すっごく、Pythonを使用してメインページをロードする必要があります。すべてのCookie/ヘッダー/POST変数/クエリ文字列変数を印刷し、Chrome/Firebugが持っていたものと比較します。次に、ビデオをロードしてみて、もう一度、これらすべての値を比較します(つまり、サーバーに送信したものと、サーバーから返送されたものを意味します)。あなたはそれらの間の違いを理解する必要があります(心配しないでください、私たちは皆幼稚園でこれを学びました...「これらのものの1つは他のものとは異なります」)そしてその違いがどのように物事を壊しているのかを分析します。

このすべての終わりにまだそれを理解できない場合は、おそらく映画へのリンクを含むページのHTMLを調べる必要があります。ページ内のJavaScriptを探します。次に、Firebug / Chrome Developer Toolsを使用してjavascriptを検査し、ユーザーセッションの何らかの管理を行っているかどうかを確認します。ビデオアクセスに関連するトークン(CookieまたはPOST / GET変数)を何らかの形で生成している場合は、Pythonでトークン化メソッドをエミュレートする必要があります。

うまくいけば、これがすべて役に立ち、あまり怖く見えないでしょう。重要なのは、あなたが科学者である必要があるということです。知っていること、知らないこと、欲しいことを理解し、実験と結果の記録を開始します。最終的にはパターンが現れます。

編集:手順を明確にする

  1. 状態がどのように維持されているかを調査します
  2. Pythonで最初のページをプルし、そこから必要な状態情報を取得します
  3. その状態情報で必要になる可能性のあるトークン化を実行します
  4. 手順2と3のトークンを使用して動画をプルします
  5. 何かが爆発した場合は、リクエスト/レスポンスヘッダー、Cookie、クエリ変数、投稿変数を出力し、Chrome/Firebugと比較してください
  6. 解決策が見つかるまで、手順1に戻ります。

編集: これらのリクエストのいずれか(htmlページまたはファイルのダウンロード)でリダイレクトされる可能性もあります。それが起こっている場合、Firebug/Chromeでのリクエスト/レスポンスを見逃す可能性があります。解決策は、LiveHTTPHeadersのようなスニファ、または他のレスポンダー、 WireSharkまたはFiddlerによって提案されているようなスニファを使用することです。LinuxまたはOSXボックスを使用している場合、Fiddlerは役に立たないことに注意してください。これはWindowsのみであり、間違いなく.NET開発に焦点を合わせています...(うーん)。Wiresharkは非常に便利ですが、ほとんどの問題に対してはやり過ぎです。実行しているマシンによっては、Wiresharkを機能させるのに問題が発生する可能性があります。したがって、最初にLiveHTTPHeadersをお勧めします。

私はこの種の問題が大好きです

于 2013-02-22T15:25:22.950 に答える
6

mechanizeはステートフルブラウジングを実行できるようです。つまり、ブラウザのリクエスト間でコンテキストとCookieを保持します。最初にビデオが配置されているページ全体をロードしてから、ビデオを明示的にダウンロードしてみることをお勧めします。そうすれば、Webサーバーはそれが進行中の完全な(レギット)ブラウジングセッションであると見なします

于 2013-02-13T03:02:11.847 に答える
5
  1. seleniumまたはを使用watirして、ブラウザで必要なすべてのことを実行できます。
  2. ブラウザを見たくないので、セレンヘッドレスを実行できます

この回答も参照してください。

于 2013-02-16T04:19:25.130 に答える
5

手作業でURLを入力しなかったとすると、mechanizeを使用して、最初にURLを取得したページに移動します。次に、実際のファイルをダウンロードするために実行するアクションをエミュレートします(おそらくリンクまたはボタンをクリックします)。

MechanizeはCookieとリダイレクトの状態を保持しますが、HTMLページへのJavaScriptのリアルタイム変更を処理しないため、これは機能しない可能性があります。JavaScriptが操作に不可欠であるかどうかを確認するには、Chrome(または他のブラウザ)でJavaScriptを切り替えて、ファイルをダウンロードできることを確認してください。JavaScriptが必要な場合は、プログラムでブラウザーを駆動してファイルを取得しようとします。

この種のスクレイピングを試すための私の通常のアプローチは

  1. wgetまたはpythonsurllib2を試してください
  2. 機械化してみてください
  3. ブラウザを運転する

キャプチャがない限り、通常は最後のキャプチャが機能しますが、他のキャプチャの方が簡単です(そして高速です)。

于 2013-02-22T07:05:25.443 に答える
4

質問の「理由」の部分を明確にするために、ブラウザとコードのリクエストをデバッグプロキシ経由でルーティングできます。Windowsを使用している場合は、fiddler2をお勧めします。他のプラットフォーム用の他のデバッグプロキシもあります。しかし、fiddler2は間違いなく私のお気に入りです。

http://www.fiddler2.com/fiddler2/

https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project

http://www.charlesproxy.com/

またはより低レベルの http://netcat.sourceforge.net/

http://www.wireshark.org/

違いがわかれば、通常は解決策を考え出す方がはるかに簡単です。ステートフルブラウジング/クッキーに関する他の答えは正しいと思います。上記のツールを使用すると、ブラウザの自動化を行わずに、これらのCookieを分析し、適切なソリューションをロールバックできます。

于 2013-02-19T06:29:35.017 に答える
3

多くのサイトがあなたのセッションにのみ存在する一時的なリンクを使用していると思います。URLのコードは、おそらくセッションIDのようなものです。つまり、特定のリンクが二度と機能することはありません。

このセッションに対応するライブラリを使用して、リンクを含むページを再度開く必要があります(他の回答で言及されているように)。次に、リンクを見つけて、このセッションでのみ使用してみてください。

于 2013-02-21T11:38:55.307 に答える
2

ヘッドレスのWebKitブラウザーをラップするghostという名前のオープンソースのPythonライブラリがあるため、単純なAPIを介してすべてを制御できます。

from ghost import Ghost
ghost = Ghost()

page, resources = ghost.open('http://my.web.page')

クッキー、JavaScript、その他すべてをサポートしています。JavaScriptをページに挿入できます。ヘッドレスであるため、グラフィカルに何もレンダリングされませんが、DOMは引き続き使用できます。完全なブラウザです。

うまくスケーリングすることはできませんが、とても楽しいので、完全なブラウザに近づく何かが必要な場合に役立つかもしれません。

于 2013-02-20T10:39:21.810 に答える
2

現在受け入れられている回答(G. Shearerによる)は、一般的にスクレイピングについて可能な限り最良のアドバイスですが、いくつかの手順をスキップする方法を見つけました-すべてのhttpヘッダーとリクエストコンテキストを取得するcligetと呼ばれるFirefox拡張機能を使用しますCookieを実行し、クリップボードにコピーされるcurl(または)コマンドを生成します。wget

編集:この機能は、firebugとchromeデバッガーのネットワークパネルでも利用できます-右クリックリクエスト、「copyascurl」

ほとんどの場合、いくつかの明らかに不要なヘッダーを含む非常に冗長なコマンドを取得しますが、サーバーが要求を拒否するまで、反対の代わりにそれらを1つずつ削除できます(正直なところ、私はイライラします-私はしばしばリクエストからどのヘッダーが欠落しているかを考えて行き詰まりました)。

(また、コマンドラインから-Oオプションを削除curlして、ファイルにダウンロードする代わりにstdoutで結果を表示し、追加-vして完全なヘッダーリストを表示することもできます)

curl / wgetを使用したくない場合でも、1つのcurl / wgetコマンドラインをPythonコードに変換することは、urllibリクエスト(またはそのことについては任意のhttpリクエストライブラリ)にヘッダーを追加する方法を知っているだけです。

于 2013-06-30T12:03:07.423 に答える
0
from urllib import urlopen
print urlopen(url) #python built-in high level interface to get ANY online resources, auto responds to HTTP error codes.
于 2013-02-17T18:23:03.490 に答える
0

リクエストモジュールを試しましたか?urllib2やpycurlなどよりもはるかに簡単に使用できますが、強力です。次の機能があります。リンクはこちら

  • 国際ドメインとURL
  • キープアライブと接続プール
  • Cookieの永続性を備えたセッション
  • ブラウザスタイルのSSL検証
  • 基本/ダイジェスト認証
  • エレガントなキー/バリューCookie
  • 自動解凍
  • Unicode応答ボディ
  • マルチパートファイルのアップロード
  • 接続タイムアウト
  • .netrcサポート
  • Python 2.6〜3.3
  • スレッドセーフ。
  • 于 2013-02-22T10:34:53.917 に答える
    0

    インターネットダウンロードマネージャーを使用 すると、任意のWebサイトから任意のストリーミングメディアをキャプチャしてダウンロードできます。

    于 2013-02-22T20:54:31.523 に答える