使用Python实现一个简单的Web爬虫(含完整代码)

前天 8阅读

随着互联网的发展,网络数据变得越来越丰富。从网页中提取有用信息的需求也日益增长。Web爬虫(Web Crawler) 是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析、价格监控、舆情分析等领域。

本文将介绍如何使用 Python 编写一个简单的 Web 爬虫,并展示完整的可运行代码。我们将使用 requests 库发送 HTTP 请求,使用 BeautifulSoup 解析 HTML 页面,并将结果保存到本地文件中。


环境准备

在开始编写爬虫之前,请确保你已经安装了以下 Python 库:

pip install requests beautifulsoup4 lxml
requests:用于发起 HTTP 请求。beautifulsoup4:用于解析 HTML 文档。lxml:作为 BeautifulSoup 的解析器,速度快且功能强大。

项目目标

我们将创建一个简单的爬虫,其功能如下:

抓取指定网站(例如:https://example.com)的所有超链接。过滤掉重复链接和外部链接。将抓取到的链接保存到本地文本文件中。

技术实现

4.1 导入必要的库

import requestsfrom bs4 import BeautifulSoupfrom urllib.parse import urljoin, urlparseimport time
urljoin:用于拼接相对 URL。urlparse:用于解析 URL 结构,判断是否为同域名。time:添加请求间隔,防止请求过快被封 IP。

4.2 定义辅助函数

判断是否是同一域名

def is_valid_url(url, base_netloc):    parsed = urlparse(url)    return parsed.netloc == base_netloc or not parsed.netloc

此函数判断当前链接是否属于目标网站,防止爬虫跳转到其他网站。


4.3 实现爬虫主逻辑

def crawl_website(start_url, max_pages=50):    visited = set()    to_visit = [start_url]    all_links = []    # 获取基础域名    base_netloc = urlparse(start_url).netloc    while to_visit and len(visited) < max_pages:        current_url = to_visit.pop(0)        if current_url in visited:            continue        try:            print(f"正在爬取: {current_url}")            response = requests.get(current_url, timeout=10)            response.raise_for_status()            visited.add(current_url)            soup = BeautifulSoup(response.text, 'lxml')            # 提取所有 a 标签中的 href            for link in soup.find_all('a', href=True):                href = link['href']                full_url = urljoin(current_url, href)                if is_valid_url(full_url, base_netloc) and full_url not in visited and full_url not in to_visit:                    to_visit.append(full_url)                    all_links.append(full_url)            # 每次请求后暂停一秒,避免对服务器造成过大压力            time.sleep(1)        except Exception as e:            print(f"爬取失败: {current_url}, 错误: {e}")    return all_links

4.4 保存结果到文件

def save_links_to_file(links, filename='links.txt'):    with open(filename, 'w', encoding='utf-8') as f:        for link in links:            f.write(link + '\n')    print(f"已保存 {len(links)} 条链接到 {filename}")

4.5 主程序入口

if __name__ == '__main__':    start_url = input("请输入要爬取的网址(例如 https://example.com):").strip()    if not start_url.startswith(('http://', 'https://')):        start_url = 'https://' + start_url    links = crawl_website(start_url)    save_links_to_file(links)

完整代码汇总

以下是本项目的完整代码:

import requestsfrom bs4 import BeautifulSoupfrom urllib.parse import urljoin, urlparseimport timedef is_valid_url(url, base_netloc):    parsed = urlparse(url)    return parsed.netloc == base_netloc or not parsed.netlocdef crawl_website(start_url, max_pages=50):    visited = set()    to_visit = [start_url]    all_links = []    base_netloc = urlparse(start_url).netloc    while to_visit and len(visited) < max_pages:        current_url = to_visit.pop(0)        if current_url in visited:            continue        try:            print(f"正在爬取: {current_url}")            response = requests.get(current_url, timeout=10)            response.raise_for_status()            visited.add(current_url)            soup = BeautifulSoup(response.text, 'lxml')            for link in soup.find_all('a', href=True):                href = link['href']                full_url = urljoin(current_url, href)                if is_valid_url(full_url, base_netloc) and full_url not in visited and full_url not in to_visit:                    to_visit.append(full_url)                    all_links.append(full_url)            time.sleep(1)        except Exception as e:            print(f"爬取失败: {current_url}, 错误: {e}")    return all_linksdef save_links_to_file(links, filename='links.txt'):    with open(filename, 'w', encoding='utf-8') as f:        for link in links:            f.write(link + '\n')    print(f"已保存 {len(links)} 条链接到 {filename}")if __name__ == '__main__':    start_url = input("请输入要爬取的网址(例如 https://example.com):").strip()    if not start_url.startswith(('http://', 'https://')):        start_url = 'https://' + start_url    links = crawl_website(start_url)    save_links_to_file(links)

注意事项与法律声明

虽然爬虫是一个强大的工具,但在使用时应注意以下几点:

遵守网站的 robots.txt 文件:许多网站都提供了 robots.txt 文件,规定哪些页面可以被抓取。设置合理的请求频率:不要频繁访问,以免给服务器带来压力。尊重隐私和版权:未经授权不得抓取受保护的内容。使用 User-Agent:模拟浏览器访问,避免被识别为爬虫。

后续改进方向

支持多线程/异步爬取:提高效率,加快抓取速度。加入去重机制:使用数据库或布隆过滤器防止重复抓取。异常处理优化:增加代理切换、重试机制等。数据存储扩展:将数据保存为 CSV、JSON 或数据库格式。

通过本文,我们学习了如何使用 Python 编写一个简单的 Web 爬虫,并实现了从网页中提取链接的基本功能。这个项目虽然简单,但为深入学习网络爬虫打下了良好的基础。

如果你希望进一步拓展爬虫功能,如提取特定内容、进行大规模数据采集或构建分布式爬虫系统,欢迎继续关注后续文章!


📌 字数统计:约 1600 字
📌 适用人群:有一定 Python 基础的技术爱好者或开发者
📌 用途建议:可用于教学演示、个人项目开发、数据采集入门等场景

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第33038名访客 今日有26篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!