使用 Python 将多个 URL 中的不同变量抓取到一个 CSV 文件中
Scraping different variables from multiple URLs into one single CSV file using Python
我正在尝试将多个 URL 中的数据抓取到一个 csv 文件中,这让我抓狂 ;)
我知道这可能是一个常见问题,我不是第一个尝试这样做的人,但不知何故我无法在我的代码中应用其他人的解决方案,因为他们不是真的 "soup.find"- 像我一样一个接一个地处理多个变量。我的方法可能太基础了。
所以我开始抓取多个东西(让我们选择 name、job 和 worksfor) 从单个 URL 使用 BeautifulSoup 并将其导出到 csv 文件并且工作正常:
import urllib.request
import requests
from bs4 import BeautifulSoup
from urllib.request import urlopen
import csv
url = "https://www.someurl.com/person.asp?personId=123456789"
page = urllib.request.urlopen(url)
soup = BeautifulSoup(page, "lxml")
name = soup.find("h1", {"class": "name"}).get_text()
job = soup.find("span", {"itemprop": "jobTitle"}).get_text()
worksfor = soup.find("a", {"itemprop": "worksFor"}).get_text()
with open('output.csv', 'w') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow([name, job, worksfor])
然后我在查找如何打开保存在文件 (urls.csv) 中的多个 URL 并抓取(此处:打印)例如名称。这将提供三个名称。
with open('urls.csv') as inf:
urls = (line.strip() for line in inf)
for url in urls:
site = urlopen(url)
soup = BeautifulSoup(site, "lxml")
for name in soup.find("h1", {"class": "name"}):
print(name)
这也很好用,但我很难尝试将这两种方法结合到代码中,以便为我的每个 URL urls.csv
非常感谢您的任何建议
@SuperStew:是的,其中一种至少不会产生任何错误的方法如下:
with open('urls.csv') as inf:
urls = (line.strip() for line in inf)
for url in urls:
site = urlopen(url)
soup = BeautifulSoup(site, "lxml")
for name in soup.find("h1", {"class": "name"}):
with open('output.csv', 'w') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow([name, job, worksfor])
这总是以 CSV 结束,只包含我列表中最后 URL 中的那些变量,可能会覆盖所有其他变量。
好的,所以这看起来不错,除了最后一部分,您将结果写入 csv。您基本上为每个 url 重写了 csv,这意味着当您的代码完成后,只有最后一个会保留下来。为避免这种情况,您可以在 append
模式下打开您的 csv 文件,而不是 write
。只是一个小改动
with open('output.csv', 'a') as csvfile:
我正在尝试将多个 URL 中的数据抓取到一个 csv 文件中,这让我抓狂 ;)
我知道这可能是一个常见问题,我不是第一个尝试这样做的人,但不知何故我无法在我的代码中应用其他人的解决方案,因为他们不是真的 "soup.find"- 像我一样一个接一个地处理多个变量。我的方法可能太基础了。
所以我开始抓取多个东西(让我们选择 name、job 和 worksfor) 从单个 URL 使用 BeautifulSoup 并将其导出到 csv 文件并且工作正常:
import urllib.request
import requests
from bs4 import BeautifulSoup
from urllib.request import urlopen
import csv
url = "https://www.someurl.com/person.asp?personId=123456789"
page = urllib.request.urlopen(url)
soup = BeautifulSoup(page, "lxml")
name = soup.find("h1", {"class": "name"}).get_text()
job = soup.find("span", {"itemprop": "jobTitle"}).get_text()
worksfor = soup.find("a", {"itemprop": "worksFor"}).get_text()
with open('output.csv', 'w') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow([name, job, worksfor])
然后我在查找如何打开保存在文件 (urls.csv) 中的多个 URL 并抓取(此处:打印)例如名称。这将提供三个名称。
with open('urls.csv') as inf:
urls = (line.strip() for line in inf)
for url in urls:
site = urlopen(url)
soup = BeautifulSoup(site, "lxml")
for name in soup.find("h1", {"class": "name"}):
print(name)
这也很好用,但我很难尝试将这两种方法结合到代码中,以便为我的每个 URL urls.csv
非常感谢您的任何建议
@SuperStew:是的,其中一种至少不会产生任何错误的方法如下:
with open('urls.csv') as inf:
urls = (line.strip() for line in inf)
for url in urls:
site = urlopen(url)
soup = BeautifulSoup(site, "lxml")
for name in soup.find("h1", {"class": "name"}):
with open('output.csv', 'w') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=';', quoting=csv.QUOTE_MINIMAL)
spamwriter.writerow([name, job, worksfor])
这总是以 CSV 结束,只包含我列表中最后 URL 中的那些变量,可能会覆盖所有其他变量。
好的,所以这看起来不错,除了最后一部分,您将结果写入 csv。您基本上为每个 url 重写了 csv,这意味着当您的代码完成后,只有最后一个会保留下来。为避免这种情况,您可以在 append
模式下打开您的 csv 文件,而不是 write
。只是一个小改动
with open('output.csv', 'a') as csvfile: