用新数据更新数据框



我正在抓取数据,我需要每次都保存它,以避免丢失我已经做过的事情。我的代码类似于这样:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd
from random import randrange
def crawl(df):
chrome_options = webdriver.ChromeOptions()
my_list1=[]
my_list2=[]

# Server info

query=df['Source'].unique().tolist() 
driver=webdriver.Chrome('path',chrome_options=chrome_options) 
driver.maximize_window()
for x in query:

response=driver.get('link_to_scrape/'+x)
try:

wait = WebDriverWait(driver, 30)
time.sleep(randrange(5))
driver.execute_script("window.scrollTo(0, 1000)")

# Get data to append in my_list1
my1 = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[text()='Trustscore']/../following-sibling::div/descendant::div[@class='icon']"))).text
my_list1.append(my1)

# Get data to append in my_list2
try:
my2 = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[text()='Company data']/../following-sibling::div/descendant::b[text()='Alexa rank']/../following-sibling::div"))).text
my_list2.append(my2)
except: 
my_list2.append("Data not available")

except: 
print("n!!! ERROR !!!")
break

# Create dataframe
dict = {'Source': query, 'List 1': my_list1, 'List 2': my_list2} 
df=pd.DataFrame.from_dict(dict)
driver.quit()

return df

目前,代码有一些弱点,我需要通过在关闭查询中每个元素的会话之前保存数据来修复。假设df['Source']: x1,x2,x3,x4,x5中有5个元素

当我运行我的代码时,x1被保存,但是当代码使用x2运行时,我得到错误:ValueError:数组必须都是相同的长度,并且进程停止。我想修复这个问题如下:

  • 对于df['Source']中每个唯一元素,打开chrome,提取数据,将数据保存为df,然后关闭chrome窗口;
  • 在提交新请求前等待15秒;
  • 提交一个新的请求:为df['Source']中的第二个元素打开chrome,提取数据,将数据保存在先前使用的相同df中(对于元素x1),关闭chrome。
  • 等等,直到所有元素都在新的df中。

为了保存提取的数据,我需要在每一步更新df,而不是在最后,也就是说,当抓取为列表中的所有项目提取数据时。我的代码没有这样做:它在最后创建了df,所以每次我得到一个错误,我就失去了我的工作。最后,我应该有一个5行的数据帧(不包括标题),提取数据(或错误消息,如果它运行异常)。您能否为我提供一些帮助,以了解打开/关闭chrome的正确方法,并在每次迭代时使用新数据保存/更新数据框架?如果你需要更多的信息,请告诉我。

在for循环之前创建一个字典,然后用列表项更新它,并从中创建数据帧

frame_dict = {}
for x in query:
response=driver.get('link_to_scrape/'+x)
... 
Some codes here
...
except: 
my_list2.append("Data not available")
frame_dict.update({'Source': x, 'List 1': my_list1, 'List 2': my_list2})

frame_dict dataframe

df=pd.DataFrame.from_dict(frame_dict)

最新更新