3

タイトルが十分に明確であるかどうかわからないので、これがどうした:

私は約 3 週間前に Python の学習を開始しましたが、最近、Web サイトにログインして特定のページを読み、同じページにコメントを投稿するというタスクを自分自身に与えました。すべて Python scrypt を使用しています。ドキュメントを検索したところ、urllib、urllib2、および cookielib モジュールが探していたものであることがわかりました。だから私はこのコードを思いついた:

import urllib, urllib2, cookielib
import re

url_page = 'http://www.example.net/page/'
url_login = 'http://www.example.net/login.php'
url_post = 'http://www.example.net/post.php'

def main():

    #login data
    username = 'user1'
    password = 'user1'

    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

    login_data = urllib.urlencode({'j_user' : username, 'j_pass' : password})
    opener.open(url_login, login_data)

    opener.open(url_page)    

    #comment is in string
    s = "abcd"

    #post data
    post_data = urllib.urlencode({'com' : s})
    opener.open(url_post, post_data)

if __name__=='__main__':
    main()

最初の部分 (ログイン) は正常に動作し、サイトにログインしてページを取得できます。しかし、何も起こりません - コメントの投稿に失敗します。すると、このサイトでmechanizeモジュールが Web ブラウジングに最適なソリューションであることがわかりました。そこで、このスクリプトを見つけて、目的に合わせて調整しました。

import mechanize
import cookielib
import urllib
import re

#required addresses
url_page = 'http://www.example.net/page/'

def main():
    br = mechanize.Browser() 
    cj = cookielib.LWPCookieJar()
    br.set_cookiejar(cj)

    br.set_handle_equiv(True)
    br.set_handle_gzip(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)

    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

    r = br.open(url_page)

    #selecting form
    br.select_form(nr=2)
    #setting inputs 
    br.form['j_user'] = 'user1'
    br.form['j_pass'] = 'user1'

    #login
    r = br.submit()

    r = br.open(url_page)

    s = "abcd"

    #posting
    br.select_form(nr=4)
    br.form['com'] = s
    br.submit()


if __name__ == '__main__':
    main()

スクリプトは完璧に実行され、コメントが投稿されます。

だから私の質問は - 最初のスクリプトの問題はどこですか? 最初のスクリプトでコメントを投稿しても結果が得られないのはなぜですか? それは何かが欠けていますか?

お時間をいただき、ありがとうございました。

4

1 に答える 1

0

mechanize のソースをざっと見てみると、mechanize が最終的に urllib2.Request インスタンスを使用し、その add_data メンバーを呼び出していることがわかります。ドキュメントによると、 Request は User-Agent を設定します。あなたのWebサーバーが、ユーザーエージェントの欠如または無効への投稿を拒否している可能性はありますか?

古い PyMOTW の投稿に、やりたいことを実行するための優れたチュートリアルがあります。http://www.doughellmann.com/PyMOTW/urllib2/ Michael Foord の行方不明のマニュアルなどの貴重なリソースにリンクしています。http://www.voidspace.org.uk/python/articles/urllib2.shtml

HttpHandler が Content-Type: application/x-www-form-urlencoded のヘッダーをリクエストに追加しているようです。最初のケースで追加してみてください。また、Content-Length ヘッダーも設定します。

http://hg.python.org/cpython/file/457c0c9c7893/Lib/urllib2.py#l1112

post_data = urllib.urlencode({'com' : s})
post_headers_and_data = "Content-Type: application/x-www-form-urlencoded\nContent-Length: {0}\n\n{1}".format(len(post_data), post_data)
opener.open(url_post, post_headers_and_data)
于 2012-11-16T15:46:46.123 に答える