我希望能够从特定网站(https://physionet.org/challenge/2012/set-a/)及其类似的子目录中抓取数据,同时还要获取每个文本文件并将其添加到巨大的csv或excel文件中,这样我就可以能够在一处查看所有数据。
我已经部署了类似于this article的以下代码,但是我的代码基本上下载了页面上的所有文本文件,并将它们存储在我的工作目录中。而且,说实话,它只需要很长时间就可以运行。
import requests
import urllib.request
import time
from bs4 import BeautifulSoup
url = 'https://physionet.org/challenge/2012/set-a/'
response = requests.get(url)
response # 200 indicates that it works...
soup = BeautifulSoup(response.text, "html.parser")
for i in range(5,len(soup.findAll('a'))+1): #'a' tags are for links
one_a_tag = soup.findAll('a')[i]
link = one_a_tag['href']
download_url = 'https://physionet.org/challenge/2012/set-a/'+ link
urllib.request.urlretrieve(download_url,'./'+link[link.find('/132539.txt')+1:])
time.sleep(1) #pause the code for a sec
实际结果只是一堆文本文件挤满了我的工作目录,但是在for循环停止之前,我想将其放入一种大的csv文件格式。
答案 0 :(得分:0)
如果您想保存它们,但是一次只能保存一次(也许您没有足够的RAM来一次容纳所有内容),那么我只需将这些文件附加到一个主文件中即可一个。
import requests
from bs4 import BeautifulSoup
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
output_file = 'outputfile.txt'
url = 'https://physionet.org/challenge/2012/set-a/'
# Download and find all the links. Check the last 4 characters to verify it's one
# of the files we are looking for
response = requests.get(url, verify=False)
soup = BeautifulSoup(response.text, "html.parser")
links = [a['href'] for a in soup.find_all('a') if a['href'][-4:] == '.txt']
# Clear the current file
with open(output_file, 'w'):
pass
# Iterate through all the links
for href in links:
response = requests.get("{}{}".format(url, href), verify=False)
if response:
# Open up the output_file in append mode so we can just write to the one file
with open(output_file, 'a') as f:
f.write(response.text)
print(len(response.text.split('\n')))
一个缺点是您将拥有每个文本文件的标题。但是您可以将f.write()
更改为以下内容,并使其不包含任何标题
f.write("\n".join(response.text.split('\n')[1:]))
如果确实具有可用的RAM,则可以使用列表推导方式读入所有文件,然后使用pandas.concat()
将它们放在一个巨型数据框中。然后使用df.to_csv()
将其导出到文件中。
df = pd.concat([pd.read_csv("{}{}".format(url, href)) for href in links])
df.to_csv(output_file)