在抓取 Python3 时仅将 headers 写入 CSV 一次

Writing headers to CSV only once whilst scraping Python3

所以,我正在上 Python3 的课程,在抓取部分,我们有一个作业要抓取 http://quotes.toscrape.com/ 网站并获取文本、作者和 link所有引用的作者简介,包括“下一页”中的引用。我已经这样做了,但是在我转到每个新页面之后,我得到一行空行,我最初设想为 headers.

import requests
from bs4 import BeautifulSoup
import csv
from time import sleep

base_url = "http://quotes.toscrape.com"
url = "/page/1"

f = open("scraping_project_final.csv", "w")
f.truncate()
f.close()

while url:

    with open("scraping_project_final.csv", "a") as file:
        csv_writer = csv.writer(file)
        csv_writer.writerow(["text", "name", "url"])

        response = requests.get(f"{base_url}{url}")
        print(f"Scraping {base_url}{url}")
        soup = BeautifulSoup(response.text, "html.parser")
        quotes = soup.find_all(class_="quote")

        for quote in quotes:
            txt = quote.find(class_="text").get_text()
            author = quote.find(class_="author").get_text()
            link = quote.find("a")["href"]
            csv_writer.writerow([txt, author, link])

        next_page = soup.find(class_="next")
        url = next_page.find("a")["href"] if next_page else None
    # sleep(2)

所以,我遇到的问题是初始 writerrow 实际上每次迭代都会创建一个空行,我该如何避免这种情况?我想继续这种方法,如果可能的话不使用 DictReader。我在下面添加了一张图片,即 CSV 输出。可以看到在十行之后,有一行只有:text, names, url.

只打开一次文件,写一次headers,然后在页面上循环。例如:

with open('scraping_project_final.csv', 'w', encoding='utf-8-sig', newline='') as file:
    csv_writer = csv.writer(file)
    csv_writer.writerow(['text', 'name', 'url'])

    while url:

        response = requests.get(f'{base_url}{url}')
        ...

不需要re-open每个页面的文件,也不需要截断文件。

注意 utf-8-sig 是在 Excel 中打开的最佳编码,因为它处理 Unicode 字符,newline='' 被记录为打开 csv.writer 文件的模式。

在你的 while 循环之前设置一个标志然后写 headers 只有你之前没有。然后翻旗

# ...
first_page = False
while url:
    with open("scraping_project_final.csv", "a") as file:
        csv_writer = csv.writer(file)
        if first_page:
            csv_writer.writerow(["text", "name", "url"])
            first_page = False
        # ...

调查使用词典编写器来编辑您的 csv。不要手动写 headers。 https://docs.python.org/3/library/csv.html(向下滚动到 dict writer)

这是因为 dict writer 依赖于 header 到 append/edit 你的 csv 值,你需要做的就是告诉 dict writer 你的 header 是什么以及它如有必要,将写 headers。

显然,如果您只是循环,请将 write header 行放在循环之外,以便它只运行一次,如上面的人所建议的那样。这应该是解决您问题的最简单方法。