【发布时间】:2020-02-18 00:10:14
【问题描述】:
我用 python 编写了一个脚本,它能够从网页中获取不同帖子的标题并将它们写入 csv 文件。由于该站点非常频繁地更新其内容,我喜欢首先将新结果附加到该 csv 文件中,其中已经有可用的旧标题列表。
我试过了:
import csv
import time
import requests
from bs4 import BeautifulSoup
url = "https://stackoverflow.com/questions/tagged/python"
def get_information(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')
for title in soup.select(".summary .question-hyperlink"):
yield title.text
if __name__ == '__main__':
while True:
with open("output.csv","a",newline="") as f:
writer = csv.writer(f)
writer.writerow(['posts'])
for items in get_information(url):
writer.writerow([items])
print(items)
time.sleep(300)
上述脚本在运行两次时可以在旧结果之后追加新结果。
旧数据如下:
A
F
G
T
新数据为W,Q,U。
当我重新运行脚本时,csv 文件应该如下所示:
W
Q
U
A
F
G
T
如何将新结果先附加到包含旧数据的现有 csv 文件中?
【问题讨论】:
-
从您对我的回答的评论来看,您似乎对您的问题有一个更新。您使用什么代码进行插入,如何在定期运行时遇到问题?
-
如果我让脚本运行 5 分钟睡眠 @Prune,将会有很多新的 csv 文件。
-
如何拥有大量新文件?一次最多只能有两个。
-
看答案:最后一步是将新文件移回旧文件名。不再有任何“第二个 csv 文件”。
-
正如建议的那样,如果数据太大,您将不得不将旧数据存储在内存中,或者使用临时的第二个文件。另一种方法是在文件末尾正常写入数据,然后在读取文件时查找最后一个条目开始的位置。但这在这种情况下并不容易或可靠,因为每个条目都有任意大小,因此您必须猜测它的大小,在文件末尾查找它,然后读取并查找,直到找到一个标记。我知道这不是您想要的,但您必须按照答案中的建议进行操作。
标签: python python-3.x csv web-scraping