接着上一篇博客的学习
https://blog.csdn.net/qq_41865229/article/details/121546222

1.安装Beautiful Soup

通过 requests 库已经可以获取整个网页的源码,接着我们需要从源码中提取我们需要的数据。Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中提取数据。

1.Beautiful Soup 目前已经被移植到 bs4 库中,也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。

在终端执行安装命令

 pip install beautifulsoup4


安装成功

2.安装好 bs4 库以后,还需安装 lxml 库。

如果我们不安装 lxml 库,就会使用 Python 默认的解析器。虽然Beautiful Soup 既支持 Python 标准库中的 HTML 解析器又支持一些第三方解析器,但是 lxml 库具有功能更加强大、速度更快的特点,因此推荐安装 lxml 库。

在终端执行安装命令

pip install lxml

安装成功

2.使用 Beautiful Soup 解析网页

安装好上面的库后, 就能使用Beautiful Soup了

以中国旅游网为例 http://www.cntour.cn/
我们爬取该网页中的蓝色标题, 如下图所示

1.审查要爬取数据对应的元素标签

2.复制要爬取元素的选择器

#main > div > div.mtop.firstMod.clearfix > div.centerBox > ul.newsList > li:nth-child(1) > a

3.稍微修改一下, 让它能选取所有蓝色标题

#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a

4.使用 Beautiful Soup 爬取指定数据

import requests        #导入requests包
from bs4 import BeautifulSoupdef main():url = 'http://www.cntour.cn/'strhtml = requests.get(url)soup = BeautifulSoup(strhtml.text, 'lxml')data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')print(data)return# Press the green button in the gutter to run the script.
if __name__ == '__main__':main()

运行结果

3.代码分析

1.Beautiful Soup 库能够解析网页信息,它被集成在 bs4 库中,需要时可以从 bs4 库中调用。其表达语句如下:

from bs4 import BeautifulSoup

2.首先,HTML 文档将被转换成 Unicode 编码格式,然后 Beautiful Soup 选择最合适的解析器来解析这段文档,此处指定 lxml 解析器进行解析。解析后便将复杂的 HTML 文档转换成树形结构,并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中,代码如下:

 url = 'http://www.cntour.cn/'strhtml = requests.get(url)soup = BeautifulSoup(strhtml.text, 'lxml')

3.获取要爬取的数据的选择器, 使用 soup.select 进行筛选,代码如下:

data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')

4.清洗和组织数据

1.至此,获得了一段指定数据的 HTML 代码,存储在data变量中, 如下所示

[<a href="http://www.cntour.cn/news/21122/" target="_blank" title="戴斌:冰雪之上 旅游新局">戴斌:冰雪之上 旅游新局</a>, <a href="http://www.cntour.cn/news/21117/" target="_blank" title="服务“国之大者”拓展旅游业高质量发展新格局">服务“国之大者”拓展旅游业高质量发展新格局</a>,<a href="http://www.cntour.cn/news/21098/" target="_blank" title="首批国家夜间文化和旅游消费集聚区">首批国家夜间文化和旅游消费集聚区</a>,<a href="http://www.cntour.cn/news/20081/" target="_blank" title="发挥旅游优势 共建开放型世界经济">发挥旅游优势 共建开放型世界经济</a>, <a href="http://www.cntour.cn/news/14988/" target="_blank" title="2021中国旅游向内发力">[2021中国旅游向内发力]</a>,<a href="http://www.cntour.cn/news/14987/" target="_blank" title="2020中国旅游浴火重生">[2020中国旅游浴火重生]</a>, <a href="http://www.cntour.cn/news/14977/" target="_blank" title="“云旅游”赋能旅游业创新发展">[“云旅游”赋能旅游业创]</a>, <a href="http://www.cntour.cn/news/14970/" target="_blank" title="旅游为幸福生活添彩">[旅游为幸福生活添彩]</a>, <a href="http://www.cntour.cn/news/14965/" target="_blank" title="RCEP为旅游业带来机遇">[RCEP为旅游业带来机遇]</a>,<a href="http://www.cntour.cn/news/14943/" target="_blank" title="大数据读懂中国旅游新引力">[大数据读懂中国旅游新引]</a>,<a href="http://www.cntour.cn/news/13916/" target="_blank" title="假日旅游复苏 市场平稳有序">[假日旅游复苏 市场平稳]</a>,<a href="http://www.cntour.cn/news/13907/" target="_blank" title="全球旅游业呈现持续向好势头">[全球旅游业呈现持续向好]</a>
]

2.但还没有把数据提取出来,还带有html标签, 接下来在 PyCharm 中稍微修改一下代码:

import requests        #导入requests包
from bs4 import BeautifulSoupdef main():url = 'http://www.cntour.cn/'strhtml = requests.get(url)soup = BeautifulSoup(strhtml.text, 'lxml')data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')for item in data:result = {'title': item.get_text(),'link': item.get('href')}print(result)return# Press the green button in the gutter to run the script.
if __name__ == '__main__':main()

3.首先明确要提取的数据是标题和链接,标题在<a>标签中,提取标签的正文用 get_text() 方法。链接在<a>标签的 href 属性中,提取标签中的 href 属性用 get() 方法,在括号中指定要提取的属性数据,即 get('href')。

运行结果

4.从上图可以发现,文章的链接中有一个数字 ID。
下面用正则表达式提取这个 ID。
在 Python 中调用正则表达式时使用 re 库,这个库不用安装,可以直接调用。

在 PyCharm 中修改一下代码:

import requests        #导入requests包
from bs4 import BeautifulSoup
import redef main():url = 'http://www.cntour.cn/'strhtml = requests.get(url)soup = BeautifulSoup(strhtml.text, 'lxml')data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')for item in data:result = {'title': item.get_text(),'link': item.get('href'),'ID': re.findall('\d+', item.get('href'))}print(result)return# Press the green button in the gutter to run the script.
if __name__ == '__main__':main()

这里使用 re 库的 findall 方法,第一个参数表示正则表达式,第二个参数表示要提取的文本。

运行结果

5.爬虫攻防战

爬虫是模拟人使用浏览器访问网站,进行数据的批量抓取。如果大量的用户使用爬虫来爬取数据, 就会给网站服务器带来很大的压力, 所以网站开发者就针对这些爬虫者,采取了一些反爬策略。

1.服务器第一种识别爬虫的方式就是通过检查连接的 useragent 来识别到底是浏览器访问,还是代码访问的。如果是代码访问的话,访问量增大时,服务器会直接封掉来访 IP。

对于这种初级的反爬机制,我们爬虫用户可以构造浏览器的请求头,来伪装自己.

以上面创建好的爬虫为例。在进行访问时,我们在开发者环境下不仅可以找到 URL、Form Data,还可以在 Request headers 中构造浏览器的请求头,封装自己。服务器识别浏览器访问的方法就是判断 keyword 是否为 Request headers 下的 User-Agent,如图下所示。

因此,我们只需要构造这个请求头的参数。创建请求头部信息即可,代码修改后如下:

import requests        #导入requests包
from bs4 import BeautifulSoup
import redef main():url = 'http://www.cntour.cn/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}strhtml = requests.get(url, headers=headers)soup = BeautifulSoup(strhtml.text, 'lxml')data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')for item in data:result = {'title': item.get_text(),'link': item.get('href'),'ID': re.findall('\d+', item.get('href'))}print(result)return# Press the green button in the gutter to run the script.
if __name__ == '__main__':main()

运行结果

2.正常人1秒看一个图,而个爬虫1秒可以抓取好多张图,比如 1 秒抓取上百张图,那么服务器的压力必然会增大。如果在一个 IP 下短时间内批量访问下载图片,这就不符合用户使用浏览器访问网站的行为,肯定要被封 IP。

封 IP原理的也很简单,就是统计每个IP的访问频率,该频率超过阈值,就会返回一个验证码,如果是正常使用浏览器访问的话,用户就会填写验证码,然后继续访问,如果是代码访问的话,无法填写验证码, 也就不能下载数据了。

这个问题的解决方案有两个,第一个就是增设延时,比如每 3 秒钟抓取一次,代码如下:

import requests        #导入requests包
from bs4 import BeautifulSoup
import re
import timedef main():url = 'http://www.cntour.cn/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}strhtml = requests.get(url, headers=headers)soup = BeautifulSoup(strhtml.text, 'lxml')data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')for item in data:result = {'title': item.get_text(),'link': item.get('href'),'ID': re.findall('\d+', item.get('href'))}print(result)time.sleep(3)return# Press the green button in the gutter to run the script.
if __name__ == '__main__':main()

3.我们写爬虫的目的是为了高效批量抓取数据,这里设置 3 秒钟抓取一次,效率太低。所以还有一个更重要的解决办法,那就是从本质上解决问题。

不管如何访问,服务器的目的就是查出哪些为代码访问,然后封锁 IP。

解决办法:为避免被封 IP,在数据采集时经常会使用代理。

构建我们自己的IP代理池(下一篇博客来介绍如何构建IP代理池), 现在先简单理解为大量可用的代理IP, 这个网上一搜一大把, 我们将其以字典的形式赋值给 proxies,然后传输给 requests,代码如下:

import requests        #导入requests包
from bs4 import BeautifulSoup
import redef main():url = 'http://www.cntour.cn/'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}proxies = {"https": "60.163.85.0:9000","https": "218.91.13.2:46332",}strhtml = requests.get(url, headers=headers, proxies=proxies)soup = BeautifulSoup(strhtml.text, 'lxml')data = soup.select('#main>div>div.mtop.firstMod.clearfix>div.centerBox>ul.newsList>li>a')for item in data:result = {'title': item.get_text(),'link': item.get('href'),'ID': re.findall('\d+', item.get('href'))}print(result)return# Press the green button in the gutter to run the script.
if __name__ == '__main__':main()

02网络爬虫-使用 Beautiful Soup 解析网页相关推荐

  1. beautifulsoup网页爬虫解析_Python3 网络爬虫快速入门实战解析

    点击上方"Python高校",关注 文末干货立马到手 作者:Jack Cui http://cuijiahua.com/blog/2017/10/spider_tutorial_1 ...

  2. java爬取网页数据_Python网络爬虫实战(二)数据解析

    Python网络爬虫实战 (二)数据解析 本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站 ...

  3. 爬虫5_python2_使用 Beautiful Soup 解析数据

    使用 Beautiful Soup 解析数据(感谢东哥) 有的小伙伴们对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Beautiful Soup,有了它我们可以很方便地提取出HT ...

  4. python3 爬虫实例_【实战练习】Python3网络爬虫快速入门实战解析(上)

    原标题:[实战练习]Python3网络爬虫快速入门实战解析(上) 摘要 使用python3学习网络爬虫,快速入门静态网站爬取和动态网站爬取 [ 前言 ] 强烈建议:请在电脑的陪同下,阅读本文.本文以实 ...

  5. Python教程:网络爬虫快速入门实战解析

    建议: 请在电脑的陪同下,阅读本文.本文以实战为主,阅读过程如稍有不适,还望多加练习. 网络爬虫简介 网络爬虫,也叫网络蜘蛛(Web Spider).它根据网页地址(URL)爬取网页内容,而网页地址( ...

  6. Python 爬虫---(7) Python3网络爬虫快速入门实战解析

    转载请注明作者和出处: http://blog.csdn.net/c406495762  Github代码获取:https://github.com/Jack-Cherish/python-spide ...

  7. Python3网络爬虫快速入门实战解析

    Python3网络爬虫快速入门实战解析 标签: python网络爬虫 2017-09-28 14:48 6266人阅读 评论(34) 收藏 举报 分类: Python(26) 作者同类文章X 版权声明 ...

  8. Python3 网络爬虫快速入门实战解析

    点击上方"Python高校",关注 文末干货立马到手 作者:Jack Cui http://cuijiahua.com/blog/2017/10/spider_tutorial_1 ...

  9. 【Python beautiful soup】如何用beautiful soup 解析HTML内容

    美丽汤(Beautiful Soup)是一个流行的Python库,用于从HTML或XML文件中提取数据.它将复杂的HTML文件转化为一个Python对象,使得用户可以更方便地解析.搜索和修改HTML内 ...

  10. Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫)

    Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫) https://blog.csdn.net/u012662731/article/details/78537432 出 ...

最新文章

  1. c语言俄罗斯方块注释,C语言学习1年-俄罗斯方块(无注释)
  2. AAAI 2020放榜,8800篇提交论文创纪录,接收率20.6%
  3. phalcon系列(1) hello phalcon
  4. 工程师如何在工作中提升自己?
  5. Linux环境进程间通信---信号(下)
  6. matlab求距离判别函数,求MATLAB的逐步判别程序 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
  7. appium显示无法连接到服务器,Appium服务器未检测到通过wifi连接的设备
  8. 解决运行Vue项目localhost8080拒绝连接
  9. 技术可行性分析注意哪些内容?
  10. css 剪辑图片_css实现图片剪裁
  11. Spring Boot 学习[一] 介绍与入门
  12. 知网下载的PDF论文,如何加目录的方法
  13. 新一年涨工资指南:AI薪资水平和就业前景分析(一定要看完!)
  14. tcpdump(一)
  15. STM32F103---标准库函数驱动DS18B20
  16. MySQL备份恢复之mysqldump恢复
  17. 甘特图(别名:横道图、条状图)的画法
  18. AD转换及单片机通信
  19. 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)
  20. Blender PS Zbrush 人物眼球制作2 - Albedo 贴图和UV不匹配修正

热门文章

  1. 华为路由器显示网络未连接到服务器,如何解决华为路由器Q1连接没有网络的问题?...
  2. excel中复制时不要计算机,电脑excel表格中无法将复制的内容粘贴进去如何解决...
  3. 金山打字专业文章计算机,练打字试卷_推荐几篇适合学生练习打字的文章_淘题吧...
  4. 08、Flutter FFI 内存管理
  5. docker镜像与容器基本的基本操作
  6. 第四百三十五章 灭龙魔宫
  7. Android界面全屏显示,隐藏状态栏,可下拉显示状态栏
  8. 【LLS-Player】webrtc m94 修改
  9. ElasticSearch已有字段添加Fields
  10. [算法]LeetCode每日一题--9回文数(Java)