Python爬虫1-数据提取-BeautifulSoup4 - shuzihua

python

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框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。

 

  • 第一章:爬虫基础

  • 第二章:爬虫基本库的使用

  • 第三章:爬虫数据提取

  • 第四章:爬虫数据存储

  • 第五章:多线程爬虫实践

  • 第六章:反爬虫攻防实战

  • 第七章: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:下一个兄弟标签



以上是 Python爬虫1-数据提取-BeautifulSoup4 - shuzihua 的全部内容, 来源链接: utcz.com/z/388039.html

回到顶部