42

xpath爬虫实例,爬取图片网站百度盘地址和提取码

 4 years ago
source link: https://www.tuicool.com/articles/nEnQZvy
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

ZbUR7bf.png!web

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

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

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

N7fIr2Z.png!web

代码如下:


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

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

umeaAfu.png!web

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

UBN3Ajq.png!web

IBZZbq3.png!web

M7FzInM.png!web

代码如下:


url = "https://www.192ta.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)

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

V3eEnmF.png!web

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

zMRjyuy.png!web

代码如下:


url = "http://17d.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),这样获得了真实的百度盘地址

ZjY3qqF.png!web

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

y6nmAzA.png!web

4、把以上步骤拼成一个脚本,这里就涉及到函数和函数之间的传参,还有循环的问题。代码直接贴出来


# -*-coding:utf8-*-

import requests
from lxml import etree

firstlink = "https://www.xxx.com/gc/qt/83720.html"
#第一步,获取第一页面所有的地址
def stepa ():
    url = "https://www.xxx.com/gc/"
    response = requests.get(url=url)
    wb_data = response.text
    # 将页面转换成文档树
    html = etree.HTML(wb_data)
    a = html.xpath('//ul[@class = "clearfix"]//@href')
    return(a)
alllink = stepa()

#第二步,获取的地址,循环读取打开,从而获取百度网盘信息
def stepb(alllink,firstlink):
    for url in alllink:
        if url == firstlink:
            continue
        response = requests.get(url=url)
        wb_data = response.text
        # 将页面转换成文档树
        html = etree.HTML(wb_data)
        b = html.xpath('//div[@class = "pictext"]//@href')
        c = b[1]
        #获取到广告页地址
        url2 = c
        response = requests.get(url=url2)
        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)
        #获取百度地址和提取码
stepb(alllink,firstlink)

需要注意的地方:

1、return的用法,如果想把函数生成的值传给后面的函数用,就需要返回这个值,如def stepa 里定义的a为爬去的套图封面地址(通过打开这个地址进行下一步),就需要return(a)返回a的值,否则执行后无数据

2、Continue的应用,因为第一个套图地址打开的内容没有目标内容,这样找不到元素会报错,所以需要读取套图地址的时候要跳过第一个地址。加一个if判断,当第一个地址等于事先定义好的非正常地址的时候,跳过这个循环

femY3yF.png!web

Izem6fi.png!web

打印结果:

jUBrInb.png!web

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK