使用Python进行Web数据抓取:一个完整的实战教程

07-02 14阅读

在当今大数据时代,网络上的信息量极其庞大。对于开发者和研究人员来说,如何从这些海量的网页数据中提取有用的信息成为一个重要的技能。本文将介绍如何使用 Python 进行 Web 数据抓取(Web Scraping),并提供一个完整的代码示例来演示整个流程。

什么是 Web 数据抓取?

Web 数据抓取是一种从网站自动提取结构化数据的技术。它广泛应用于价格监控、市场分析、新闻聚合、学术研究等多个领域。通过编写程序模拟浏览器访问网页,并解析网页内容,可以高效地获取所需的数据。

技术栈介绍

我们将使用以下 Python 库来完成本次任务:

Requests:用于发送 HTTP 请求获取网页内容。BeautifulSoup4:用于解析 HTML 文档并提取数据。Pandas:用于处理和保存抓取到的数据。CSV / JSON:用于保存抓取结果。

你可以通过 pip 安装这些库:

pip install requests beautifulsoup4 pandas

实战项目:抓取豆瓣电影 Top250 的标题与评分

我们以豆瓣电影 Top250 页面为例(https://movie.douban.com/top250),抓取每部电影的名称、评分和链接。

3.1 分析网页结构

首先,我们需要查看目标网页的 HTML 结构,找到包含电影标题和评分的标签。

打开豆瓣电影 Top250 页面,右键点击任意一部电影的标题 → 检查元素,可以看到类似如下结构:

<div class="item">    <div class="pic">        <em class="">1</em>        <a href="https://www.ippay.cn/zb_system/cmd.php?act=ajax&hk_url=aHR0cHM6Ly9tb3ZpZS5kb3ViYW4uY29tL3N1YmplY3QvMTI5MjA1Mi8=" rel="nofollow">            <img width="95" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg" class="">        </a>    </div>    <div class="info">        <div class="hd">            <a href="https://www.ippay.cn/zb_system/cmd.php?act=ajax&hk_url=aHR0cHM6Ly9tb3ZpZS5kb3ViYW4uY29tL3N1YmplY3QvMTI5MjA1Mi8=" rel="nofollow">                <span class="title">肖申克的救赎</span>                <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>            </a>        </div>        <div class="bd">            <p class="">                导演: 弗兰克·德拉邦特 Frank Darabont&nbsp;&nbsp;&nbsp;主演: 蒂姆·罗宾斯 Tim Robbins / 摩根·弗里曼 Morgan Freeman                <br>                1994&nbsp;/&nbsp;美国&nbsp;/&nbsp;剧情            </p>            <div class="star">                <span class="rating_num" property="v:average">9.3</span>                <span property="v:best" content="10.0"></span>                <span>265492人评价</span>            </div>        </div>    </div></div>

从中可以看出,每个电影条目都包含在一个 div 标签中,class 为 item。标题位于 span.title 中,评分位于 span.rating_num 中,链接位于 a 标签的 href 属性中。

3.2 编写爬虫代码

下面是完整的 Python 爬虫代码:

import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport timedef fetch_page(url):    headers = {        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36'    }    response = requests.get(url, headers=headers)    if response.status_code == 200:        return response.text    else:        print(f"请求失败,状态码:{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        link = item.find('a')['href']        movies.append({            'title': title,            'rating': rating,            'link': link        })    return moviesdef save_to_csv(data, filename='douban_top250.csv'):    df = pd.DataFrame(data)    df.to_csv(filename, index=False, encoding='utf-8-sig')    print(f"数据已保存至 {filename}")def main():    base_url = 'https://movie.douban.com/top250?start='    all_movies = []    for i in range(0, 250, 25):  # 每页25条,共10页        url = base_url + str(i)        print(f"正在抓取第 {i//25 + 1} 页:{url}")        html = fetch_page(url)        if html:            movies = parse_html(html)            all_movies.extend(movies)            time.sleep(2)  # 避免请求过于频繁    save_to_csv(all_movies)if __name__ == '__main__':    main()

3.3 代码说明

fetch_page(url):使用 requests 发送 GET 请求,带上 User-Agent 头防止被反爬虫机制拦截。parse_html(html):使用 BeautifulSoup 解析 HTML 内容,提取每部电影的标题、评分和链接。save_to_csv(data):使用 Pandas 将抓取到的数据保存为 CSV 文件。main():主函数控制分页抓取逻辑,循环抓取 10 页内容,并在每次请求后暂停 2 秒,避免对服务器造成过大压力。

运行结果

运行以上脚本后,将在当前目录生成一个名为 douban_top250.csv 的文件,内容如下:

titleratinglink
肖申克的救赎9.3https://movie.douban.com/subject/1292052/
霸王别姬9.6https://movie.douban.com/subject/1291546/
.........

你也可以将其扩展为保存为 JSON 格式或数据库存储。

注意事项与合法性提醒

尊重 robots.txt:在爬取任何网站前,请先查看其 robots.txt 文件(如 https://movie.douban.com/robots.txt)了解是否允许爬取。设置合理频率:不要过于频繁地请求同一个网站,建议设置延迟(如 time.sleep())。伪装 User-Agent:有些网站会检测请求头,使用合法的浏览器 UA 可以减少被封 IP 的风险。遵守法律法规:请确保你的行为不违反相关法律法规,尤其涉及用户隐私和商业数据时。

进阶方向

使用 Selenium 抓取动态页面:当目标网页是通过 JavaScript 动态加载时,可以使用 Selenium 或 Playwright。使用 Scrapy 构建专业爬虫:Scrapy 是一个功能强大的爬虫框架,适合构建大型爬虫项目。数据清洗与可视化:结合 Pandas 和 Matplotlib/Seaborn 对抓取的数据进行分析和可视化。部署定时任务:使用 Cron Job 或 Airflow 实现定期自动抓取更新数据。

总结

本文介绍了使用 Python 进行 Web 数据抓取的基本方法,并通过一个实际案例展示了如何从豆瓣电影 Top250 页面中提取电影信息。通过 Requests 和 BeautifulSoup 的组合,我们可以快速实现小型爬虫项目。同时,也强调了合法性和反爬虫策略的重要性。

如果你希望进一步深入学习 Web 数据抓取技术,建议学习 Scrapy 框架、Selenium 自动化测试以及数据清洗与分析等相关知识。


完整源码 GitHub 地址(示例)
https://github.com/example/web-scraping-demo(请替换为你自己的仓库地址)

如需更多帮助,欢迎留言交流!

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

目录[+]

您是本站第197名访客 今日有14篇新文章

微信号复制成功

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