我希望能够从特定网站(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文件格式中。
如果你想保存它们,但是必须一次做一些(也许你没有足够的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)