第一个问题,别对我太苛刻。
我试图以编程方式下载所有的excel文件从一个网站使用python。我是一个很新的网页抓取,所以我的代码可能不符合标准-我已经在下面。当我运行脚本时,我没有看到任何输出,并且我想要下载的文件无处可寻。
不确定我有什么错,或者如果我运行脚本错误。我通过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)
你有最常见的问题-浏览器使用JavaScript
添加链接到页面(当你点击年),但requests
/beatifulsoup
不能运行JavaScript
。
你必须在浏览器中关闭JavaScript
,并检查是否可以在浏览器中获得没有JavaScript
的文件。然后你必须看看它是如何工作的,并在代码中做同样的事情。但有时可能需要Selenium来控制可以运行JavaScript
的真实浏览器。
当我在没有JavaScript
的浏览器中打开URL时,我看不到任何.xls
。我必须点击year
,然后它加载不同的URL与.xls
。
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
编辑:
Code搜索子页面并使用它们下载文件。
它每年下载到一个单独的文件夹。
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)