如何在网站上循环.txt文件链接,抓取并存储在一个可延展的csv / excel文件中

问题描述 投票:0回答:1

我希望能够从特定网站(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文件格式中。

python web-scraping
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.