网页中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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线