第四讲你所不知道的爬虫(一)

爬虫能做什么

爬虫除了能够获取互联网的数据以外还能够帮我们完成很多繁琐的手动操作,这些操作不仅仅包括获取数据,还能够添加数据,比如:

  • 投票
  • 管理多个平台的多个账户(如各个电商平台的账号)
  • 微信聊天机器人

实际的应用远不止上面这些,但是上面的应用只是除开数据本身的应用而已,数据本身的应用也是很广的:

  • 机器学习语料库
  • 垂直领域的服务(二手车估值)
  • 聚合服务(去哪儿网,美团)
  • 新闻推荐(今日头条)
  • 预测和判断(医疗领域)

所以爬虫能做的功能非常多,也就造就了爬虫的需求也是越来越旺盛,但是很多有过后端开发的人员却觉得爬虫很简单,很多人觉得爬虫用一个库(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
鲁班七号
赵云
李白
安琪拉
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容