当前位置: 首页 > news >正文

python网络爬虫_Python网络爬虫实战(二)数据解析

Python网络爬虫实战

(二)数据解析

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

    不管你是学习Java爬虫还是Python爬虫,都可以从中学到爬虫的编码思想。

    上一篇说完了如何爬取一个网页,以及爬取中可能遇到的几个问题。那么接下来我们就需要对已经爬取下来的网页进行解析,从中提取出我们想要的数据。

    根据爬取下来的数据,我们需要写不同的解析方式,最常见的一般都是HTML数据,也就是网页的源码,还有一些可能是Json数据,Json数据是一种轻量级的数据交换格式,相对来说容易解析,它的格式如下。

{    "name": "中国",    "province": [{        "name": "黑龙江",        "cities": {            "city": ["哈尔滨", "大庆"]        }    }, {        "name": "广东",        "cities": {            "city": ["广州", "深圳", "珠海"]        }    }, {        "name": "台湾",        "cities": {            "city": ["台北", "高雄"]        }    }, {        "name": "新疆",        "cities": {            "city": ["乌鲁木齐"]        }    }]}

    上一篇说到的爬取携程加载不出来的那部分数据就是异步请求Json返回给我们的,对于这类数据,Python有着十分便捷的解析库,所以我们相对不用写多少代码。 

    但是对于爬取下来是一个HTML数据,其中标签结构可能十分复杂,而且不同HTML的结构可能存在差异,所以解析方式也需要看情况而定。 

    相对方便的解析方式有正则表达式,xPath和BeautifulSoup4库。

     三者的运行速度相比当然是正则表达式最快,xPath其次,Bs4最慢了,因为Bs4是经过封装的库,相对于另外两个,无疑是重装坦克一般,但Bs4确实使用最简单的一个,而正则表达式是最麻烦的一个。 

    正则表达式几乎所有编程语言都支持,每一种语言的正则表达式都存在一点差异但大同小异。如果你是在设计一个复杂系统,就不要考虑正则表达式了,因为这种方法太过于不稳定,你永远不敢保证你写的正则规则是对应当前系统完全不会报错的。 

    xPath 是一门在XML文档中查找信息的语言。xPath可用来在XML文档中对元素和属性进行遍历。 

    关于正则表达式和xPath在之后的实战中再做详解,现在主要是掌握Bs4的使用。

    我们首先需要下载Bs4的库。

pip install lxmlpip install beautifulsoup4

    当我们爬取下来一整个网页的HTML之后,Bs4就可以根据标签的相对定位来找准你要爬取的数据了。

    这个相对定位类似于如下:

body > div.banner > div > div.celeInfo-right.clearfix > div.movie-stats-container > div > div > span > span    


    可以理解把HTML页面当做洋葱一层一层剥开。

    这种定位叫做selector,我们可以不用自己编写它,比较HTML结构可能比较复杂,很容易写错。

    我们可以打开浏览器的控制台(F12),然后Elements里面找到我们想要爬取之后解析的内容,这时候你鼠标放上去的位置对应页面内容会变成蓝色让你来对比,如下图。

d58566c188e39e3af62a221fd929bd19.png

    可以发现,这些标签里面就是当前页面所有的电影信息了。

    哪吒之魔童降世你可以理解为,巨鳄风暴可以当做,以此类推。

    然后你把鼠标放在标签上右键,会有一个copy选项,里面有一个selector,就是将它的selector复制下来。

    下面分别是哪吒之魔童降世和巨鳄风暴的selector,可以发现,只有最后的不同。

哪吒之魔童降世

#app > div > div.movies-panel > div.movies-list > dl > dd:nth-child(1) 

巨鳄风暴

#app > div > div.movies-panel > div.movies-list > dl > dd:nth-child(2)

    有了这个规律,我们就可以很容易的一次性解析那种列表型网页了。

7f9c152800a3ef3ee85cfbf2813db328.png

# -*- coding: utf-8 -*-import osimport refrom bs4 import BeautifulSoupimport requests# 请求头设置header = {    'Accept': '*/*;',    'Connection': 'keep-alive',    'Accept-Language': 'zh-CN,zh;q=0.9',    'Accept-Encoding': 'gzip, deflate, br',    'Host': 'maoyan.com',    'Referer': 'http://maoyan.com/',    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}data = requests.get('https://maoyan.com/films', headers=header)soup = BeautifulSoup(data.text, 'lxml')titles = soup.select('#app > div > div.movies-panel > div.movies-list > dl > dd ')print(titles)

    来仔细讲解一下上面这些代码。

    request.get(url,headers)是昨天说过的了,headers就是请求头信息,里面包含了我们客户端的信息以及请求方式是Get还是Post等。

    返回的data就是响应了,你可以直接print这个数据,但是这个响应体里面不止包含网页的HTML,还有这次请求的相关数据,比如响应码,200说明成功,404说明没有找到资源等。

    data.text就是从响应体中拿到网页HTML代码了。

    BeautifulSoup就是我们的主要解析对象,lxml是相应的解析方式。通过调用BeautifulSoup的select选择器方法,来从之前传入的HTML中获取相应的标签。

    这么一看其实Bs4还是很简单的,但这只是Bs4的基础应用,对于我们普通解析一个网页已经足够用了,如果感兴趣可以去深入去了解一下,不过这个这么说也只是工具库,如果你不嫌麻烦可以自己解析。

    看完代码,如果现在我要拿到这个页面的电影名称,这时候上面这个selector就不能用了,因为它不够精确,它只到了,而我们要精确到电影名称。用这个selector。

05b0abc481b369ad36cb2329a0c03a19.png

#app > div > div.movies-panel > div.movies-list > dl > dd:nth-child(1) > div.channel-detail.movie-item-title > a

    其它方式几乎都大同小异。

    以上是HTML的解析,我们爬取的数据有时还会是Json数据,这类数据相对来说十分规则,我倒是很希望目标数据会是Json格式。

    比如上篇中的携程。它的航班信息就是请求Json返回的。

c85953027c676b7ff1617a115e63eb7d.png

    Python中正则表达式的解析十分简单,你把它当做字典数据类型就可以了。

    最开始你获得的Json是一串字符串,通过Python的Json.loads(jsonData)之后,返回的其实就是字典数据类型,直接操作就可以了。

5f38595241944dee727f49b82aae5af2.png

import jsonjsonData = '{        "name":"gzj",        "age":"23",        "sex":"man",        "mail":{            "gmail":"antzuhl@gmail.com",            "qmail":"1325200@qq.com"            }        }'res = json.loads(jsonData)print(res['mail']['qmail'])

看到这里的都是对爬虫感兴趣的吧,快来投票吧!

相关推荐

a2cca1257554ceb7ebb6596130909b43.png

Python网络爬虫实战(一)快速入门

a2cca1257554ceb7ebb6596130909b43.png

解决猫眼网反爬虫策略的爬虫

a2cca1257554ceb7ebb6596130909b43.png

网络爬虫"黑洞"与B站弹幕爬取实战

a2cca1257554ceb7ebb6596130909b43.png

爬虫模拟登录——不给我毛概二的H某大学

641b6325be726bd2903dc582c0c4066e.gif 219ed044299b1ac67cc5f3b54798a21f.gif

263803c39459307c114f1a51bf23d849.png

扫码关注我

1

END

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 应用Executors来建立Thread pool
  • 富士通台式电脑_什么是电脑显卡 电脑显卡分类介绍【详解】
  • U盘上安装Damn Small Linux(DSL),让Linux常驻U盘
  • nginx 伪静态404_宝塔LNMP环境 Nginx安装EduSoho教程说明
  • c语言c99标准_C语言第一章《认识C语言》
  • robots.txt
  • java doubke类型转换为String_Java第一周笔记
  • Windows Embedded从入门到精通12月预告
  • 多个app用同一个签名文件_一文教你玩转幕布App
  • dskrdsk的区别
  • 联想杜比音效_联想锐龙入门本上市,强劲R5来了
  • 回忆Solaris_ 学习笔记1 [网络地址和掩码]
  • 边缘计算应用场景_边缘计算盒子有什么作用?博时特EC01 边缘计算盒子具体特征及应用场景来了...
  • 回忆Solaris_学习笔记2 [系统概念]
  • C# 动态 条件 组合_C# Win Form 记录集分页显示的实现
  • 【mysql】环境安装、服务启动、密码设置
  • Java比较器对数组,集合排序
  • Java面向对象及其三大特征
  • spring学习第二天
  • Vue官网教程学习过程中值得记录的一些事情
  • 机器学习中为什么要做归一化normalization
  • 区块链共识机制优缺点对比都是什么
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 设计模式走一遍---观察者模式
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 用Visual Studio开发以太坊智能合约
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • - 转 Ext2.0 form使用实例
  • 【云吞铺子】性能抖动剖析(二)
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (4)logging(日志模块)
  • (PADS学习)第二章:原理图绘制 第一部分
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)关于pipe()的详细解析
  • .NET Reactor简单使用教程
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net web项目 调用webService
  • .NET 的程序集加载上下文
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • /etc/shadow字段详解
  • ::before和::after 常见的用法
  • [20160807][系统设计的三次迭代]
  • [BZOJ1053][HAOI2007]反素数ant
  • [C++] Windows中字符串函数的种类
  • [EFI]MSI GF63 Thin 9SCXR电脑 Hackintosh 黑苹果efi引导文件
  • [Git场景]常用工作场景演练
  • [Gradle] 在 Eclipse 下利用 gradle 构建系统