五分钟上手爬虫:五分钟入门beautifulsoup

一、简介

Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度

beautifulsoup相比于用正则表达式简单太多,兼容性更强,操作难度更低

二、掌握重要的功能

1.beautifulsoup解析器解析页面

# 使用自带的html.parser解析页面响应结果
soup = BeautifulSoup(html_doc, 'html.parser')
# 使用lxml HTML解析器解析页面响应结果
soup = BeautifulSoup(html_doc, 'lxml')
# 使用lxml XML解析器解析页面响应结果
soup = BeautifulSoup(html_doc, 'xml')
# 使用html5lib解析页面响应结果
soup = BeautifulSoup(html_doc, 'html5lib')
解析器使用方法优势劣势
Python标准库BeautifulSoup(markup, ‘html.parser’)python内置的标准库,执行速度适中Python3.2.2之前的版本容错能力差
lxml HTML解析器BeautifulSoup(markup, ‘lxml’)速度快、文档容错能力强需要安装C语言库
lxml XML解析器BeautifulSoup(markup ‘xml’)速度快,唯一支持XML的解析器需要安装C语言库
html5libBeautifulSoup(markup, ‘html5lib’)最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档速度慢,不依赖外部拓展

 

2.搜索文档树

最重要的一步还是如何定位到自己想要的那部分资源然后进行获取

find(name, attrs, recursive, string, **kwargs)获取匹配的第一个标签;
find_all(name, attrs, recursive, string, limit, **kwargs) :返回结果是值包含一个元素的列表;

  • name:是根据标签的名称进行匹配,name的值相当于过滤条件,可以是一个具体的标签名,多个标签名组成的列表,或者是一个正在表达式,甚至是函数方法等等。
  • attrs:是根据标签的属性进行匹配。
  • recursive:是否递归搜索,默认为True,会搜索当前tag的所有子孙节点,设置为False,则只搜索儿子节点。
  • string:是根据标签的文本内容去匹配。
  • limit:设置查询的结果数量。
  • kwargs:也是根据标签的属性进行匹配,与attrs的区别在于写法不一样,且属性的key不能是保留字,也不能与其他参数名相同。

 name属性详解:

# 查找所有的<p>标签
soup.find_all(name="p") # 可以简写成 soup.find_all("p")

# 查找所有的<a>标签或者<link>标签
soup.find_all(name={'a', 'link'}) # 可以简写成 soup.find_all(['a', 'link']) 

# 查找所有以t开头的标签
soup.find_all(name=re.compile("^t")) # 可以简写成 soup.find_all(re.compile("^t")),例如td,tr

attrs属性详解:

# 查找所有style属性值的标签
soup.find_all(attrs={"style": "padding: 8px; border: 1px solid rgb(221, 221, 221); text-align: left; font-size: 12px; font-weight: bold; border-colng:8px 8px 8px 8px;"})

# 查找所有id属性值为id_attr1或者id_attr2的标签
soup.find_all(attrs={'id': ['id_attr1', 'id_attr2']})

# 查找id属性值中含有id_的所有标签
soup.find_all(attrs={'id':re.compiles('id_')})

这里一般是提取较为重要的点,可以通过尝试找到共同的属性值然后筛选出目标内容

strings属性详解:

# 查找标签的value是'提交'的所有标签集合
#需要注意的是这里返回标签的值,如果需要获取到对应的标签,可以使用previous_element属性来获得
soup.find_all(string='提交')

# 查找标签的value是'提交'的所有标签
[value.previous_element for value in soup.find_all(string='提交')]

# 查找value是'上一页'或者'下一页'的所有value值
soup.find_all(string=['上一页','下一页'])

# 查找value中存在'页'的所有value值
soup.find_all(string=re.compile('页'))

三、基本操作演示

1.beautifulsoup的安装

pip install beautifulsoup4

2. 理解基本爬虫所需的网页资源

URL,Cookie和User-Agent

URL 代表着是统一资源定位符,其实就是网页的网址

Cookie通常用于存储和识别用户的会话信息,以实现跟踪和个性化功能,相当于你电脑网页的身份证

User-Agent其实就是你的浏览器信息。是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识

获取方式:网页端f12进入网页检查

3.导入所需要的库

import requests
from bs4 import BeautifulSoup

4. 填入所找到的网页资源

header={#填空
'User-Agent': '',
'Cookie' : ''
}
url = ''#填空

5.连接网页并解析

    response = requests.get(url=url, headers=header)
    soup = BeautifulSoup(response.text, 'html.parser')

6.根据html的标签内容进行筛选

可以获取标签上的元素,例如herf,也可以获取标签内的文本元素,例如<p>元素</p>

    element_tags = soup.find_all()#填空
    #single_tags = single_soup.find_all('td', style="padding: 8px; border: 1px solid rgb(221, 221, 221); text-align: left; font-size: 12px; font-weight: bold; border-colng:8px 8px 8px 8px;")

    out = [element[] for element in element_tags]#[]里面进行填空,是用来获取结果上的指定元素,例如<a class="logo" href="/"><img src="../static/common/com_images/image.png"/></a>里面的href
    out = [element.text for element in element_tags]#用来获取结果上的文本,例如<a class="logo" href="/"><img src="../static/common/com_images/image.png"/>小羊肖恩</a>里面的小羊肖恩

四、完整代码展示

爬取可分为一级爬取和多级爬取,一级爬取则是只爬取当前页面的内容,多级爬取是爬取当前页面下的多个链接下另一个网页的内容(一般是带有页码数)

一级爬取:

import requests
from bs4 import BeautifulSoup
header={#填空
'User-Agent': '',
'Cookie' : ''
}
url = ''#填空
if __name__ in '__main__':
    response = requests.get(url=url, headers=header)
    soup = BeautifulSoup(response.text, 'html.parser')
    element_tags = soup.find_all()#填空
    out = [element[] for element in element_tags]#[]里面进行填空,是用来获取结果上的指定元素,例如<a class="logo" href="/"><img src="../static/common/com_images/image.png"/></a>里面的href
    out = [element.text for element in element_tags]#用来获取结果上的文本,例如<a class="logo" href="/"><img src="../static/common/com_images/image.png"/>小羊肖恩</a>里面的小羊肖恩

多级爬取:

import requests
from bs4 import BeautifulSoup
header={
'User-Agent': '',
'Cookie' : ''
}
for page in range(1,2):
    print(page)
    url = ''+ str(page) +''#多级爬取一般有页数,可以通过找到管理page的那个选项进行遍历
    response = requests.get(url=url, headers=header)
    soup = BeautifulSoup(response.text, 'html.parser')
    a_tags = soup.find_all()#soup.find_all('a', style='color:#0099FF; font-size:12px; font-weight:bold; text-decoration:underline;')
    hrefs = [a['href'] for a in a_tags]
    # Print the extracted hrefs
    for href in hrefs:
        single_href = ''#这里是对二级页面进行操作,例如'https://www.let.com.cn/' + href[1:]
        single_response = requests.get(url=single_href,headers=header)
        # 代码是查看当前状态码,看看是否连接成功print(single_response.status_code)
        single_soup = BeautifulSoup(single_response.text, 'html.parser')
        # print(single_response.text)
        single_tags = single_soup.find_all()#进一步解析获取第二个页面的内容
       

五、常见问题

1.有可能有小伙伴输出的内容为空,原因是定位不精准,没有找到符合解析的内容

2.如果出现requests.exceptions.ChunkedEncodingError报错

则查看建议的报错解决办法解决报错:requests.exceptions.ChunkedEncodingError-CSDN博客

详细请看官方文档Beautiful Soup 文档 — Beautiful Soup 4.4.0 文档 (beautiful-soup-4.readthedocs.io) 

希望这篇博文对你有所帮助!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值