案例一:
某套图网站,套图以封面形式展现在页面,需要依次点击套图,点击广告盘链接,最后到达百度网盘展示页面。
这一过程通过爬虫来实现,收集百度网盘地址和提取码,采用xpath爬虫技术
1、首先分析图片列表页,该页按照更新先后顺序暂时套图封面,查看HTML结构。每一组“li”对应一组套图。属性href后面即为套图的内页地址(即广告盘链接页)。所以,我们先得获取列表页内所有的内页地址(即广告盘链接页)
代码如下:
import requests 倒入requests库 from lxml import etree 倒入lxml 库(没有这个库,pip install lxml安装) url = "https://www.xxxx.com/gc/" 请求地址 response = requests.get(url= url) 返回结果 wb_data = response.text 文本展示返回结果 html = etree.HTML(wb_data) 将页面转换成文档树 b = html.xpath('//ul[@class = "clearfix"]//@href') 这一步的意思是class“clearfix”下所有属性为“href”赋值给“b”,因为我们的目标内容都展示在class“clearfix”下,且在href属性后面 print(b) 打印b,这里的b是一个数组 print(b[0]) 打印b的第一项数据
执行结果:成功返回所有内页
2、打开内页(即广告盘链接页),获取广告盘地址。下图红色箭头,还不是真正的百度盘页,需要点击后才可以看的到百度盘的地址。所以这一步骤,只需要抓取红色箭头内容地址;
代码如下:
url = "https://www.xxxx.com/gc/toutiao/87098.html" response = requests.get(url= url) wb_data = response.text # 将页面转换成文档树 html = etree.HTML(wb_data) b = html.xpath('//div[@class = "pictext"]//@href') c=b[1] #需要注意的地方,class = "pictext"下有两个href,我们只需要第一个href的值,所以返回值再赋值给c且取第二项数据 print(c)
执行结果:成功返回所有内页
3、获取到广告盘地址,接下来要打开该地址,抓百度盘真实地址。链接和提取码在两个不同的元素中,所有最后返回两组数据。
代码如下:
url = "http://xxx.la/xam9I6" response = requests.get(url= url) wb_data = response.text # 将页面转换成文档树 html = etree.HTML(wb_data) b = html.xpath('//tr/td/text()') c=b[6]#提取码 d = html.xpath('//tr//@href')#百度地址 print(c) print(d)
注意,这里html.xpath写法与上面有些区别,目标元素的上级没有class,只能模糊取值
比如提取码的HTML结构如下图,结构为//tr/td/,单/代表父节点下的子节点,双/代表父节点后的子孙节点。提取码为tr的子节点。但是这个结构下有很多组数据,最后输出一个数组b(看上面代码b)。如此,我们找到提取码位于数组序列,赋值给c(看上面代码c),这样获得了真实的百度盘地址
网盘地址则因为有href属性,所以好爬去一些,注意/的数量即可
4、把以上步骤拼成一个脚本,这里就涉及到函数和函数之间的传参,还有循环的问题。代码直接贴出来
# -*-coding:utf8-*- # encoding:utf-8 import requests from lxml import etree firstlink = "https://www.xxx.com/gc/qt/83720.html" AA=["https://www.xxx.com/gc/", "https://www.xxx.com/gc/index_2.html", "https://www.xxx.com/gc/index_3.html", "https://www.xxx.com/gq/", "https://www.xxx.com/gq/index_2.html", "https://www.xxx.com/gq/index_3.html", "https://www.xxx.com/gq/index_4.html"] #第1步,获取第一页面所有的地址 def stepa (AA): lit=[] for url in AA: response = requests.get(url=url) wb_data = response.text # 将页面转换成文档树 html = etree.HTML(wb_data) a = html.xpath('//ul[@class = "clearfix"]//@href') lit.append(a) return(lit) alllink = stepa(AA) #第2步,获取的地址,循环读取打开,从而获取百度网盘信息 def stepb(alllink,firstlink): for list in alllink: for url in list: if url in firstlink: continue elif "www" in url: url2 = url else: url2 ="https://www.xxx.com" +url response = requests.get(url=url2) wb_data = response.text # 将页面转换成文档树 html = etree.HTML(wb_data) b = html.xpath('//div[@class = "pictext"]//@href') c = b[1] #print(c) #获取到广告页地址 url3 = c response = requests.get(url=url3) wb_data = response.text # 将页面转换成文档树 html = etree.HTML(wb_data) d = html.xpath('//tr/td/text()') #print(d) e=d[6]#获取提取码 f = html.xpath('//tr//@href')#获取地址 test = e[-5:]#提取码值只保留提取码(4位) test2 = f[-1]#链接只保留链接内容,去掉前后[''] test3=test2+test#把链接和提取码拼接成一条数据 print(test3) with open('C:/Users/Beckham/Desktop/python/1.txt', 'a',encoding='utf-8') as w: w.write('\n'+test3) w.close() stepb(alllink,firstlink) #第3步:提示爬取完成 def over(): print("ok") over()
需要注意的地方:
1、return的用法,如果想把函数生成的值传给后面的函数用,就需要返回这个值,如def stepa 里定义的a为爬去的套图封面地址(通过打开这个地址进行下一步),就需要return(a)返回a的值,否则执行后无数据
2、Continue的应用,因为第一个套图地址打开的内容没有目标内容,这样找不到元素会报错,所以需要读取套图地址的时候要跳过第一个地址。加一个if判断,当第一个地址等于事先定义好的非正常地址的时候,跳过这个循环
打印结果:
案例二:
爬取豆瓣的读书的评论
分析html,评论存储放在标红色元素位置,且观察结构,其他评论都存储在li节点的相同位置
所以,xpath的解析对象为//*[@id="comments"]//div[2]/p/span
前面的实例讲过"//" 代表从当前节点选取子孙节点,这里就可以直接跳过li节点,直接选择li后的div[2]/p/span内容
代码如下:
# -*-coding:utf8-*- # encoding:utf-8 import requests from lxml import etree firstlink = "https://book.douban.com/subject/30172069/comments/hot" def stepa (firstlink): response = requests.get(url=firstlink) wb_data = response.text html = etree.HTML(wb_data) a = html.xpath('//*[@id="comments"]//div[2]/p/span') print(a) stepa (firstlink)
运行代码,打印出来的结果如下图,没有得到想要的评论内容
后来发现,想要获取内容,必须以文本的形式输出,即xpath的解析对象为//*[@id="comments"]//div[2]/p/span/text()
修改后的代码
# -*-coding:utf8-*- # encoding:utf-8 import requests from lxml import etree firstlink = "https://book.douban.com/subject/30172069/comments/hot" def stepa (firstlink): response = requests.get(url=firstlink) wb_data = response.text html = etree.HTML(wb_data) a = html.xpath('//*[@id="comments"]//div[2]/p/span/text()') print(a) stepa (firstlink)
执行一下,内容来了
参考地址:https://cuiqingcai.com/5545.html
总结
以上所述是小编给大家介绍的python 中xpath爬虫实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]