• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

雇的辣客

雇的辣客
  • 博客园
  • 联系
  • 管理

公告

View Post

Python爬虫1-数据提取-BeautifulSoup4

https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

Beautiful Soup 4.4.0 文档¶

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

 

Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据,查看文档
https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

1、学会网络爬虫的三大基本步骤:网络请求、数据解析、数据存储。

2、学会突破一些经典的反爬措施比如:IP代理、验证码识别、JS加密等。

3、学会如何编写高灵活性、高可维护性的爬虫程序。

设计】

 

一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:

  1. 网络请求:模拟浏览器的行为从网上抓取数据。
  2. 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。
  3. 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。

那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:

  1. 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。
  2. Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。

通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。

 

  • 第一章:爬虫基础
    •  
      • 爬虫介绍(资料在第一节中下载) 09:24 开始学习
      • 整装待发-爬虫开发工具安装 08:49 开始学习
      • 奠定基础-HTTP协议介绍(上) 11:53 开始学习
      • 奠定基础-HTTP协议介绍(下) 15:04 开始学习
      • 实战演练-用Chrome分析网页 12:50 开始学习
      • 爬虫前奏小结和作业 02:20 开始学习
  • 第二章:爬虫基本库的使用
    •  
      • 网络请求-urllib库基本使用 15:01 开始学习
      • 数据保存方式-urlretrieve 08:14 开始学习
      • 加密与解密-urllib编解码 15:38 开始学习
      • URl地址解析-parse和split使用 07:12 开始学习
      • 网络请求-Requests类 06:21 开始学习
      • 爬虫实战-爬取猫眼票房 08:21 开始学习
      • urllib库-爬虫作业 01:46 开始学习
      • IP禁止克星-ProxyHandler代理设置 12:51 开始学习
      • Cookie原理讲解 06:37 开始学习
      • 爬虫实战-知乎登录模拟实战(1) 10:36 开始学习
      • 爬虫实战-知乎登录模拟实战(2) 17:33 开始学习
      • Cookie加载与保存 10:29 开始学习
      • 简单优雅的requests库 15:30 开始学习
      • requests库-发送POST请求 07:39 开始学习
      • requests库-使用代理 06:23 开始学习
      • requests库-处理cookie 15:12 开始学习
      • requests库-处理不信任的ssl证书 04:56 开始学习
  • 第三章:爬虫数据提取
    •  
      • 爬虫解析库:XPath 11:41 开始学习
      • xpath-谷歌本地安装xpathhelper插件 05:11 开始学习
      • xpath-语法详细讲解 15:09 开始学习
      • xpath-lxml解析HTML代码和文件 09:32 开始学习
      • xpath-在lxml中使用xpath语法 14:21 开始学习
      • 爬虫实战-爬取瓜子二手车网站(1) 17:18 开始学习
      • 爬虫实战-爬取瓜子二手车网站(2) 14:52 开始学习
      • 爬虫实战-爬取瓜子二手车网站(3) 09:03 开始学习
      • xpath-xpath作业 02:52 开始学习
      • bs4-BeautifulSoup4库基本介绍 04:32 开始学习
      • bs4-BeautifulSoup基本使用 05:51 开始学习
      • bs4-四种常见的对象讲解 14:30 开始学习
      • bs4-遍历文档树 07:32 开始学习
      • bs4-find和find_all方法 18:36 开始学习
      • bs4-select方法 17:37 开始学习
      • 爬虫实战-豆瓣Top250爬取实战(1) 13:06 开始学习
      • 爬虫实战-豆瓣Top250爬取实战(2) 18:35 开始学习
      • 爬虫实战-豆瓣Top250爬取实战(3) 09:12 开始学习
      • 爬虫作业-爬取快代理ip 02:14 开始学习
      • 正则表达式-单字符匹配 23:14 开始学习
      • 正则表达式-多字符匹配 09:59 开始学习
      • 正则表达式-正则表达式小案例 13:10 开始学习
      • 正则表达式-开始、结束、贪婪和非贪婪 17:54 开始学习
      • 正则表达式-转义字符和原生字符串 16:29 开始学习
      • 正则表达式-分组 05:24 开始学习
      • 正则表达式-re模块常用函数 15:44 开始学习
      • 爬虫实战-赶集网租房信息爬虫(1) 15:28 开始学习
      • 爬虫实战-赶集网租房信息爬虫(2) 10:03 开始学习
      • 爬虫作业-正则表达式作业要求 01:45 开始学习
  • 第四章:爬虫数据存储
    •  
      • JSON字符串格式介绍 08:39 开始学习
      • Python对象转换成JSON字符串 09:13 开始学习
      • JSON字符串转换成Python对象 07:17 开始学习
      • CSV处理-读取CSV文件的两种方式 07:20 开始学习
      • CSV处理-写入CSV文件的两种方式 10:03 开始学习
      • Excel处理-打开Excel和获取Sheet 10:10 开始学习
      • Excel处理-Cell相关的操作 12:30 开始学习
      • Excel处理-Cell常用数据类型 06:12 开始学习
      • Excel处理-将数据写入Excel文件 12:48 开始学习
      • Excel处理-编辑Excel文件 20:55 开始学习
      • MySQL数据库-软件安装和包安装 11:54 开始学习
      • MySQL数据库-数据库连接操作 15:57 开始学习
      • MySQL数据库-数据库插入操作 09:47 开始学习
      • MySQL数据库-数据库查找操作 04:54 开始学习
      • MySQL数据库-数据库删除操作 02:34 开始学习
      • MySQL数据库-数据库的更新操作 07:32 开始学习
      • MySQL数据库-数据库操作总结 08:46 开始学习
  • 第五章:多线程爬虫实践
    •  
      • 多线程介绍与threading基本使用 12:30 开始学习
      • 使用Thread类创建多线程 13:12 开始学习
      • 多线程共享全局变量的问题 13:36 开始学习
      • Lock版生产者和消费者模式(1) 14:29 开始学习
      • Lock版生产者和消费者模式(2) 08:23 开始学习
      • Condition版本的生产者和消费者模式 19:05 开始学习
      • 线程安全的队列Queue 18:29 开始学习
      • 高速下载王者荣耀高清壁纸(1) 18:45 开始学习
      • 高速下载王者荣耀高清壁纸(2) 16:09 开始学习
      • 高速下载王者荣耀高清壁纸(3) 14:10 开始学习
      • 高速下载王者荣耀高清壁纸(4) 20:23 开始学习
      • 高速下载王者荣耀高清壁纸(5) 05:32 开始学习
      • GIL理解和正确的利用GIL 10:38 开始学习
      • GIL和Lock的关系 05:51 开始学习
      • 多线程爬虫作业要求 02:24 开始学习
      • 动态网页爬虫方案介绍 12:30 开始学习
      • selenium和chromedriver基本使用 07:53 开始学习
      • selenium关闭页面和浏览器 04:58 开始学习
      • selenium定位元素 14:13 开始学习
      • selenium表单元素操作 21:48 开始学习
      • selenium的行为链 13:46 开始学习
      • selenium操作cookie 11:23 开始学习
      • selenium的隐式等待和显式等待 15:58 开始学习
      • selenium打开和切换窗口 10:39 开始学习
      • selenium设置代理IP 07:48 开始学习
      • selenium补充 12:07 开始学习
      • 实战-12306抢票项目演示 05:34 开始学习
      • 实战-登录功能实现 20:45 开始学习
      • 实战-填充站点所对应的代号 20:46 开始学习
      • 实战-查找余票 07:24 开始学习
      • selenium实战-解析列车信息(1) 19:16 开始学习
      • selenium实战-解析列车信息(2) 07:49 开始学习
      • selenium实战-确认乘客和席位 20:53 开始学习
      • selenium实战-最终提交订单 18:12 开始学习
  • 第六章:反爬虫攻防实战
    •  
      • 实战-JS解密实战项目(1) 07:18 开始学习
      • 实战-JS解密实战项目(2) 15:36 开始学习
      • 实战-JS解密实战项目(3) 10:12 开始学习
      • 验证码识别-云打码平台介绍 14:11 开始学习
      • 验证码识别-云打码识别验证码 06:44 开始学习
      • 实战-目标网站分析 10:22 开始学习
      • 实战-目标网站登录页面参数获取 12:35 开始学习
      • 实战-下载验证码图片 14:12 开始学习
      • 字体反爬-字体反爬原理分析 10:18 开始学习
      • 字体反爬-字体解析 13:48 开始学习
      • 58同城字体反爬(1) 21:20 开始学习
      • 58同城字体反爬(2) 25:23 开始学习
      • 课程总结和实习僧爬虫作业介绍 11:37 开始学习
  • 第七章:Scrapy分布式爬虫实践

Python爬虫-数据提取-BeautifulSoup4

  • Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能
  • 它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序
  • Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

常用数据提取工具的比较

  • 1.正则:很快,不好用,不需要安装
    https://blog.csdn.net/qq_40147863/article/details/82181151
  • 2.lxml:比较快,使用简单,需要安装
    https://blog.csdn.net/qq_40147863/article/details/82192119
  • 3.BeautifulSoup4(建议):慢,使用简单,需要安装

BeautifulSoup4 的安装

  • 【PyCharm】>【file】>【settings】>【Project Interpreter】>【+】 >【BeautifulSoup4】>【install】
  • 具体操作截图:
    这里写图片描述这里写图片描述这里写图片描述

BeautifulSoup 的简单使用案例

  • 代码27bs.py文件:https://xpwi.github.io/py/py%E7%88%AC%E8%99%AB/py27bs.py
# BeautifulSoup 的使用案例
from urllib import request
from bs4 import BeautifulSoup

url = 'http://www.baidu.com/'

rsp = request.urlopen(url)
content = rsp.read()

soup = BeautifulSoup(content, 'lxml')

# bs 自动解码
content = soup.prettify()
print(content)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

运行结果

这里写图片描述

BeautifulSoup 四大对象

  • 1.Tag
  • 2.NavigableString
  • 3.BeautifulSoup
  • 4.Comment

(1)Tag

  • 对应HTML中的标签
  • 可以通过soup.tag_name(例如:soup.head;soup.link )
  • tag 的属性:
    • name :例:soup.meta.name(对应下面案例代码)
    • attrs :例:soup.meta.attrs
    • attrs[‘属性名’]:例:soup.meta.attrs[‘content’]
  • 案例代码27bs2.py文件:https://xpwi.github.io/py/py%E7%88%AC%E8%99%AB/py27bs2.py
# BeautifulSoup 的使用案例

from urllib import request
from bs4 import BeautifulSoup

url = 'http://www.baidu.com/'

rsp = request.urlopen(url)
content = rsp.read()

soup = BeautifulSoup(content, 'lxml')

# bs 自动解码
content = soup.prettify()

# 虽然原文中有多个 meta 但是使用 soup.meta 只会打印出以第一个
print("soup.meta:\n", soup.meta)
print("=="*12)
print("soup.meta.name:\n",soup.meta.name)
print("=="*12)
print("soup.meta.attrs:\n",soup.meta.attrs)
print("=="*12)
print("soup.meta.attrs['content']:\n",soup.meta.attrs['content'])

# 当然我们也可以对获取到的数据进行修改
soup.meta.attrs['content'] = 'hahahahaha'
print("=="*5, "修改后","=="*5)
print("soup.meta.attrs['content']:\n",soup.meta.attrs['content'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

运行结果

这里写图片描述
这里结果我们看到,只有一个 meta 标签,而源文档有多个,不是出错,而是这里使用 soup.meta 这种方式,只会打印出以第一个,也就是说数据提取时,1次匹配成功即退出
怎样打印多个 meta 标签呢?使用遍历的方式,具体代码写在下一篇

(2)NavigableString

  • 对应内容值

(3)BeautifulSoup

  • 表示的是一个文档的内容,大部分可以把它当做 tag 对象
  • 不常用

(4)Comment

  • 特殊类型的 NavigableString 对象
  • 对其输出,则内容不包括注释符号

 

 

 

 

 

 

爬虫网络请求方式:urllib(模块), requests(库), scrapy, pyspider(框架)
爬虫数据提取方式:正则表达式, bs4, lxml, xpath, css

 

测试HTML代码:

首先导入

from bs4 import BeautifulSoup

序列化HTML代码

# 参数1:序列化的html源代码字符串,将其序列化成一个文档树对象。
# 参数2:将采用 lxml 这个解析库来序列化 html 源代码
html = BeautifulSoup(open('index.html', encoding='utf-8'), 'lxml')

开始查找标签和属性

获得HTML的title和a标签

print(html.title)
print(html.a)

获取一个标签的所有(或一个)属性

#示例标签a: {'href': '/', 'id': 'result_logo', 'onmousedown': "return c({'fm':'tab','tab':'logo'})"}
print(html.a.attrs)
print(html.a.get('id'))

获取多个标签,需要遍历文档树

print(html.head.contents)
# print(html.head.contents)是list_iterator object

for ch in html.head.children:
     print(ch)


查找后代(desceants)标签

# descendants(后代)
print(html.head.descendants)

获取标签内所有文本,包含子标签:get_text()

print(html.select('.two')[0].get_text())

根据标签名查找一组元素:find_all()

res = html.find_all('a')
print(res)

查找一个元素:find()

find(name, attrs, recursive, text, **wargs)    # recursive 递归的,循环的

 

这些参数相当于过滤器一样可以进行筛选处理。不同的参数过滤可以应用到以下情况:

  • 查找标签,基于name参数
  • 查找文本,基于text参数
  • 基于正则表达式的查找
  • 查找标签的属性,基于attrs参数
  • 基于函数的查找
#可以传递任何标签的名字来查找到它第一次出现的地方。找到后,find函数返回一个BeautifulSoup的标签对象。
producer_entries = soup.find('ul')
print(type(producer_entries))
输出结果: <class 'bs4.element.Tag'>
#直接字符串的话,查找的是标签。如果想要查找文本的话,则需要用到text参数。如下所示:
producer_string = soup.find(text = 'plants')
print(plants_string)

 

 

select支持所有的CSS选择器语法:select()

res = html.select('.one')[0]
print(res.get_text())
print(res.get('class'))

res = html.select('.two')[0]
print(res)
print('----',res.next_sibling)
#next_sibling:下一个兄弟标签



posted on 2020-09-01 10:05  雇的辣客  阅读(334)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3