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中使用swapCase()方法转换大小写的教程
May 20 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
python 检查文件mime类型的方法
Dec 08 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
python3实现微型的web服务器
Sep 03 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
Python将QQ聊天记录生成词云的示例代码
Feb 10 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
十个Python自动化常用操作,即拿即用
May 10 Python
Python爬虫基础讲解之请求
May 13 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检测移动设备类mobile detection使用实例
2014/04/14 PHP
php中header设置常见文件类型的content-type
2015/06/23 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
JavaScript OOP面向对象介绍
2010/12/02 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
js 去除字符串第一位逗号的方法
2014/06/07 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
jQuery扩展实现text提示还能输入多少字节的方法
2016/11/28 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
[01:53]3.19 DOTA2发布会 现场精彩Coser表演
2014/03/25 DOTA
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
python使用Tesseract库识别验证
2018/03/21 Python
python实现手势识别的示例(入门)
2020/04/15 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Python Django路径配置实现过程解析
2020/11/05 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
2014升学宴答谢词
2014/01/26 职场文书
初一体育教学反思
2014/01/29 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
检讨书范文1000字
2015/01/28 职场文书
党校个人总结
2015/03/04 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
Html5生成验证码的示例代码
2021/05/10 Javascript
nginx常用配置conf的示例代码详解
2022/03/21 Servers