分享

一起学爬虫(Python) — 06

 紫竹林1ht2lcnc 2021-02-18

一起学爬虫(Python) — 19 年轻人,进来学自动化

回顾

鲁迅先生曾说过,学习要脚踏实地,要会举一反三!昨晚看了很多小伙伴的留言,深思良久,觉得应该放慢一点步伐,确实回头看的话,有很多地方没有细化的讲到,不过没关系,今天我们就来把前几天的小问题,灰都给扬喽。
在这里插入图片描述

xpath

在这里插入图片描述
点名这位小伙伴嗷,既然你诚心诚意的发问了,那我就大发慈悲的告诉你吧!(其实本来就打算后面详细讲的,hh)
小泽觉得通过实践来学习的效率,是远远比记笔记死记硬背要来的高的。

什么是xpath

查帕斯查帕斯查帕斯!
上一次我们是为什么要用到查帕斯(xpath)呢,因为我们要在返回来的一整个文档里找到我们要的那一部分的数据!
举个栗子,有很多小伙伴都喜欢往PP里面塞一些奇怪的东西,有的很粗,有的很大,还有的很长,经常进去之后就出不来了,可以理解为我们的工作就是找到那个奇怪的东西,并且把它拿出来!
如果放到以前,医学技术没有那么高深,可能就莫得办法了,解剖吧,生死听天由命。
但是现在高级了呀,x光哗的一下,就能精准定位,然后再定点取出来,越厉害的医院越能很轻松就给你取出来喽,不过大家还是最好不要乱塞东西嗷。
在这里插入图片描述
同样的,如果我们要从网页数据的茫茫标签中找到对的那个标签,就可以用查帕斯(xpath)这种简单方便快捷而且可以跨平台的高科技!
不要问查帕斯(xpath)到底是个啥,就像你塞进去那个东西,你会去研究它是怎么做的吗???
在这里插入图片描述

查帕斯的原理

假如你到医院去拍片子,是不是也要脱光光(不用)然后站在医生面前羞涩的被拍,然后医生再从羞涩的你的身体中的那些骨头和内脏里找到塞进去的那个东西的位置在哪里,对吧对吧。
同样的,我们的查帕斯也是把一整个网站放进来,然后查帕斯化,我们昨天说的是树化,想怎么说就怎么说,就是这么任性!
如果要说的专业一点就是实例化,实例化一个etree对象!
然后把需要被解析的页面放到这个etree对象里,还记得我们昨天是怎么做的吗,不记得了?罚你去操场跑一百圈!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

直接给你找过来了!
看到了嘛,我们是先把页面整个数据text化之后交给了etree.HTML()
然后得到了我们的实例化的etree对象,起个名字叫tree。
在这里插入图片描述
接着就要从实例化了的etree对象中找我们要的部分,tree.xpath(‘xpath表达式’)
也就是说,只要能找到xpath表达式,我们就能精准定位到我们要的地方,难点就在我们要怎么去找xpath表达式啦,所以接下来就通过例子来让大家理解吧!

案例

在这里插入图片描述
来,我们打开bilibili,右键打开抓包工具。
在这里插入图片描述
看到抓包工具边角上的小箭头了嘛,那是一根神手指,真正的猛男,一根手指,就够了!
使用它,点击你想看的位置,就会跳到你要找的东西的标签那里,比如我们点个发蓝光的那个音乐吧!
在这里插入图片描述
铛铛裆!那么我们要怎么通过xpath表达式来获得音乐这个文本内容呢?
不要急,从头开始!
在这里插入图片描述
从图中我们可以看到,音乐这个文本内容在html标签下的body标签下的div标签下的div标签下的div标签下的div标签下的div标签下的div标签下的div标签下的span标签下的div标签下的第三个span标签下的div标签下的a标签下的span标签里!中间有几个div标签小泽可能迷糊了没输对,看划横线的位置就好了,那么这样分析完后要怎么写呢?
/html/body/div[2]/div/div[1]/div[3]/div/div[2]/span[3]/div/a/span/text()
注意缩进!如果开头是在一起的,就是同级,div[2]表示的是同级下第二个div,因为上面的svg标签里还有个div标签,注意不是从0开始哦!
/html就是我们的头头,要从头开始写嘛~
以此类推,大家慢慢琢磨一下,就会发现这其实就是一种笨方法,一个一个的找,跟查字典一样,先找到首字母,再……
那么有没有快捷的方法呢?肯定有呀!
//*[@id=“primaryChannelMenu”]/span[3]/div/a/span/text()
在这里插入图片描述
是不是短了很多~虽然没有上面的长了,但是不要怕,我们,短小精悍!
//就是不用从头开始,直接找我们指定的标签,一般都是通过class或者id去找,//*呢,就是小仙女懒得写标签的名字,只要id是后面那串字母就可以啦~
[@id=“primaryChannelMenu”]
注意喽,每一级都要用[]中括号括住,@后面跟id或者class或者其他标识,然后等号后面就不能再用我们爱用的单引号了,要用双引号!
/就是下一级
/span[3]/div/a/span/text()
下一级的第三个span标签里的第一个div里的第一个a里的span里的东西,我只要text的内容!
翻译过来大致就是上面的意思啦~
最后的text()就是取里面的文本内容,当然如果你想获取链接什么的,可以把text()换成@xxx,xxx就类似昨天的src,不多赘述啦~
赶紧去试一试,有木有效果!
在这里插入图片描述
我的是出来呢,你的呢?

# 导入模块import requestsfrom lxml import etree# 指定urlurl = 'https://www.bilibili.com'# 伪装头header = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}# 把获取请求和树化两步结合起来了tree = etree.HTML(requests.get(url,header).text)# 利用xpath表达式获取我们要的数据,注意返回的是个列表哦!a = tree.xpath('//*[@id='primaryChannelMenu']/span[3]/div/a/span/text()')print(a)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

到这里呢,你应该大致明白xpath到底是个什么东西了吧~
就像用扳手一样,再好用的扳手到了莽夫手里也只是杀人利器,所以我们才要学会去使用它,然后就知道如何才能塞进去还不会出不来了!

在这里插入图片描述

举一反三

今天,我们就要实践鲁迅先生的理论了!
随便找一个网站啊,我先去找找~
在这里插入图片描述
希望大家会希望呦~
这次我们就来爬取这个网站,相信对你来说已经没有什么难度了,但是我们是有目的的去爬的,练习查帕斯!
先做好准备工作:

import requestsfrom lxml import etreeurl = 'https://www.qqtn.com/article/article_292075_1.html'header = {    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

指定好url和header心里就会很安心也很踏实,接下来去做我们的大事吧!
在这里插入图片描述
通过分析我们发现,这些图片是在/html下的/body下的/div[5](第五个div)下的/div下的/div下的id为zoom的div里的p标签里!是一个列表哦。
在这里插入图片描述
在这里插入图片描述

# 获取网页数据a = requests.get(url=url,headers=header).text# 树化ab = etree.HTML(a)# //表示跳过开头,至于跳多少,都是可以的!直接@class='m_qmview'的div# 要它下面的p标签,这里为什么不指定要第几个呢,因为我们要获取的是一个列表# 也就是,我全都要!# p后面跟的//就是中间如果有东西,直接跳过,只要p标签下# 和p标签里面包括的标签里有src=这个东西,就把=后面的链接全部拿过来!c = b.xpath('//div[@class='m_qmview']/p//@src')print(c)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述
小泽成功地拿到了我们要的每一张图片的网址,接下来就开始遍历,然后保存啦~

# 遍历c列表中的每一个图片网址for i in c:# 二进制化数据(图片,视频,音乐都是要用二进制爬下来的哦)     d = requests.get(i).content    # 取名    name = i.split('/')[-1]    # 上下文管理器    with open(name,'wb') as fp:        fp.write(d)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
不要忘了今天的主题哦,查帕斯!
希望大家都不要当癞皮狗,一起单身吧~
来,换个姿势~

虽然鲁迅先生说了举一反三,但是鲁迅说的不一定是对的,因为我累了。
所以说,现在越来越多的“人生道理”、“成功秘诀”也不一定是真的适合自己的,希望大家能做好自己,走好自己的路。
这里小泽给大家推荐一个爬虫交流群吧,没有广告,不存在卖课,只有苦逼的程序员~目前只有三个人,hhh
在这里插入图片描述
如果有想一起交流的小伙伴欢迎加进来哦~
如果你看到了这里,点个赞再走吧!!点赞数量到100,就更下一期哦!!
在这里插入图片描述

目前一共是65个,这个要求不过分叭~
那今天就写到这里喽,掰掰!!!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多