首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用新数据更新数据

用新数据更新数据
EN

Stack Overflow用户
提问于 2021-09-05 14:39:50
回答 1查看 107关注 0票数 0

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

代码语言:javascript
复制
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:数组必须都是相同的长度,并且进程停止。我想把这个问题解决如下:

对request;

  • submit中的每个唯一元素,打开铬,提取数据,将数据保存到df中,然后关闭铬窗口;

  • 等待15秒后才提交新的df['Source']请求:为df['Source']中的第二个元素打开铬,提取数据,将数据保存在以前使用的df中,关闭chrom.

  • 等等,直到所有元素都在新df.

f 213中为止。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-05 16:10:26

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

代码语言:javascript
复制
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转换为数据格式

代码语言:javascript
复制
df=pd.DataFrame.from_dict(frame_dict)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69064371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档