有没有办法更新文件而不获取重复值?
Is there a way to update the file and not get duplicate values?
我正在使用 python 抓取网站并将所有数据保存到 .csv 文件中。 (你可以在下面看到我的代码)
该网站每小时更新一次,所以我想用网站前几页上的新条目更新现有文件(有 100 多页)。最好的检查方法可能是使用日期和时间字段检测重复条目。有什么方法可以做到这一点?我一直在想办法,但一直没有成功。
1 将模式附加到前几页的 运行 代码并使用 excel 删除条目? (这里会很奇怪)
2 Pandas 有一个删除重复的选项,但是我很困惑现在我已经带着这个
来到这里了,现在该怎么办
import csv
import re
import datetime
import requests
from bs4 import BeautifulSoup
params = {
"action": "livewire_load_posts",
"school": "",
"round": "",
"status": "",
"orderby": "",
"paged": "",
}
file = open('output.csv', 'w')
writer = csv.writer(file)
writer.writerow(['Date&Time','Status','School'])
for page in range(1, 10):
print("Getting page {}..".format(page))
params["paged"] = page
data = requests.post(url, data=params).json()
soup = BeautifulSoup(data["markup"], "html.parser")
for entry in soup.select(".livewire-entry"):
datime = entry.select_one(".adate")
status = entry.select_one(".status")
name = status.find_next("strong")
datime = datime.get_text(strip=True)
datime = datetime.datetime.strptime(datime, '%B %d, %Y %I:%M%p')
print(
"{:<25} {:<25} {}".format(
status.get_text(strip=True),
name.get_text(strip=True),
datime
)
)
writer.writerow([datime, status.get_text(strip=True), name.get_text(strip=True)]
print("-" * 80)
file.close()
您可以读取现有的 csv 文件并将 'status' 和 'school' 值存储在两个列表中(首先创建),然后根据它们检查新值并在找到时从 for 循环中中断,像这样:
for page in range(1, 10):
...
for entry in soup.select(".livewire-entry"):
datime = entry.select_one(".adate")
status = entry.select_one(".status")
name = status.find_next("strong")
if status in status_list and name in name_lists:
break
...
或者,一旦您将新行附加到 csv 文件并关闭它,您可以 open it in Pandas, drop duplicate rows and save it back to a csv file:
df = pd.read_csv('output.csv')
df = df.drop_duplicates(keep="first", subset=['Status', 'School'])
df.to_csv(path_or_buf='output.csv', index=False)
我正在使用 python 抓取网站并将所有数据保存到 .csv 文件中。 (你可以在下面看到我的代码) 该网站每小时更新一次,所以我想用网站前几页上的新条目更新现有文件(有 100 多页)。最好的检查方法可能是使用日期和时间字段检测重复条目。有什么方法可以做到这一点?我一直在想办法,但一直没有成功。
1 将模式附加到前几页的 运行 代码并使用 excel 删除条目? (这里会很奇怪)
2 Pandas 有一个删除重复的选项,但是我很困惑现在我已经带着这个
来到这里了,现在该怎么办import csv
import re
import datetime
import requests
from bs4 import BeautifulSoup
params = {
"action": "livewire_load_posts",
"school": "",
"round": "",
"status": "",
"orderby": "",
"paged": "",
}
file = open('output.csv', 'w')
writer = csv.writer(file)
writer.writerow(['Date&Time','Status','School'])
for page in range(1, 10):
print("Getting page {}..".format(page))
params["paged"] = page
data = requests.post(url, data=params).json()
soup = BeautifulSoup(data["markup"], "html.parser")
for entry in soup.select(".livewire-entry"):
datime = entry.select_one(".adate")
status = entry.select_one(".status")
name = status.find_next("strong")
datime = datime.get_text(strip=True)
datime = datetime.datetime.strptime(datime, '%B %d, %Y %I:%M%p')
print(
"{:<25} {:<25} {}".format(
status.get_text(strip=True),
name.get_text(strip=True),
datime
)
)
writer.writerow([datime, status.get_text(strip=True), name.get_text(strip=True)]
print("-" * 80)
file.close()
您可以读取现有的 csv 文件并将 'status' 和 'school' 值存储在两个列表中(首先创建),然后根据它们检查新值并在找到时从 for 循环中中断,像这样:
for page in range(1, 10):
...
for entry in soup.select(".livewire-entry"):
datime = entry.select_one(".adate")
status = entry.select_one(".status")
name = status.find_next("strong")
if status in status_list and name in name_lists:
break
...
或者,一旦您将新行附加到 csv 文件并关闭它,您可以 open it in Pandas, drop duplicate rows and save it back to a csv file:
df = pd.read_csv('output.csv')
df = df.drop_duplicates(keep="first", subset=['Status', 'School'])
df.to_csv(path_or_buf='output.csv', index=False)