网页中flash数据抓取( Python中解析网页的一个重要的应用,使用Python爬虫 )
优采云 发布时间: 2022-01-05 17:13网页中flash数据抓取(
Python中解析网页的一个重要的应用,使用Python爬虫
)
爬虫是Python的一个重要应用。使用Python爬虫,我们可以很方便的从网上抓取我们想要的数据。本文将以抓取B站的视频热搜榜数据并存储为例。详细介绍了四个步骤。Python爬虫的基本流程。
步骤1
请求尝试进入b站首页,点击排行榜,复制链接。
1https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3
2
3
1 启动 Jupyter notebook ,并运行以下代码:
2
1import requests
2url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
3res = requests.get('url')
4print(res.status_code)
5#200
6
7
1 在上面的代码中,完成下面三件事:
2
可以看到返回值为200,说明服务器响应正常,可以继续。
第2步
页面解析通过上一步的请求向网站请求数据后,我们成功获取到一个收录服务器资源的Response对象。现在我们可以使用 .text 来查看其内容。
可以看到返回的是一个字符串,里面收录了我们需要的热门视频数据,但是直接从字符串中提取内容比较复杂,效率低下,所以我们需要对其进行解析,将字符串转换成结构化的web页面数据,以便您可以轻松找到 HTML 标签及其属性和内容。Python中解析网页的方法有很多种,可以使用正则表达式,也可以使用BeautifulSoup、pyquery或lxml。本文将基于 BeautifulSoup 进行讲解。Beautiful Soup 是一个第三方库,可以从 HTML 或 XML 文件中提取数据。安装也非常简单。使用 pip install bs4 进行安装。让我们用一个简单的例子来说明它是如何工作的。
1from bs4 import BeautifulSoup
2page = requests.get(url)
3soup = BeautifulSoup(page.content, 'html.parser')
4title = soup.title.text
5print(title)
6# 热门视频排行榜 - 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
7
8
1 在上面的代码中,我们通过bs4中的BeautifulSoup类将上一步得到的html格式字符串转换为一个BeautifulSoup对象,注意在使用时需要制定一个解析器,这里使用的是html.parser。 接着就可以获取其中的某个结构化元素及其属性,比如使用soup.title.text获取页面标题,同样可以使用soup.body、soup.p等获取任意需要的元素。
2
第 3 步
提取内容在上面两步中,我们使用requests向网页请求数据,使用bs4解析页面。现在我们到了最关键的一步:如何从解析后的页面中提取需要的内容。在 Beautiful Soup 中,我们可以使用 find/find_all 来定位元素,但我更习惯使用 CSS 选择器 .select,因为我们可以像使用 CSS 选择元素一样向下访问 DOM 树。下面我们用代码来说明如何从解析后的页面中提取B站的热点列表数据。首先我们需要找到存储数据的标签,在列表页面按F12,按照下图的说明找到。
可以看到每条视频信息都包裹在li标签下,那么代码可以这样写吗?
1all_products = []
2products = soup.select('li.rank-item')
3for product in products:
4 rank = product.select('div.num')[0].text
5 name = product.select('div.info > a')[0].text.strip()
6 play = product.select('span.data-box')[0].text
7 comment = product.select('span.data-box')[1].text
8 up = product.select('span.data-box')[2].text
9 url = product.select('div.info > a')[0].attrs['href']
10 all_products.append({
11 "视频排名":rank,
12 "视频名": name,
13 "播放量": play,
14 "弹幕量": comment,
15 "up主": up,
16 "视频链接": url
17 })
18
19
1 在上面的代码中,我们先使用soup.select('li.rank-item'),此时返回一个list包含每一个视频信息,接着遍历每一个视频信息,依旧使用CSS选择器来提取我们要的字段信息,并以字典的形式存储在开头定义好的空列表中。 可以注意到我用了多种选择方法提取去元素,**这也是select方法的灵活之处**,感兴趣的读者可以进一步自行研究。
2
步骤4
存储数据 经过前面三步,我们成功地使用requests+bs4从网站中提取出需要的数据,最后只需要将数据写入Excel保存即可。如果你对pandas不熟悉,可以使用csv模块来编写。需要注意的是设置了encoding='utf-8-sig',否则会出现中文乱码的问题。
1import csv
2keys = all_products[0].keys()
3with open('B站视频热榜TOP100.csv', 'w', newline='', encoding='utf-8-sig') as output_file:
4 dict_writer = csv.DictWriter(output_file, keys)
5 dict_writer.writeheader()
6 dict_writer.writerows(all_products)
7
8
1 如果你熟悉pandas的话,更是可以轻松将字典转换为DataFrame,一行代码即可完成。
2
1import pandas as pd
2keys = all_products[0].keys()
3pd.DataFrame(all_products,columns=keys).to_csv('B站视频热榜TOP100.csv', encoding='utf-8-sig')
4
结论 至此,我们已经成功地使用Python在本地存储了b站的热门视频列表数据。大多数基于请求的爬虫基本上都是按照以上四个步骤进行的。然而,虽然看起来简单,但在真实场景中的每一步都不是那么容易。从请求数据开始,目标网站有多种形式的反爬和加密,后期解析、提取甚至存储数据的方式也很多。需要进一步探索和学习。
本文选择B站视频热榜是因为足够简单,希望通过这个案例,让大家了解Python爬虫工作的基本流程,最后附上完整的代码?
1import requests
2from bs4 import BeautifulSoup
3import csv
4import pandas as pd
5url = 'https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3'
6page = requests.get(url)
7soup = BeautifulSoup(page.content, 'html.parser')
8all_products = []
9products = soup.select('li.rank-item')
10for product in products:
11 rank = product.select('div.num')[0].text
12 name = product.select('div.info > a')[0].text.strip()
13 play = product.select('span.data-box')[0].text
14 comment = product.select('span.data-box')[1].text
15 up = product.select('span.data-box')[2].text
16 url = product.select('div.info > a')[0].attrs['href']
17 all_products.append({
18 "视频排名":rank,
19 "视频名": name,
20 "播放量": play,
21 "弹幕量": comment,
22 "up主": up,
23 "视频链接": url
24 })
25keys = all_products[0].keys()
26with open('B站视频热榜TOP100.csv', 'w', newline='', encoding='utf-8-sig') as output_file:
27 dict_writer = csv.DictWriter(output_file, keys)
28 dict_writer.writeheader()
29 dict_writer.writerows(all_products)
30### 使用pandas写入数据
31pd.DataFrame(all_products,columns=keys).to_csv('B站视频热榜TOP100.csv', encoding='utf-8-sig')
32
33