【问题标题】:How to scrape data once a day and write it to csv如何每天抓取一次数据并将其写入 csv
【发布时间】:2021-04-19 20:23:10
【问题描述】:

我是一个菜鸟,我刚开始将网络抓取作为一种爱好。

我想从https://www.fly4free.pl/forum/ 的论坛中抓取数据(帖子总数、主题总数和所有用户数)

photo of which data I want to scrape

看了一些 turotirals 我来到了这个代码:

from bs4 import BeautifulSoup
import requests
import datetime
import csv

source = requests.get('https://www.fly4free.pl/forum/').text
soup = BeautifulSoup(source, 'lxml')

csv_file = open('4fly_forum.csv', 'w')
csv_writer = csv.writer(csv_file)
csv_writer.writerow(['Data i godzina', 'Wszytskich postów', 'Wszytskich tematów', 'Wszytskich użytkowników'])

czas = datetime.datetime.now()
czas = czas.strftime("%Y-%m-%d %H:%M:%S")
print(czas)

dane = soup.find('p', class_='genmed')

posty = dane.find_all('strong')[0].text
print(posty)

tematy = dane.find_all('strong')[1].text
print(tematy)

user = dane.find_all('strong')[2].text
print(user)

print()

csv_writer.writerow([czas, posty, tematy, user])    
csv_file.close()

我不知道如何让它每天运行一次,以及如何每天向文件添加一次数据。抱歉,如果我的问题对你们专业人士来说太幼稚了;),这是我的第一个培训任务。

另外,我的 csv 文件看起来不太好,我希望数据能很好地格式化成列

我们将不胜感激任何帮助和见解。 提前谢谢 德维丘

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    您可以使用 Python 中的 Schedule 库来执行此操作。 首先使用安装它

    pip install schedule
    

    然后您可以修改您的代码以按您选择的时间间隔运行

    import schedule
    import time
    
    def scrape():
        # your web scraping code here
        print('web scraping')
    
    schedule.every().day.at("10:30").do(scrape) # change 10:30 to time of your choice
    
    while True:
        schedule.run_pending()
        time.sleep(1)
    

    这将在每天 10:30 运行网络抓取脚本,您可以轻松地免费托管它以使其持续运行。

    以下是您如何将结果以格式良好的方式保存到 csv 中,并使用字段名称(czas、tematy、posty 和 user)作为列名。

    import csv
    from os import path
    
    # this will avoid appending the headers (fieldnames or column names) everytime the script runs. Headers will be written to csv only once
    file_status = path.isfile('filename.csv') 
    
    with open('filename.csv', 'a+', newline='') as csvfile:
        fieldnames = ['czas', 'posty', 'tematy', 'user']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
        if not file_status:
            writer.writeheader() 
        writer.writerow({'czas': czas, 'posty': posty, 'tematy': tematy, 'user': user})
    
    
    

    【讨论】:

    • 非常感谢,你如何让它在每次运行时在 csv 中创建一个新行。我认为现在它每次只创建一个数据集的新文件。
    • 我在添加后得到了这个:文件“C:\Users\dejvc\Desktop\tutorial\1a.py”,第 36 行 print('web scraping') ^ IndentationError: unindent does not匹配任何外部缩进级别
    • 错误是由于混合了空格和制表符,我已经修复了它
    • 我已经编辑了答案。它将每次以格式良好的方式将数据附加到前一个 csv 文件中。如果对您有帮助,请考虑投票。 :)
    • 非常感谢,我尝试投票,但我必须小代表 ;)
    【解决方案2】:

    我也不是很有经验,但我认为要每天执行一次,您可以使用计算机的任务计划程序。这将每天运行一次您的脚本。也许这个视频可以帮助你使用任务调度器:https://www.youtube.com/watch?v=s_EMsHlDPnE

    【讨论】:

    • 如果您的 csv 因为有空行而看起来不太好,请输入:csv_file = open('4fly_forum.csv', 'w',newline="")
    • 我已经添加了它,但我仍然每次都得到“新文件”,我希望每次运行脚本时都会在 csv 文件中添加一行
    • 要将数据附加到现有文件,请使用 mode='a',即 csv_file = open('4fly_forum.csv', 'a')
    • 如果我对你的理解很好,那么解决方案是csv_file = open('4fly_forum.csv', 'a',newline="")。这会添加新信息来维护旧信息,而不是每次只使用新信息重写整个文件。
    • 谢谢它的工作,但现在它每次都添加列名和数据,如何修复它,所以它将只添加数据
    猜你喜欢
    • 2017-02-10
    • 2019-08-16
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2023-02-21
    • 2015-05-22
    相关资源
    最近更新 更多