1

これは、vbulliten メッセージボードにログインし、スレッドをスキャンして特定のテキストを探し、このテキストを新しい形式で投稿する単純なボットです。私の while ループには、テスト目的で x == 1 という if else 条件があります。これを行うと、mechanize が正常に動作し、正しいフォームが選択され、コードが正常に機能します。しかし、特定の時間に基づいて if else を単純に変更すると、「formnotFound」エラーが発生します。

from BeautifulSoup import BeautifulSoup
from datetime import datetime
import mechanize
import re
import sqlite3
import time

def login(page):

    br = mechanize.Browser()
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_equiv(True)
    br.set_handle_refresh(True)
    br.set_handle_robots(False)
    br.addheaders = [('User-agent', 'Firefox')]

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

    br.select_form(nr=0)
    br.form['vb_login_username']='notrealusername'
    br.form['vb_login_password']='notrealpassword'
    br.form['cookieuser'] = ['1']
    br.submit()
    br.open(page)

    return br


br = login("http://www.nottherealsite.com")
html = br.response().read()
soup = BeautifulSoup(html)
x = 1

# Ahead you'll see two functions, insertData() and extraction().
# I didn't include them in my submission here 
# because I don't think it's necessary. they dont involve anything to do with 
# mechanize, they just strip data out of the pages. The functions also work fine
# with the x==1 conditional, fyi

while True:
    now = datetime.now()
    minute = now.minute

これはうまくいきます:

    if x == 1:

        print "it is working . . ."
        insertData()
        votes = extraction()
        br.select_form(nr=6)
        br.form['message'] = votes
        br.submit()

        x = 2

    else:

        print "we are now done"
        break

に置き換えるx== 1minute > 30、mechanize で form not found エラーが発生します (そして、時間は 30 分を過ぎていました):

    if minute > 30:

            print "it is working . . ."
            insertData()
            votes = extraction()
            br.select_form(nr=6)
            br.form['message'] = votes
            br.submit()

            # remember, I am just concerned about mechanize going through
            x = 2

        else:

            print "we are now done"
            break

これを使って実際に何をしているのかを伝えるのは難しいかもしれませんが、上記のコードは現在テスト目的であることに注意してください。if else ステートメントを変更すると、機械化が失敗する理由は誰にもわかりますか? 私には意味がありません。ありがとう

4

1 に答える 1

0

私は数日前に他の言語 (C#) であなたと同様の問題に遭遇しました。私の解決策があなたに当てはまるかどうかはわかりません。

私の解決策は、Web ページが完全にロードされるまで待つことです。ページが完全にロードされたときにライブラリ (機械化) がコールバックを提供した場合は、それを使用します。または、数秒待ちます。

于 2012-09-22T23:48:00.387 に答える