我正在尝试编写脚本,在其中检查名称的特定页面。在我继续总结问题之前。该页面轻弹-意味着一旦您转到该页面即可列出您的名字。您执行的下一个刷新页面将返回空名称列表,而下一个刷新页面将再次列出您的名称。 (这是我要尝试做的进一步的想法),但是我创建了一个自己的脚本,作为用户,我们可以更轻松地对其进行测试。
我没有创建请求,而是创建了一个txt文件来更轻松地运行程序
我要尝试的操作如下:
我想制作一个脚本,以便它在每个循环中打开txt,它会检查列表中是否有名称,然后只打印一次。如果没有名称,那么我想创建一个计数器来检查名称是否真正为空,这意味着在这种情况下,我想创建一种计数器来确认该名称,并声明该名称中没有名称。清单。这意味着在txt文件打开5次之后,该行的开头5个之后的列表中没有任何名称。那么我们可以将其声明为实际上是空的。
如果计数器已确认其为空,那么我们将循环运行直到找到名称并再次打印它,然后再从前重新开始。
我尝试过的是,我认为编码时会出现一些小问题,可能会使我感到困惑或使自己过于复杂。
count = 0
last_names = []
names_checker = False
while True:
with open('./test.txt') as f:
new_product_values = json.load(f)
# {'name': 'Random names', 'url': 'www.stackoverflow.com', 'names': []}
if names_checker == False:
if not new_product_values['sizes']:
count += 1
time.sleep(1)
if count == 5:
names_checker = True
count = 0
logger.success('Declare value as No names')
else:
names_checker = True
elif names_checker == True:
while True:
if new_product_values['names'] != last_names:
print("NEW NAMES!")
print(new_product_values['names'])
last_names = new_product_values['names']
logger.status(last_names)
names_checker = False
break
else:
logger.warn("Nothing found - sleep 1")
time.sleep(1)
text file:
{'name': 'Random names', 'url': 'www.stackoverflow.com', 'names': []}
在这种情况下,我的预期结果是:
如果列表中没有名称,则在计数器中添加一个名称,如果下一个循环仍继续为我们提供空名称,则在计数器中添加另一个名称,直到它到达计数器5,然后又到达计数器5。我希望它声明为空列表。每当它为空时,我们都想循环直到找到名称。找到名称后,我们要声明列表不为空,然后打印一次名称,然后从计数器重新开始。
答案 0 :(得分:0)
首先,将您正在做的事情分成简单的步骤
+--------------------------+
+-----------> |Get the data from the page| <-----------------+
| +-------------+------------+ |
| | |
| v |
| |
| +-------------------------------------------+ |
| |Get the data into a nice format (e.g. list)| |
| +------------------+------------------------+ +------+
| | | |
| | +--------+ |
| +--+ | |
| | | +-------------+
| v | |wait for data|
| | +-------------+
| +--------------------------+ |
| |Do we actually have data? | | ^
| +------+-----+-------------+ |flick |no data
| | | | |
+-+------+ | | +-------------------+-----------------+-----+
|do stuff| <----+ +----> |Is this a flick or is there really no data?|
+--------+ yes no +-------------------------------------------+
您会看到轻弹,最终没有数据返回以获取数据。
如果将上述步骤放入python代码中,则会得到以下内容:
def get_data(): # just an example
r = requests.get(...)
r.raise_for_status()
return r
def parse_data(text, _old=[]): # list is mutable => preserved across calls
"""convert the text to a list of names. If there are no (new) names, the list is empty"""
...
if new_data not in _old:
_old.append(new_data)
return new_data
else:
return []
def delay_get_data(by):
time.sleep(by)
return get_data()
def do_stuff(names):
...
这样拆分不仅可以使您的代码得到更好的阅读和理解,而且还为您提供了一种更改各个部分的方法:如果您想使用本地文件/数据进行测试,则只需重写{{1 }},而无需进行其他任何更改:
get_data
按照上面的结构图,您现在可以先获取数据,检查数据并执行正确的操作,然后再通过在 one 循环中查看def get_data():
if random.randint(0, 1): # simulate flicks
return empty_sample_data
else:
return random.choice(sample_data_with_names)
来获取新数据:
counter
如果新数据很快进入并且您确定不需要那么多日志记录,则也可以只取出WAIT_TIME = 10*60
counter = 0
data = parse_data(get_data())
while True:
if data:
counter = 0
do_stuff(data)
print("I got the data and did {stuff}. Now I'll wait and repeat with new names")
data = parse_data(delay_get_data(WAIT_TIME))
else:
counter += 1
if counter >= 5: # cosmic rays may increase ``counter`` by 2 instead of 1
counter = 0
print("I think there actually isn't any data. I'll wait and then check again")
data = parse_data(delay_get_data(WAIT_TIME))
else:
data = parse_data(get_data()) # no delay, it was probably just a flick
。