在本篇文章中,我们将介绍一个网页爬取和资源下载器的Python代码,通过这个程序可以自动爬取指定网页上的HTML、CSS、图片和JavaScript等资源,并保存到本地目录中。让我们来逐步解析每个方法的功能和用法。
首先,我们需要安装一些必要的库,包括os
、requests
、BeautifulSoup
以及urllib.parse
。这些库将帮助我们实现网页爬取和资源下载的功能。
import os
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
下面这个函数download_file
的作用是从给定的URL下载文件到指定目录中。它会检查响应状态码,如果下载成功则保存文件,否则会打印下载失败的消息。
def download_file(session, file_url, save_dir):
try:
response = session.get(file_url, stream=True)
if response.status_code == 200:
os.makedirs(save_dir, exist_ok=True)
file_name = os.path.basename(urlparse(file_url).path)
save_path = os.path.join(save_dir, file_name)
with open(save_path, 'wb') as file:
for chunk in response.iter_content(1024):
file.write(chunk)
print(f"Downloaded: {save_path}")
else:
print(f"Failed to download: {file_url} (status code: {response.status_code})")
except Exception as e:
print(f"Error downloading {file_url}: {e}")
接着是scrape_page
函数,这个函数负责爬取页面并下载该页面上的所有资源,包括HTML、CSS、图片和JavaScript文件。它会解析页面URL,创建保存HTML文件的目录,保存HTML文件,下载CSS、图片和JS文件,并将这些资源保存到相应目录中。
def scrape_page(session, page_url):
response = session.get(page_url)
soup = BeautifulSoup(response.text, 'html.parser')
parsed_url = urlparse(page_url)
save_dir = os.path.join(base_dir, parsed_url.netloc, os.path.dirname(parsed_url.path).lstrip('/'))
os.makedirs(save_dir, exist_ok=True)
page_name = "index.html" if parsed_url.path == "/" else os.path.basename(parsed_url.path)
page_path = os.path.join(save_dir, page_name)
with open(page_path, 'w', encoding='utf-8') as file:
file.write(soup.prettify())
print(f"Saved HTML: {page_path}")
# 下载CSS文件
for css in soup.find_all('link', rel='stylesheet'):
try:
css_url = urljoin(page_url, css['href'])
css_dir = os.path.join(base_dir, parsed_url.netloc, os.path.dirname(urlparse(css_url).path).lstrip('/'))
download_file(session, css_url, css_dir)
except Exception as e:
print(f"Failed to download CSS: {css_url}. Error: {e}")
# 下载图片文件
for img in soup.find_all('img'):
try:
img_url = urljoin(page_url, img['src'])
img_dir = os.path.join(base_dir, parsed_url.netloc, os.path.dirname(urlparse(img_url).path).lstrip('/'))
download_file(session, img_url, img_dir)
except Exception as e:
print(f"Failed to download image: {img_url}. Error: {e}")
# 下载JS文件
for script in soup.find_all('script', src=True):
try:
js_url = urljoin(page_url, script['src'])
js_dir = os.path.join(base_dir, parsed_url.netloc, os.path.dirname(urlparse(js_url).path).lstrip('/'))
download_file(session, js_url, js_dir)
except Exception as e:
print(f"Failed to download JS: {js_url}. Error: {e}")
最后,在主程序中,我们设置了用户代理头,并指定了要爬取的页面链接列表page_urls
。然后遍历每个页面链接,将其完整URL与基本URL拼接后调用scrape_page
函数进行页面爬取和资源下载。
if __name__ == "__main__":
with requests.Session() as session:
session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
})
page_urls = [
"Relative_URL_1",
"Relative_URL_2",
# Add more page URLs as needed
]
for relative_url in page_urls:
full_url = urljoin(base_url, relative_url)
scrape_page(session, full_url)
通过以上介绍,您可以使用这个Python程序来快速爬取指定网页上的各类资源,并保存到本地,方便进行进一步的分析和处理。
本站主要用于日常笔记的记录和生活日志。本站不保证所有内容信息可靠!(大多数文章属于搬运!)如有版权问题,请联系我立即删除:“abcdsjx@126.com”。
QQ: 1164453243
邮箱: abcdsjx@126.com