在抓取 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 行放在循环之外,以便它只运行一次,如上面的人所建议的那样。这应该是解决您问题的最简单方法。
所以,我正在上 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 行放在循环之外,以便它只运行一次,如上面的人所建议的那样。这应该是解决您问题的最简单方法。