python 中xpath爬虫实例详解


Posted in Python onAugust 26, 2019

案例一:

python 中xpath爬虫实例详解

某套图网站,套图以封面形式展现在页面,需要依次点击套图,点击广告盘链接,最后到达百度网盘展示页面。

这一过程通过爬虫来实现,收集百度网盘地址和提取码,采用xpath爬虫技术

1、首先分析图片列表页,该页按照更新先后顺序暂时套图封面,查看HTML结构。每一组“li”对应一组套图。属性href后面即为套图的内页地址(即广告盘链接页)。所以,我们先得获取列表页内所有的内页地址(即广告盘链接页)

python 中xpath爬虫实例详解

代码如下:

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的第一项数据

执行结果:成功返回所有内页

python 中xpath爬虫实例详解

2、打开内页(即广告盘链接页),获取广告盘地址。下图红色箭头,还不是真正的百度盘页,需要点击后才可以看的到百度盘的地址。所以这一步骤,只需要抓取红色箭头内容地址;

python 中xpath爬虫实例详解

python 中xpath爬虫实例详解

python 中xpath爬虫实例详解

代码如下:

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)

执行结果:成功返回所有内页

python 中xpath爬虫实例详解

3、获取到广告盘地址,接下来要打开该地址,抓百度盘真实地址。链接和提取码在两个不同的元素中,所有最后返回两组数据。

python 中xpath爬虫实例详解

代码如下:

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),这样获得了真实的百度盘地址

python 中xpath爬虫实例详解

网盘地址则因为有href属性,所以好爬去一些,注意/的数量即可

python 中xpath爬虫实例详解

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判断,当第一个地址等于事先定义好的非正常地址的时候,跳过这个循环

python 中xpath爬虫实例详解

python 中xpath爬虫实例详解

打印结果:

python 中xpath爬虫实例详解

案例二:

爬取豆瓣的读书的评论

分析html,评论存储放在标红色元素位置,且观察结构,其他评论都存储在li节点的相同位置

python 中xpath爬虫实例详解

所以,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?p=6"

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)

运行代码,打印出来的结果如下图,没有得到想要的评论内容

python 中xpath爬虫实例详解

后来发现,想要获取内容,必须以文本的形式输出,即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?p=6"

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)

执行一下,内容来了

python 中xpath爬虫实例详解

参考地址:https://cuiqingcai.com/5545.html

总结

以上所述是小编给大家介绍的python 中xpath爬虫实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python使用CMD模块更优雅的运行脚本
May 11 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
定制FileField中的上传文件名称实例
Aug 23 Python
python+opencv实现动态物体追踪
Jan 09 Python
python3.x实现发送邮件功能
May 22 Python
Python面向对象类的继承实例详解
Jun 27 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
构建高效的python requests长连接池详解
May 02 Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 Python
python openssl模块安装及用法
Dec 06 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 Python
详解PyTorch模型保存与加载
Apr 28 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 #Python
python自动保存百度盘资源到百度盘中的实例代码
Aug 26 #Python
Python3 文章标题关键字提取的例子
Aug 26 #Python
python实现的爬取电影下载链接功能示例
Aug 26 #Python
Python使用itchat模块实现简单的微信控制电脑功能示例
Aug 26 #Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
Aug 26 #Python
Golang GBK转UTF-8的例子
Aug 26 #Python
You might like
php后退一页表单内容保存实现方法
2012/06/17 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
JQuery 解析多维的Json数据格式
2009/11/02 Javascript
为radio类型的INPUT添加客户端脚本(附加实现JS来禁用onClick事件思路代码)
2010/11/11 Javascript
eval与window.eval的差别分析
2011/03/17 Javascript
《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型
2012/02/27 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
Javascript读取上传文件内容/类型/字节数
2019/04/30 Javascript
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python代码的打包与发布详解
2014/07/30 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
Python日志处理模块logging用法解析
2020/05/19 Python
AOP的定义以及作用
2013/09/08 面试题
现金会计岗位职责
2013/12/05 职场文书
材料物理专业个人求职信
2013/12/15 职场文书
英语演讲稿范文
2014/01/03 职场文书
生日邀请函范文
2014/01/13 职场文书
教师评语大全
2014/04/28 职场文书
新闻人物通讯稿
2014/10/09 职场文书
护士实习自荐信
2015/03/06 职场文书
接待员岗位职责范本
2015/04/15 职场文书
匿名信格式范文
2015/05/27 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript