使用Python实现网页爬取和资源下载器

花生 可爱的博主

时间: 2024-10-31 阅读: 2 字数:4265

{}
在本篇文章中,我们将介绍一个网页爬取和资源下载器的Python代码,通过这个程序可以自动爬取指定网页上的HTML、CSS、图片和JavaScript等资源,并保存到本地目录中。让我们来逐步解析每个方法的功能和用法。

目录


准备工作

首先,我们需要安装一些必要的库,包括osrequestsBeautifulSoup以及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程序来快速爬取指定网页上的各类资源,并保存到本地,方便进行进一步的分析和处理。

本文章网址:https://www.sjxi.cn/detil/4cfb1ab1cc4f4d79b890b973592e1679
最新评论
当前未登陆哦
登陆后才可评论哦

湘ICP备2021009447号

×

(穷逼博主)在线接单

QQ: 1164453243

邮箱: abcdsjx@126.com

前端项目代做
前后端分离
Python 爬虫脚本
Java 后台开发
各种脚本编写
服务器搭建
个人博客搭建
Web 应用开发
Chrome 插件编写
Bug 修复