【问题标题】:Iterate next row each time a while loop starts每次 while 循环开始时迭代下一行
【发布时间】:2019-06-18 16:37:57
【问题描述】:

我有一个 csv 文件,其中包含从流式 API 抓取的链接。我在 while 循环中有一个脚本(称为“selenium.py”),其中 selenium webdriver 对每个 url 进行屏幕截图,然后将其保存在文件中。每分钟都会向 csv 文件添加更多行。

我的代码是:

df = pd.read_csv('screenshot.csv', header = 0, usecols= ['url','guid'])
while True: 
   i = 0  
   for i, row in df.iterrows():
       r = driver.get(row['url'])
       driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
       i += 1
       for n in range(2):
           file_name = str(row['guid'])
           fn_1 = "date_stamp{n:0>5}.png".format(n = n)
           date_stamp= str(datetime.datetime.now()).split('.')[0]
           fn_1 = date_stamp
           fn=driver.save_screenshot(file_name+ ' ' + date_stamp + '.png')
           sourcepath='/Users/user/'
           destinationpath = '/Users/user/Screen'
           sourcefiles = os.listdir(sourcepath)
           filename= file_name+ ' ' + date_stamp + '.png'

我需要什么:

我是这样在jupyter中运行脚本的:

while True: %run "Selenium.py" time.sleep(60.0 - ((time.time() - starttime) % 60.0))

我需要每次脚本运行时,迭代增加一行。

有什么帮助吗?

【问题讨论】:

  • selenium.py 不是一个好的脚本名称,因为它共享模块的名称
  • 好的,但这是一个例子
  • 您的意思是您希望每 60 秒运行一次的截屏脚本仅截取 csv 中在这 60 秒内添加的 URL 的屏幕截图,而无需再次重做它处理的 csv 记录早点?
  • @godfryd 这可以是一个选项,但最初的问题是循环开始时它如何读取文件+流添加的附加行。

标签: python python-3.x pandas selenium-webdriver while-loop


【解决方案1】:

将您在Selenium.py 中所做的一切捆绑到一个函数中,例如:

def take_screenshot():
    # your code here

然后在 jupyter 中导入您的文件:

import Selenium

然后你可以调用函数:

while True:
    Selenium.take_screenshot()
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))

【讨论】:

  • 在 for 循环中使用 %run 似乎是一种反模式。尽管该 take_screenshot 函数可能至少将 url 作为参数,但您将需要一个循环。
【解决方案2】:

首先,您需要将 csv 的读取移动到 while 循环中:

df = pd.read_csv('screenshot.csv', header = 0, usecols= ['url','guid'])
while True: 

变成

while True: 
    df = pd.read_csv('screenshot.csv', header = 0, usecols= ['url','guid'])

现在,您可以跟踪已读取的行数并在读取 csv 时使用 skiprows。即

i = 1
while True:
  df = pd.read_csv('screenshot.csv', header=0, usecols=['url','guid'], skiprows=lambda x: x in range(1, i))
  for i, row in df.iterrows():
    r = driver.get(row['url'])
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    i += 1

也就是说,你最好不要在这里使用 pandas,而是逐行读取每一行,或者将其存储到一个 dict 中,或者将它存储到一个集合中的“seen”guid/urls 中(这样你就不用获取它们两次)。

【讨论】:

  • 对不起,如果我的问题很愚蠢:你的意思是除了在 while True 循环下移动 df = pd.read_csv('screenshot.csv', header = 0, usecols= ['url','guid'], skiprows=i) 之外,代码将保持不变?
  • @J.Doe 是的,在 i=0 之后。 (我认为这是正确的调用方式,可能是你必须做skiprows=lambda x: x in range(1, i)并启动i = 1,我没有测试过)
  • 你的意思是这样的:while True: df = pd.read_csv('screenshot.csv', header = 0, usecols= ['url','guid'], skiprows=i) i = 0 skiprows=lambda x: x in range(1, i) for i, row in df.iterrows(): r = driver.get(row['url']) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") i +=1
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2012-05-28
  • 2023-01-15
  • 2014-10-11
  • 1970-01-01
相关资源
最近更新 更多