1

短い: python Mechanize で JavaScript リダイレクトを実行/シミュレートする方法は?

location.href="http://www.site2.com/";

ページ内のリンクを探してそれをたどるmechanizeモジュールを使用してpythonスクリプトを作成しました。

問題は特定のサイトにあります

br.follow_link("http://www.address1.com") 

彼は私を次の簡単なページにリダイレクトします。

<script language="JavaScript">{                                                                                         
    location.href="http://www.site2.com/";                                                                                           
    self.focus();                                                                                                                   
    }</script>

今、もしそうなら:

br = mechanize.Browser(factory=mechanize.RobustFactory())

... #other code

br.follow_link("http://www.address1.com") 
for link in br.links():   
br.follow_link(link)
print link

何も印刷されません。つまり、そのページにはリンクがありません。しかし、ページを手動で解析して実行すると、次のようになります。

br.open("http://www.site2.com")

Site2 は、私が「www.address1.com」から来ていることを認識せず、スクリプトが期待どおりに機能しません!

初心者の質問で申し訳ありませんが、よろしくお願いします!

ps私はbr.set_handle_referer(True)を持っています

編集: 詳細: Fiddler2 でそのリンクを調べると、次のようになります。

GET http://www.site2.com/ HTTP/1.1 ホスト: www.site2.com 接続: キープアライブ ユーザーエージェント: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML、Gecko など) Chrome /22.0.1229.94 Safari/537.4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8 Referer: http://www.address1.com Accept-Encoding: gzip,deflate ,sdch Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q =0.3 Cookie: PHPSESSID=6e161axxxxxxxxxxx; ユーザー=私のユーザー名;
pass=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; IP=79.xx.xx.xx;
エージェント = a220243a8b8f83de64c6204a5ef7b6eb; __utma=154746788.943755841.1348303404.1350232016.1350241320.43; __utmb=154746788.12.10.1350241320; __utmc=154999999; __utmz=154746788.134999998.99.6.utmcsr=google|utmccn=(オーガニック)|utmcmd=オーガニック|utmctr=%something%something%

それはクッキーの問題のようですか?

4

4 に答える 4

1

解決しました!この上:

    cj = cookielib.LWPCookieJar()
    br.set_cookiejar(cj)

    ...

    br.follow_link("www.address1.com")
    refe= br.geturl()
    req = urllib2.Request(url='www.site2.com')
    req.add_header('Referer', refe)
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj) )
    f = opener.open(req) 
    htm = f.read()
    print "\n\n", htm
于 2012-10-14T22:31:12.150 に答える
1

Mechanize は JavaScript を処理できません。JavaScript を解釈できないためです。サイトを手動で解析して、このリンクを に渡してみてくださいbr.follow_link

于 2012-10-14T10:37:38.530 に答える
0

リクエストを行う前に、HTTP リファラー ヘッダーを明示的に設定できます

br.addheaders = [('Referer', 'http://alpha.com')]
br.open("http://beta.com")

詳細については、驚くほど見つけにくい公式ドキュメント http://wwwsearch.sourceforge.net/mechanize/doc.htmlを参照してください。

于 2012-10-14T10:48:23.223 に答える
0

どうですか

br.open("http://alpha.com") 

br.follow_link("http://beta.com")

うまくいけばbr_follow_link、それは前のページで HTTP リファラーを設定します。一方、それを行うbr.openと、新しいウィンドウを開くのと同じように、HTTP リファラー ヘッダーが設定されません。


編集します。.follow_link文字列を取らないように見えmechanize.Linkますが、プロパティを持つ特別なオブジェクトを取ります.absolute_url。あなたはそれを偽造することができます。

>>> class Fake:
...     pass
...
>>> x = Fake()
>>> x.absolute_url="http://stackoverflow.com"
>>> br.follow_link(x)
<response_seek_wrapper at 0x2937af8 whose wrapped object = <closeable_response at 0x2937f08 whose fp = <socket._fileobject object at 0x02934970>>>
>>> br.title()
'Stack Overflow'

mechanize.Linkまたは、ハッキーではありませんが、より退屈な実物を作成します。

于 2012-10-14T19:02:48.460 に答える