使用 Python 构建一个简易的 Web 爬虫
在当今数据驱动的时代,网络爬虫(Web Crawler)已经成为获取互联网信息的重要工具。本文将介绍如何使用 Python 编写一个简单的网页爬虫,并解析 HTML 内容以提取有用的数据。我们将使用 requests
和 BeautifulSoup
两个主要库来实现这个功能。
1. 环境准备
首先,我们需要安装必要的 Python 库:
pip install requests beautifulsoup4
requests
: 用于发送 HTTP 请求,获取网页内容。beautifulsoup4
: 用于解析 HTML 文档,提取所需数据。2. 基本原理简介
一个简单的爬虫通常包括以下几个步骤:
发起请求:向目标网站发送 HTTP 请求。获取响应:接收服务器返回的网页内容(通常是 HTML)。解析内容:使用解析器提取感兴趣的数据。存储数据:将提取的数据保存到本地文件或数据库中。3. 实战:抓取豆瓣电影 Top250 的标题和评分
我们以 豆瓣电影 Top250 为例,编写一个爬虫来抓取每部电影的名称和评分。
3.1 发送请求并获取页面内容
import requestsdef fetch_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: print(f"Failed to fetch page: {url}, status code: {response.status_code}") return None
3.2 解析 HTML 并提取数据
from bs4 import BeautifulSoupdef parse_html(html): soup = BeautifulSoup(html, 'html.parser') movies = [] for item in soup.find_all('div', class_='item'): title = item.find('span', class_='title').text rating = item.find('span', class_='rating_num').text movies.append({ 'title': title, 'rating': rating }) return movies
3.3 分页处理与完整抓取流程
豆瓣电影 Top250 是分页展示的,每页显示 25 条记录,共 10 页。我们可以构造所有页面链接并依次抓取。
def get_all_pages(): base_url = "https://movie.douban.com/top250" all_movies = [] for i in range(0, 10): url = f"{base_url}?start={i * 25}" print(f"Fetching page: {url}") html = fetch_page(url) if html: movies = parse_html(html) all_movies.extend(movies) return all_movies
3.4 保存数据到本地文件
import jsondef save_to_file(data, filename='douban_top250.json'): with open(filename, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) print(f"Data saved to {filename}")
3.5 主程序入口
if __name__ == '__main__': all_movies = get_all_pages() save_to_file(all_movies)
4. 完整代码整合
以下是完整的可运行代码:
import requestsfrom bs4 import BeautifulSoupimport jsondef fetch_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: print(f"Failed to fetch page: {url}, status code: {response.status_code}") return Nonedef parse_html(html): soup = BeautifulSoup(html, 'html.parser') movies = [] for item in soup.find_all('div', class_='item'): title = item.find('span', class_='title').text rating = item.find('span', class_='rating_num').text movies.append({ 'title': title, 'rating': rating }) return moviesdef get_all_pages(): base_url = "https://movie.douban.com/top250" all_movies = [] for i in range(0, 10): url = f"{base_url}?start={i * 25}" print(f"Fetching page: {url}") html = fetch_page(url) if html: movies = parse_html(html) all_movies.extend(movies) return all_moviesdef save_to_file(data, filename='douban_top250.json'): with open(filename, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=4) print(f"Data saved to {filename}")if __name__ == '__main__': all_movies = get_all_pages() save_to_file(all_movies)
5. 输出结果示例
运行程序后,会在当前目录下生成一个名为 douban_top250.json
的文件,内容如下(节选):
[ { "title": "肖申克的救赎", "rating": "9.7" }, { "title": "霸王别姬", "rating": "9.6" }, ...]
6. 注意事项与反爬策略应对
User-Agent 设置:模拟浏览器访问,避免被识别为爬虫。请求频率控制:合理设置请求间隔时间,例如使用time.sleep()
避免频繁请求。IP 轮换:如有需要,可以使用代理 IP 池。合法性与道德规范:遵守网站的 robots 协议,尊重网站的版权和隐私政策。7. 扩展建议
将数据存入数据库(如 SQLite、MySQL、MongoDB)。添加异常处理机制(如超时重试)。支持多线程或异步抓取以提高效率。抓取更多字段,如导演、主演、年份等。8.
通过本文的学习,你已经掌握了一个基本的网页爬虫构建方法。Python 提供了强大的库支持,使得开发爬虫变得简单高效。当然,实际应用中还需考虑更多的细节和优化手段。希望你能在此基础上继续深入学习,探索更复杂的网络爬虫技术。
如果你对爬虫进阶、反爬破解、分布式爬虫等内容感兴趣,欢迎继续关注我的后续文章!
免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com