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

时间:2019-04-30 19:57:45

标签: python web-scraping

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

1 个答案:

答案 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)