使用python从url抓取和下载excel文件

2024-09-29 19:33:21 发布

您现在位置:Python中文网/ 问答频道 /正文

第一个问题,所以对我放松点

我正在尝试使用python以编程方式从网站下载所有excel文件。我对网络垃圾很陌生,所以我的代码可能不符合要求——我已经在下面介绍了。当我运行脚本时,我没有看到任何输出,而且我想要下载的文件也找不到

不确定我做错了什么,或者我是否运行了错误的脚本。我正在通过anaconda navigator运行它,使用脚本导航到目录,然后使用以下命令运行它:

python file-scraper.py

这是我脚本的代码。任何帮助或建议都将不胜感激

from bs4 import BeautifulSoup as bs
import requests

DOMAIN = 'https://lfportal.loudoun.gov/LFPortalinternet/'
URL = 'https://lfportal.loudoun.gov/LFPortalinternet/Browse.aspx?startid=213973&row=1&dbid=0'
FILETYPE = '.xls'

def get_soup(url):
    return bs(requests.get(url).text, 'html.parser')

for link in get_soup(URL).find_all('a'):
    file_link = link.get('href')
    if FILETYPE in file_link:
        print(file_link)
        with open(link.text, 'wb') as file:
            response = requests.get(DOMAIN + file_link)
            file.write(response.content)

Tags: 文件代码httpsimport脚本getbsdomain
2条回答

您有一个最常见的问题-浏览器使用JavaScript向页面添加链接(当您单击年份时),但requests/beatifulsoup无法运行JavaScript

您必须关闭浏览器中的JavaScript,并检查是否可以在不使用JavaScript的情况下在浏览器中获取文件。然后你必须看看它是如何工作的,并在代码中做同样的事情。但有时它可能需要Selenium来控制可以运行JavaScript的真实浏览器


当我在浏览器中打开不带JavaScript的URL时,我看不到任何.xls。我必须单击year,然后它用.xls加载不同的URL

2017年:https://lfportal.loudoun.gov/LFPortalinternet/0/fol/213974/Row1.aspx
2018年:https://lfportal.loudoun.gov/LFPortalinternet/0/fol/285051/Row1.aspx
2019年:https://lfportal.loudoun.gov/LFPortalinternet/0/fol/312510/Row1.aspx
2020年:https://lfportal.loudoun.gov/LFPortalinternet/0/fol/384496/Row1.aspx
2021年:https://lfportal.loudoun.gov/LFPortalinternet/0/fol/466963/Row1.aspx

您必须使用beautifulsoup查找这些URL,并使用requests加载它们,然后您应该搜索.xls


编辑:

代码搜索子页面并使用它们下载文件

它每年下载到单独的文件夹

import requests
from bs4 import BeautifulSoup as bs
import os

#  - functions  -

def get_soup(url):
    response = requests.get(url)
    #print(response.status_code)
    #print(response.text)
    html = response.text

    soup = bs(html, 'html.parser')
    #soup = bs(html, 'lxml')
    #soup = bs(html, 'html5lib')

    return soup

#  - main  -

# - data - 

DOMAIN = 'https://lfportal.loudoun.gov/LFPortalinternet/'
URL = 'https://lfportal.loudoun.gov/LFPortalinternet/Browse.aspx?startid=213973&row=1&dbid=0'
FILETYPE = '.xls'

# - code -

soup = get_soup(URL)
for folder_link in soup.find_all('a', {'class': 'DocumentBrowserNameLink'}):
    folder_name = folder_link.get('aria-label').split(' ')[0]
    folder_link = folder_link.get('href')

    print('folder:', folder_name)
    os.makedirs(folder_name, exist_ok=True)
    
    subsoup = get_soup(DOMAIN + folder_link)
    for file_link in subsoup.find_all('a', {'class': 'DocumentBrowserNameLink'}):
        file_name = file_link.get('aria-label')[:-4]  # skip extra `.xls` at the end
        file_link = file_link.get('href')
        
        if file_link.endswith(FILETYPE):
            print('  file:', file_name)
            file_name = os.path.join(folder_name, file_name)
            with open(file_name, 'wb') as file:
                response = requests.get(DOMAIN + file_link)
                file.write(response.content)

顺便说一句:我把它放在GitHub上了furas/python-examples

您的网页只包含文件夹,作为一个人,您必须单击这些文件夹才能获取文件

使用BS,您必须获取文件夹的链接,然后请求它们获取文件列表

简化您的案例的是,文件夹和文件都具有类属性DocumentBrowserNameLink

您可以使用一个函数来查找它们

from bs4 import BeautifulSoup as bs
import requests

DOMAIN = 'https://lfportal.loudoun.gov/LFPortalinternet/'
URL = 'https://lfportal.loudoun.gov/LFPortalinternet/Browse.aspx?startid=213973&row=1&dbid=0'
FILETYPE = '.xls'

def get_soup(url):
    return bs(requests.get(url).text, 'html.parser')

def get_links(page):
    result = page.find_all(class_="DocumentBrowserNameLink")
    return result

page = get_soup(URL)
folder_links = get_links(page)

for link in folder_links:
    page2 = get_soup(DOMAIN + link['href'])
    file_links = get_links(page2)

    for file in file_links:
        filepath = file['href']
        if FILETYPE in filepath:
            print(DOMAIN + filepath)

相关问题 更多 >

    热门问题