怎样抓取网页数据(在Python中解析网页的方法有哪些?-八维教育)

优采云 发布时间: 2022-04-07 13:05

  怎样抓取网页数据(在Python中解析网页的方法有哪些?-八维教育)

  第 1 步:尝试请求

  先进入b站首页,点击排行榜,复制链接

  现在启动 Jupyter notebook 并运行以下代码

  *敏*感*词*请求

  网址='#39;

  res=requests.get('url')

  打印(res.status_code)

  #200

  在上面的代码中,我们完成了以下三件事

  *敏*感*词*

  要求

  采用

  get方法构造请求

  采用

  status_code 获取网页的状态码

  可以看到返回值为200,表示服务器响应正常,表示可以继续。

  第 2 步:解析页面

  上一步中,我们通过requests向网站请求数据后,成功获得了一个收录服务器资源的Response对象。现在我们可以使用 .text 查看它的内容

  

  可以看到返回的是一个字符串,里面收录了我们需要的热榜视频数据,但是直接从字符串中提取内容复杂且效率低下,所以我们需要对其进行解析,将字符串转换成网页结构数据,即使查找 HTML 标记及其属性和内容变得容易。

  Python解析网页的方式有很多种,可以使用正则表达式,也可以使用BeautifulSoup、pyquery或lxml,本文将基于BeautifulSoup进行讲解。

  Beautiful Soup 是一个第三方库,可以从 HTML 或 XML 文件中提取数据。安装也很简单,使用 pip install bs4 安装即可,我们用一个简单的例子来说明它是如何工作的

  frombs4import 美汤

  page=requests.get(url)

  汤=BeautifulSoup(page.content,'html.parser')

  标题=汤.标题.文本

  打印(标题)

  #热门视频排行榜-bilibili (゜-゜)つロ干杯~-bilibili

  在上面的代码中,我们通过bs4中的BeautifulSoup类将上一步得到的html格式字符串转换成BeautifulSoup对象。注意使用的时候需要指定一个解析器,这里使用的是html.parser。

  然后您可以获得结构元素之一及其属性。比如使用soup.title.text获取页面标题,也可以使用soup.body、soup.p等获取任何需要的元素。

  第三步:提取内容

  上面两步中,我们使用requests向网页请求数据,使用bs4解析页面。现在我们来到最关键的一步:如何从解析后的页面中提取出需要的内容。

  在 Beautiful Soup 中,我们可以使用 find/find_all 来定位元素,但我更习惯使用 CSS 选择器 .select,因为可以像使用 CSS 选择元素一样沿着 DOM 树向下移动。

  现在我们用代码来说明如何从解析后的页面中提取B站热榜的数据。首先,我们需要找到存储数据的标签,在列表页面按F12按照下面的说明找到

  

  可以看到每个视频信息都包裹在class="rank-item"的li标签下,那么代码可以这样写

  all_products=[]

  products=soup.select('li.rank-item')

  对于productinproducts:

  rank=product.select('div.num')[0].text

  name=product.select('>a')[0].text.strip()

  play=product.select('span.data-box')[0].text

  评论=product.select('span.data-box')[1].text

  up=product.select('span.data-box')[2].text

  url=product.select('>a')[0].attrs['href']

  all_products.append({

  “视频排名”:排名,

  “视频名称”:名称,

  “播放音量”:播放,

  “弹幕”:评论,

  “上主要”:上,

  “视频链接”:网址

  })

  在上面的代码中,我们首先使用了soup.select('li.rank-item'),然后返回一个收录每个视频信息的列表,然后遍历每个视频信息,仍然使用CSS选择器来提取我们想要的字段信息存储在开头以字典形式定义的空列表中。

  可以注意到我使用了多种选择方法来提取元素,这也是选择方法的灵活性。有兴趣的读者可以自行进一步研究。

  第 4 步:存储数据

  通过前三步,我们成功使用requests+bs4从网站中提取出需要的数据,最后只需要将数据写入Excel并保存即可。

  如果对pandas不熟悉,可以使用csv模块写,需要注意设置encoding='utf-8-sig',否则会出现中文乱码问题

  导入csv

  键=所有产品[0].keys()

  withopen('B站视频热榜TOP100.csv','w',newline='',encoding='utf-8-sig')asoutput_file:

  dict_writer=csv.DictWriter(output_file,keys)

  dict_writer.writeheader()

  dict_writer.writerows(all_products)

  如果您熟悉 pandas,您可以通过一行代码轻松地将字典转换为 DataFrame

  导入pandasaspd

  键=所有产品[0].keys()

  pd.DataFrame(all_products,columns=keys).to_csv('B站视频热榜TOP100.csv',encoding='utf-8-sig')

  

  概括

  至此,我们已经成功使用Python将b站热门视频列表的数据存储在本地。大多数基于请求的爬虫基本上都遵循以上四个步骤。

  不过,虽然看起来很简单,但在实景中的每一步都不是那么容易的。从请求数据来看,目标网站有各种形式的反爬取、加密,以及后期分析、提取甚至存储数据。需要进一步探索和学习。

  本文选择B站视频热榜,正是因为够简单。希望通过这个案例大家可以了解爬虫的基本流程,最后附上完整代码

  *敏*感*词*请求

  frombs4import 美汤

  导入csv

  导入pandasaspd

  网址='#39;

  page=requests.get(url)

  汤=BeautifulSoup(page.content,'html.parser')

  all_products=[]

  products=soup.select('li.rank-item')

  对于productinproducts:

  rank=product.select('div.num')[0].text

  name=product.select('>a')[0].text.strip()

  play=product.select('span.data-box')[0].text

  评论=product.select('span.data-box')[1].text

  up=product.select('span.data-box')[2].text

  url=product.select('>a')[0].attrs['href']

  all_products.append({

  “视频排名”:排名,

  “视频名称”:名称,

  “播放音量”:播放,

  “弹幕”:评论,

  “上主要”:上,

  “视频链接”:网址

  })

  键=所有产品[0].keys()

  withopen('B站视频热榜TOP100.csv','w',newline='',encoding='utf-8-sig')asoutput_file:

  dict_writer=csv.DictWriter(output_file,keys)

  dict_writer.writeheader()

  dict_writer.writerows(all_products)

  ###使用熊猫写入数据

  pd.DataFrame(all_products,columns=keys).to_csv('B站视频热榜TOP100.csv',encoding='utf-8-sig')

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线