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分割和拼接字符串
Nov 01 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
selenium+python自动化测试之多窗口切换
Jan 23 Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 Python
python错误调试及单元文档测试过程解析
Dec 19 Python
Python获取对象属性的几种方式小结
Mar 12 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
numpy 矩阵形状调整:拉伸、变成一位数组的实例
Jun 18 Python
python 安装移动复制第三方库操作
Jul 13 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 Python
Python进程池与进程锁之语法学习
Apr 11 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 和 MYSQL
2006/10/09 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
JS中==与===操作符的比较
2009/03/21 Javascript
javascript concat数组累加 示例
2009/09/03 Javascript
优化innerHTML操作(提高代码执行效率)
2011/08/20 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
详解AngularJS中$http缓存以及处理多个$http请求的方法
2016/02/06 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
取消Bootstrap的dropdown-menu点击默认关闭事件方法
2018/08/10 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
js 函数性能比较方法
2020/08/24 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
2017/11/11 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
Python线性回归实战分析
2018/02/01 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
python pygame实现球球大作战
2019/11/25 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
python3 kubernetes api的使用示例
2021/01/12 Python
python实现经典排序算法的示例代码
2021/02/07 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
初三化学教学反思
2014/01/23 职场文书
八一建军节活动方案
2014/02/10 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
努力学习演讲稿
2014/05/10 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
2016年学校招生广告语
2016/01/28 职场文书
windows安装python超详细图文教程
2021/05/21 Python