使用Python实现一个简单的Web爬虫(含完整代码)
随着互联网的发展,网络数据变得越来越丰富。从网页中提取有用信息的需求也日益增长。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