网页中flash数据抓取( 【干货】安装bs4全文(一):提取数据示例)

优采云 发布时间: 2022-02-22 19:26

  网页中flash数据抓取(

【干货】安装bs4全文(一):提取数据示例)

  

  内容

  前言

   BeautifulSoup是主要以解析web网页的Python模块,它会提供一些强大的解释器,以解析网页,然后提供一些函数,从页面中提取所需要的数据,目前是Python爬虫中最常用的模块之一。

  安装库

  该库需要在使用前安装。推荐安装bs4,也就是第四版,因为根据官方文档,第三版已经停止更新了。还要安装 lxml 解释器

  pip3 安装 bs4

  pip3 安装 lxml

  导入库

  from bs4 import BeautifulSoup

  解析文档示例

  这是官方文档中的一个示例。我列出了所有常用的功能。实际开发过程中用的不多,了解一下就可以了。

  # 取自《爱丽丝梦游仙境》的一段

html = """

The Dormouse's story

<p class="title" name="dromouse">The Dormouse&#39;s story

  Once upon a time there were three little sisters; and their names were

,

Lacie and

Tillite;

and they lived at the bottom of a well.

  ...

"""

# 解析文档,建立一个BeautifulSoup对象,各种函数都是针对此对象展开,此函数会自动编码为Unicode

soup = BeautifulSoup(html,&#39;lxml&#39;)

</p>

  这个函数有两个参数:

  1、需要解析的文本,可以使字符串,可以使本地文件

2、解释器,这里有"lxml", "lxml-xml", "html.parser", or "html5lib",4种,可以解析绝大多数网页,常用lxml解析

这里有一个坑,如果网页中没有规定编码格式,解释器就不能编码为Unicode,必须先声明一下编码格式,只需要到网页源码中查找编码格式然后做个声明就可以。一般在网页中查找charset关键字。

  # 美化文档,有些网页书写不规范,这个函数会补全标签,使其看起来更规范

print(soup.prettify())

  提取数据示例

  得到文本后,下一步就是提取我们需要的数据。这里使用了三个选择器。

  1、标签选择器(标签选择器)

  # 直接用标签获取标题

print("title: ", soup.title)

# 获取标题文本

print(soup.title.text)

# 获取p标签

print(soup.p)

# 获取head标签

print(soup.head)

# 获取a标签

print(soup.a)

  输出:

  

  标签中最重要的两个属性:名称、属性

  # 使用.name函数获取标签名

print(&#39;标题标签的名字: &#39;, soup.title.name)

# tag的属性用法和字典基本一样,可以用属性名取属性,类似字典的键值对,也可以用.attrs取属性:

print(&#39;a标签中属性为"href"的值: &#39;, soup.a["href"])

# 会返回一个字典,需要何种属性可自行提取

print(&#39;a标签的所有属性: &#39;,soup.a.attrs)

dict1 = soup.a.attrs

# 属性为class的值

print(&#39;属性为class的值: &#39;, dict1[&#39;class&#39;])

  输出:

  

  这里的子孙父兄节点,我感觉用起来忒不顺手,可能是我学的不太彻底,我在这里列出来,大家看看。

  # 返回子节点的列表

print("p的子节点: ", soup.p.contents)

# 返回子节点的*敏*感*词*

print(&#39;a的子节点: &#39;, soup.a.children)

# 返回子孙结点的*敏*感*词*

print("a的子孙结点: ", soup.a.descendants)

# 返回父节点

print("a的父节点: ", soup.a.parent)

# 递归父节点

print("a的递归父节点: ",soup.a.parents)

  输出:

  

  如果上面的标签选择器遇到相同的标签名,比如上面的文档中有多个a标签,那么就不可能选择同一个标签的第二个标签,或者我可能无法操作,如果有欢迎对发现发表评论。

  所以需要一个遍历全文提取数据的选择器: find_all( name , attrs , recursive , text , **kwargs ) # 可以根据标签名、属性、内容查找文档。这个函数可以用正则表达式匹配各种特定的标签。数据。. .

  # 遍历文档中所有a标签

print("文档中所有a标签: ", soup.find_all(&#39;a&#39;))

a_list = soup.find_all(&#39;a&#39;)

for i, aList in enumerate(a_list):

print(i, aList)

  输出:可以提取出文本中所有a标签的内容,然后遍历得到每一个标签的内容

  

  按属性、文本过滤

  # 根据属性筛选

print(soup.find_all(attrs={&#39;class&#39;: &#39;sister&#39;}))

# 根据文本筛选

print(soup.find_all(text="The Dormouse&#39;s story"))

  正则表达式过滤器

  #使用正则表达式找出文本中带有story字符串的内容

print(soup.find_all(text=re.compile(&#39;story&#39;)))

  还有一个find()方法,用法和findall()类似,只是它只返回一个值,而findall()返回一个列表。

  CSS 选择器

  目前最常用的是CSS选择器,通过标签和属性的嵌套可以提取出各种具体的内容。

  # 元素选择器:选择p标签

print(&#39;标签为p:&#39;, soup.select("p"))

# 类选择器:类前加&#39;.&#39;

print("文本中所有class类的标签: \n", soup.select(&#39;.sister&#39;))

# id选择器:id前加&#39;#&#39;

print("id为link2的标签: \n", soup.select(&#39;#link2&#39;))

  输出:

  

  # 属性选择器:

print("属性为name的标签: \n", soup.select("p[name]"))

print("选择所有属性中有sister的标签: \n", soup.select("*[href]"))

print("选择p标签的后代第三个a标签 \n", soup.select("p>a")[2])

print("选择id=link1后的所有兄弟标签 \n", soup.select("#link1 ~ .sister"))

print(&#39;通过属性为 href="http://example.com/title进行查找" \n&#39;, soup.select(&#39;a[href="http://example.com/title"]&#39;))

print("通过href属性中以http开头的所有标签的查找 \n", soup.select(&#39;a[href^="http"]&#39;))

print("通过href属性中以elsie结尾的所有标签的查找 \n", soup.select(&#39;a[href$="elsie"]&#39;))

print("通过href属性中包含.com的所有标签的查找 \n", soup.select("a[href*=&#39;.com&#39;]"))

# 通过标签层层查找,这里的:nth-child(2)代表第二个p标签,a#link2表示a标签的id为link2的标签

print("通过标签层层查找 \n", soup.select("body>p:nth-child(2)>a#link2"))

  示例输出:您可以自己尝试

  

  上面的CSS选择器的常用功能已经介绍过了,网页文本中的大部分数据基本可以通过上面的例子来获取。让我们通过一个小栗子来测试水。

  示例小项目

  需求:爬取某代理网站的免费代理IP地址

  第一步:请求数据,获取数据文本

第二步:通过BeautifulSoup分析数据 提取数据

第三步:保存数据到本地文本

  url = "https://www.89ip.cn/"

header = {"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "

"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"}

# 请求数据

response = requests.get(url, headers=header)

print(response.status_code)

# 判断是否请求成功

if response.status_code == 200:

# 获取web信息的文本模式

dataText = response.text

# 使用lxml解析器解析文本

soup = BeautifulSoup(dataText, &#39;lxml&#39;)

# 观察网页源码,获取需求数据,这里使用CSS选择器层层嵌套获得最终的ip信息

ipText = soup.select(&#39;body div>div>div>div>table>tbody>tr>td:nth-child(1)&#39;)

# 遍历列表获取每一个ip地址

for i in range(len(ipText)):

# 获取ip的文本信息,get_text()是获取文本,strip()是去掉两边空格

ip = ipText[i].get_text().strip()

# 保存到本地

file = open("ipText.txt", &#39;a+&#39;)

file.write(ip+"\n")

# 关闭文件

file.close()

  运行结果:

  

  这里只有ip地址。如果需要使用代理,还需要端口信息。方法一样,拼接后就可以使用了。如果您对代理池感兴趣,可以在评论区留言。

  总结

  BeautifulSoup 模块的主要功能是从网页中解析和提取数据。主要有三个用于提取数据的选择器。最常用的是CSS选择器,可以根据嵌套的方式获取需要的信息。这里需要一点 HTML 和 CSS 的基本知识。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线