爬虫能做什么
爬虫除了能够获取互联网的数据以外还能够帮我们完成很多繁琐的手动操作,这些操作不仅仅包括获取数据,还能够添加数据,比如:
- 投票
- 管理多个平台的多个账户(如各个电商平台的账号)
- 微信聊天机器人
实际的应用远不止上面这些,但是上面的应用只是除开数据本身的应用而已,数据本身的应用也是很广的:
- 机器学习语料库
- 垂直领域的服务(二手车估值)
- 聚合服务(去哪儿网,美团)
- 新闻推荐(今日头条)
- 预测和判断(医疗领域)
所以爬虫能做的功能非常多,也就造就了爬虫的需求也是越来越旺盛,但是很多有过后端开发的人员却觉得爬虫很简单,很多人觉得爬虫用一个库(requests)去获取一个html然后解析就行了,实际上爬虫真的这么简单吗?
首先学习之前我们来问几个问题:
- 如果一个网页需要登录才能访问,怎么办?
- 对于上面的问题,很多人说模拟登录就行了,但实际上很多网站会采用各种手段去加大模拟登录的难度,如:各种验证码,登录逻辑的各种混淆和加密、参数的各种加密,这些问题都怎么解决?
- 很多网站只能手机登录怎么办?
- 很多网站为了用户体验和服务器优化,会将一个页面的各个元素采用异步加载或者js加载的方式完成?这些你有能力分析出来吗?
- 作为一个网站,各种反爬的方案也是层出不穷,当你的爬虫被反爬之后,你如何去猜测对方是怎么反爬的?
- 一个爬虫怎么发现最新的数据?如何发现一个数据是否被更新了?
如果你只是做一个简单的爬虫,比如你的爬虫就是一次性的,一次性获取某个网站的某些数据这样当然就简单了,但是你要做一个爬虫服务,你就必须要面对上面的问题,这上面还没有提到数据的提取和解析等等
爬虫之旅
- 新建本地html文件
首先新建打开pycharm新建static文件夹然后新建index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎来到王者荣耀</h1>
<ul>
<li>
<a href="https://pvp.qq.com/web201605/herodetail/112.shtml">鲁班七号</a>
</li>
<li><a href="#">赵云</a></li>
<li><a href="#">李白</a></li>
<li><a href="#">安琪拉</a></li>
</ul>
<!--段落标签-->
<p>不给我选鲁班我就送</p>
<p>那好你选吧</p>
<!--div + css 布局 div 是一个无色无味的容器-->
<div id="container-bd">这是div标签</div>
<div id="container">
<p class="action-counter">文本内容1</p>
<p class="action-checkbox">文本内容2</p>
<!-- 超链接标签-->
<a href="http://www.neusoft.com">点击跳转至东软官方网站</a>
</div>
<p class="action-counter">文本内容1</p>
</body>
</html>
- 使用python读取本地html文件
with open(file='./static/index.html', mode='r', encoding='utf-8') as f:
html_data = f.read()
print(html_data)
html_data变量中存放的就是html文件的所有源码
数据提取
获取了所有的HTML数据,接下来我们就要提取出来这些数据
非结构化的数据处理
文本、电话号码、邮箱地址
- 正则表达式
HTML 文件
- 正则表达式
- XPath
- CSS选择器
结构化的数据处理
JSON 文件
- JSON Path
- 转化成Python类型进行操作(json类)
XML 文件
- 转化成Python类型(xmltodict)
- XPath
- CSS选择器
- 正则表达式
有同学说,我正则用的不好,处理HTML文档很累,有没有其他的方法?
有!那就是XPath,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素。
使用xpath语法进行html的内容提取
XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言,可用来在 XML 文档中对元素和属性进行遍历。
W3School官方文档:http://www.w3school.com.cn/xpath/index.asp
Xpath最常用语法:
其中 / 从根节点选取。 // 代表 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
XPath的语法内容,在运用到Python抓取时要先转换为xml
lxml
xml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。lxml python 官方文档:http://lxml.de/index.html需要安装C语言库,可使用 pip 安装:pip install lxml
(或通过wheel方式安装)
from lxml import html
with open(file='./static/index.html', mode='r', encoding='utf-8') as f:
html_data = f.read()
#print(html_data)
# 解析html,返回单个元素/文档
selector = html.fromstring(html_data)
# print(selector)
h1 = selector.xpath('/html/body/h1/text()')
print(h1[0])
# # // 从任意的位置开始
# # //标签名1[@属性= "属性值"]/标签名2[@属性="属性值"]/..../text()
# # 获取a 标签中的内容
a= selector.xpath('//div[@id="container"]/a/text()')
print(a[0])
# # 爬取a 标签的属性 链接地址 @属性名
link = selector.xpath('//div[@id="container"]/a/@href')
print(link[0])
# 爬取鲁班七号的链接
luban_link = selector.xpath('//ul/li[1]/a/@href')
print(luban_link[0])
# # 获取英雄列表
ul_list = selector.xpath('//ul/li/a')
# #len 是列表中的元素的个数
print(len(ul_list))
for li in ul_list:
hero = li.xpath('text()')
print(hero[0])
输出结果:
欢迎来到王者荣耀
点击跳转至东软官方网站
http://www.neusoft.com
https://pvp.qq.com/web201605/herodetail/112.shtml
4
鲁班七号
赵云
李白
安琪拉