使用 Python 构建一个简易的 Web 爬虫

今天 3阅读

在当今数据驱动的时代,网络爬虫(Web Crawler)已经成为获取互联网信息的重要工具。本文将介绍如何使用 Python 编写一个简单的网页爬虫,并解析 HTML 内容以提取有用的数据。我们将使用 requestsBeautifulSoup 两个主要库来实现这个功能。

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

目录[+]

您是本站第31017名访客 今日有28篇新文章

微信号复制成功

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