power bi爬取豆瓣电影网页数据的步骤
时间: 2025-07-08 07:19:57 浏览: 2
<think>我们使用PowerBI爬取网页数据主要依赖PowerQuery功能。根据用户需求,目标网站是豆瓣电影(如https://movie.douban.com/)。由于豆瓣电影网页结构可能包含JavaScript动态加载内容,直接通过Web.Contents获取可能无法拿到完整数据(若返回HTML不包含所需数据,则需考虑其他方法)。但我们将尝试常规步骤,并提供应对动态内容的解决方案。###方法1:直接爬取静态HTML(适用于数据在初始HTML中)####步骤1:分析URL结构以豆瓣电影Top250为例(URL:https://movie.douban.com/top250),其数据在表格中,通过查看网页源代码确认所需数据是否在静态HTML中(通常翻页URL为?start=0,?start=25等)。####步骤2:获取单页数据1.在PowerBIDesktop中:选择“获取数据”→“Web”。2.输入URL:`https://movie.douban.com/top250?start=0`。3.点击确定,等待导航器出现。通常豆瓣电影的数据在表格中,选择包含电影信息的表格(如Table0)。4.点击“转换数据”进入PowerQuery编辑器,进行数据清洗:-删除无关列。-修正数据类型(如评分转为小数,评价人数转为整数)。-处理中文乱码(豆瓣一般使用UTF-8,无需特殊处理)。-重命名列(如“影片名称”、“评分”)。5.点击“关闭并应用”加载数据。####步骤3:批量爬取多页由于Top250共10页,每页25条,我们创建页码列表生成URL:1.创建页码表:选择“输入数据”,创建一列名为“页码”,值从0到225(步长25):|页码||----||0||25||...||225|2.添加自定义列生成URL:`="https://movie.douban.com/top250?start="&Text.From([页码])`3.添加自定义函数调用网页(此步骤可能因动态内容失败):-添加列→自定义列:`=Web.Contents([URL])`-可能收到隐私级别警告,选择“公用”。4.展开数据:点击新列右侧图标→选择“使用表头”,然后选择包含电影信息的表格(与单页相同)。5.合并多页数据:展开后,每页数据成为单独行,再展开具体列(如片名、评分等)。>注意:如果步骤4中获取HTML失败或无法解析表格,说明数据可能是动态加载(引用[1]提到Requests获取HTML,但PowerQuery等同于简单Requests)。此时需考虑方法2。###方法2:处理动态内容(需Python支持)当豆瓣电影数据通过JavaScript动态加载时,PowerBI可结合Python脚本爬取(需安装Python环境)。####步骤1:使用Python爬取数据(模拟动态请求)1.编写Python爬虫脚本:```pythonimportrequestsfrombs4importBeautifulSoupimportpandasaspddefscrape_douban_top250(page_start):headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/58.0.3029.110Safari/537.3'}url=f"https://movie.douban.com/top250?start={page_start}"response=requests.get(url,headers=headers)soup=BeautifulSoup(response.text,'html.parser')items=soup.select('.item')data=[]foriteminitems:title=item.select_one('.title').textrating=item.select_one('.rating_num').textdata.append({'title':title,'rating':rating})returnpd.DataFrame(data)#示例:爬取第一页df=scrape_douban_top250(0)```注:实际需添加异常处理、多页爬取逻辑。####步骤2:在PowerBI中调用Python脚本1.在PowerQuery中选择“获取数据”→“Python脚本”。2.粘贴完整爬取代码(包括多页循环),例如:```pythonimportpandasaspdall_data=pd.DataFrame()forstartinrange(0,250,25):page_data=scrape_douban_top250(start)all_data=pd.concat([all_data,page_data])```输出`all_data`到PowerBI。3.点击“确定”,PowerBI执行Python代码并导入数据。###注意事项1.**反爬机制**:豆瓣可能对频繁请求封IP,建议在代码中添加延时(如`time.sleep(5)`)。同时设置合理请求头(User-Agent)[^1]。2.**数据清洗**:在PowerQuery中完成(如拆分列、处理空值)[^4]。3.**刷新限制**:定时刷新时,豆瓣可能阻止脚本执行,建议使用PowerBIGateway进行本地刷新。###总结-若数据在静态HTML中:直接用PowerQuery爬取,方法1高效。-若需处理动态内容:通过Python脚本(使用Requests+BeautifulSoup)导入PowerBI。###示例问题(由用户可能提出)§§相关问题§§1.如何解决PowerQuery爬取时出现的Web.Contents错误?2.豆瓣电影的反爬机制有哪些?如何规避?3.PowerBI中调用Python脚本的环境配置步骤是什么?</think>
### Power BI 爬取豆瓣电影数据的详细步骤教程
以下是基于豆瓣电影网页结构(以 Top250 榜单为例)的具体操作流程,结合引用[1][2]中提到的爬虫原理和Power Query特性实现:
#### 步骤1: 分析URL结构
豆瓣电影Top250的分页URL规律为:
`https://movie.douban.com/top250?start={起始位置}`
其中起始位置按每页25条递增:
- 第1页:`?start=0`
- 第2页:`?start=25`
- ...
- 第10页:`?start=225`(总250条)
*需注意反爬机制,建议降低请求频率*[^1]
#### 步骤2: 创建分页URL列表
1. 在Power BI新建空白查询:
```powerquery
// 生成分页URL列表
let
PageCount = 10,
StartPoints = List.Generate(()=>0, each _ < PageCount*25, each _+25),
URLs = List.Transform(StartPoints, each "https://movie.douban.com/top250?start=" & Text.From(_))
in
URLs
```
#### 步骤3: 建立网页抓取函数
```powerquery
// 创建抓取函数
(tbl as table) =>
let
// 提取HTML内容
Source = Web.BrowserContents(tbl[URL]{0}),
// 解析HTML表格(豆瓣使用CSS选择器)
Data = Html.Table(
Source,
{
{"排名", ".hd span:nth-child(1)"}, // 排名
{"电影名称", ".title:first-child"}, // 主名称
{"别名", ".other"}, // 别名
{"评分", ".rating_num"}, // 评分
{"评价人数", ".star span:nth-child(4)"}, // 评价人数
{"简介", ".inq"} // 短评
},
[RowSelector=".item"] // 每部电影的容器
)
in
Data
```
> *注:使用`Web.BrowserContents`而非`Web.Contents`可解决JS动态加载问题[^1]*
#### 步骤4: 批量抓取数据
1. 将URL列表转为表:`右键URL列表 → 转换为表`
2. 调用自定义函数:
- 新建列 → 选择`调用自定义函数`
- 选择步骤3创建的函数
- 设置隐私级别为**公用**
#### 步骤5: 数据清洗(关键步骤)
处理豆瓣数据常见问题[^4]:
```powerquery
// 清洗数据示例
= Table.TransformColumns(
#"调用的函数",
{
{"评分", each Number.FromText(_, "zh-CN")}, // 转数值
{"评价人数", each Text.BeforeDelimiter(_, "人") → 转整数},
{"别名", each Text.Replace(_, "\n", "")} // 移除换行
}
)
```
#### 步骤6: 加载与可视化
1. 完成清洗后:`主页 → 关闭并应用`
2. 可视化建议:
- 评分分布直方图(10分制)
- 评价人数Top10条形图
- 电影名称词云
### ⚠️ 关键注意事项
1. **反爬规避**:
- 添加延时:在自定义函数开头插入 `= Function.InvokeAfter(()=>..., #duration(0,0,3,0))` 设置3秒间隔
- 伪装UA:在`Web.BrowserContents`添加Headers参数
```powerquery
Web.BrowserContents(url, [Headers=[#"User-Agent"="Mozilla/5.0"]])
```
2. **动态内容处理**:
- 若遇JS渲染内容,启用Power Query的**JavaScript渲染**选项(文件 → 选项 → 全局 → 脚本渲染)
- 复杂场景可结合Python脚本(引用[2])
3. **数据刷新设置**:
- 文件 → 选项 → 数据源设置
- 勾选“允许后台刷新”和“失败时重试”
- 设置日级刷新避免封IP
### 备选方案:Python脚本整合
当遇到复杂反爬时(如引用[3]案例),通过Python脚本预处理:
1. Power BI获取数据 → Python脚本
2. 输入爬虫代码:
```python
# powerbi_run.py
import requests
from bs4 import BeautifulSoup
import pandas as pd
def scrape_douban(start):
headers = {'User-Agent': 'Mozilla/5.0'}
url = f'https://movie.douban.com/top250?start={start}'
soup = BeautifulSoup(requests.get(url, headers=headers).text, 'html.parser')
# ...解析逻辑...
return pd.DataFrame(data) # 返回DataFrame对象
```
> *注:Power BI会自动将返回的DataFrame转为表结构[^1][^2]*
### 最终结果示例
| 排名 | 电影名称 | 评分 | 评价人数 | 简介 |
|------|----------------|------|----------|-------------------|
| 1 | 肖申克的救赎 | 9.7 | 285万 | 希望让人自由... |
| 2 | 霸王别姬 | 9.6 | 198万 | 风华绝代... |
阅读全文
相关推荐















