簡體   English   中英

使用 python 從 url 抓取和下載 excel 文件

[英]Scraping and downloading excel files using python from url

第一個問題,請放輕松。

我正在嘗試使用 python 從網站以編程方式下載所有 excel 文件。 我對網絡抓取很陌生,所以我的代碼不能滿足要求 - 我已經放在下面了。 當我運行腳本時,我沒有看到任何 output 並且我想要下載的文件也找不到了。

不知道我做錯了什么,或者我是否運行錯誤的腳本。 我通過 anaconda 導航器運行它,使用腳本導航到目錄,然后使用以下命令運行它:

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)

您有最常見的問題 - 瀏覽器使用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,您必須獲取文件夾的鏈接,然后請求他們獲取文件列表。

簡化您的案例的是文件夾和文件都具有 class 屬性 DocumentBrowserNameLink。

您可以通過 function 找到它們

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM