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基础教程之python消息摘要算法使用示例
Feb 10 Python
Python Sleep休眠函数使用简单实例
Feb 02 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
Python3.7中安装openCV库的方法
Jul 11 Python
python+splinter自动刷新抢票功能
Sep 25 Python
python实现祝福弹窗效果
Apr 07 Python
python3 map函数和filter函数详解
Aug 26 Python
Python for循环与getitem的关系详解
Jan 02 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
JupyterNotebook 输出窗口的显示效果调整实现
Sep 22 Python
python实战之用emoji表情生成文字
May 08 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中常用数组处理方法实例分析
2008/08/30 PHP
PHP 解决utf-8和gb2312编码转换问题
2010/03/18 PHP
发一个php简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
javascript比较两个日期的先后示例代码
2014/12/31 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
JavaScript的字符串方法汇总
2016/07/31 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
Python处理json字符串转化为字典的简单实现
2016/07/07 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
python ansible服务及剧本编写
2017/12/29 Python
numpy.where() 用法详解
2019/05/27 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
大学活动策划书范文
2014/01/10 职场文书
岗位廉洁从业承诺书
2014/03/28 职场文书
大学生新学期计划书
2014/04/28 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
网吧员工管理制度
2015/08/05 职场文书
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js