五分钟上手爬虫:五分钟入门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语言库
html5lib BeautifulSoup(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属性详解:

# 查找所有的

标签 soup.find_all(name="p") # 可以简写成 soup.find_all("p") # 查找所有的标签或者标签 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进入网页检查

五分钟上手爬虫:五分钟入门beautifulsoup_第1张图片

五分钟上手爬虫:五分钟入门beautifulsoup_第2张图片

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,也可以获取标签内的文本元素,例如

元素

    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]#[]里面进行填空,是用来获取结果上的指定元素,例如里面的href
    out = [element.text for element in element_tags]#用来获取结果上的文本,例如里面的小羊肖恩

四、完整代码展示

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

一级爬取:

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]#[]里面进行填空,是用来获取结果上的指定元素,例如里面的href
    out = [element.text for element in element_tags]#用来获取结果上的文本,例如里面的小羊肖恩

多级爬取:

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) 

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

你可能感兴趣的:(爬虫系列,爬虫,beautifulsoup,python)