我正在抓取数据,每次我都需要保存数据,以避免丢失我已经做过的事情。我的代码类似于以下内容:
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;
df['Source']请求:为df['Source']中的第二个元素打开铬,提取数据,将数据保存在以前使用的df中,关闭chrom.
f 213中为止。
为了保存提取的数据,我需要在每一步更新df,而不是在结束时,即当爬行已经提取列表中所有项的数据时。我的代码没有这样做:它在结束时创建了df,所以每次我得到错误时,我都会丢失我的工作。最后,我应该有一个5行(不包括标头)的数据框架,并提取数据(如果它运行异常,则会有错误消息)。您能为我提供一些帮助,以了解打开/关闭chrome和在每次迭代时使用新数据保存/更新数据帧的正确方法吗?如果你需要更多的信息,告诉我。
发布于 2021-09-05 16:10:26
在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转换为数据格式
df=pd.DataFrame.from_dict(frame_dict)https://stackoverflow.com/questions/69064371
复制相似问题