0

私は現在、(Web サイトから取得した) XML ファイルから各ユーザーのデータを出力するコードを持っています。XML は、より多くのユーザーが 1 日を通して対話するにつれて更新されます。現在、コードをループして、このデータを 5 分ごとにダウンロードしています。

コードが実行されるたびに、ユーザーとその統計のリストが生成されます。最初の 5 分間は、users: z,y,z が出力されます。

2 番目の 5 分でユーザーが出力されます。

x,y,z,a,b

3 番目の 5 分間は、ユーザーを出力します。

x,y,z,a,b,c,d

最初の 5 分間を印刷するために必要なコード:

x,y,z 

2 番目の 5 分:

a,b 

3 番目の 5 分:

c,d

一部のユーザーがすでに使用されていることを認識する方法。各ユーザーには、一致する可能性があると思われる一意のユーザー ID がありますか?

役立つ場合に備えて、コードの例を同封します。

import mechanize
import urllib
import json
import re
import random
import datetime
from sched import scheduler
from time import time, sleep

######Code to loop the script and set up scheduling time

s = scheduler(time, sleep)
random.seed()

def run_periodically(start, end, interval, func):
    event_time = start
    while event_time < end:
        s.enterabs(event_time, 0, func, ())
        event_time += interval + random.randrange(-5, 45)
    s.run()

###### Code to get the data required from the URL desired
def getData():  
    post_url = "URL OF INTEREST"
    browser = mechanize.Browser()
    browser.set_handle_robots(False)
    browser.addheaders = [('User-agent', 'Firefox')]

######These are the parameters you've got from checking with the aforementioned tools
    parameters = {'page' : '1',
              'rp' : '250',
              'sortname' : 'roi',
              'sortorder' : 'desc'
             }
#####Encode the parameters
    data = urllib.urlencode(parameters)
    trans_array = browser.open(post_url,data).read().decode('UTF-8')

    xmlload1 = json.loads(trans_array)
    pattern1 = re.compile('>&nbsp;&nbsp;(.*)<')
    pattern2 = re.compile('/control/profile/view/(.*)\' title=')
    pattern3 = re.compile('<span style=\'font-size:12px;\'>(.*)<\/span>')



##### Making the code identify each row, removing the need to numerically quantify the     number of rows in the xmlfile,
##### thus making number of rows dynamic (change as the list grows, required for looping function to work un interupted)

    for row in xmlload1['rows']:
        cell = row["cell"]

##### defining the Keys (key is the area from which data is pulled in the XML) for use in the pattern finding/regex

        user_delimiter = cell['username']
        selection_delimiter = cell['race_horse']


        if strikeratecalc2 < 12 : continue;

##### REMAINDER OF THE REGEX DELMITATIONS
        username_delimiter_results = re.findall(pattern1, user_delimiter)[0]
        userid_delimiter_results = (re.findall(pattern2, user_delimiter)[0])
        user_selection = re.findall(pattern3, selection_delimiter)[0]



##### Printing the results of the code at hand

        print "user id = ",userid_delimiter_results
        print "username = ",username_delimiter_results
        print "user selection = ",user_selection
        print ""





    getData()


    run_periodically(time()+5, time()+1000000, 3000, getData)

これは引用を使用して達成できると通知されました:「user_idをユーザーのデータを含むオブジェクトにマップする辞書。スクレーパーを実行するたびに、ユーザーIDが既に辞書にあるかどうかを確認し、そうであれば対応するオブジェクトを更新します。それ以外の場合は、辞書に新しいエントリを追加してください。」誰かがそのような問題のサンプル コードを提供できれば、コードの解決策として機能するように設計することができます。

よろしくお願いします AEA

4

1 に答える 1

3

すでにリストに出力した s を追跡することは可能user_idですが、最後に中断したリスト内の位置を覚えておく方が簡単な場合があります。つまり、最初の 5 人のユーザーを既に出力している場合です。以前の実行では、次の実行では行番号 6 から開始します。次のようにループに実装できます。

#outside of the run loop
number_output = 0

#in the run lop
for row in xmlload1['rows'][number_output:]:
    number_output += 1
    cell = row["cell"]

これに関する唯一の問題は、ユーザーが入力ファイルで重複する可能性があり、ユーザーの 2 番目のインスタンスを出力したくない場合です。その場合は、 を使用するのが最適setです。次に、ユーザーを出力するたびに、そのユーザー名を次のようにセットに追加します

my_set.update(username)

ユーザーがすでに出力しているかどうかを確認します

if username in my_set:
    ...
于 2013-06-06T14:12:24.057 に答える