Python文件下载爬虫,解析如何跳转真实下载链接下载文件素材

爬虫是python的拿手好戏,应用python可以很方便的获取到我们需要的资源,文件内容也是可以获取到的,时间与你想要获取到的资源以及网速有关,拒绝嘴炮,实战说话,这里以一个网站撸一把为例,仅供学习参考!

目标网址:https://www.keyshot.com/resources/downloads/scenes/

通过观察,可以很清晰的看到网页结构,该页面是一个单页面,我们需要获取的文件内容都在该页面上。

使用到的 python 库
import requests,time
from fake_useragent import UserAgent
from lxml import etree
import re
构建协议头

直接使用的fake_useragent第三方库的ua协议头!

参考代码如下:

def ua():
    ua=UserAgent()
    headers={
        'User-Agent':ua.random,
    }
    return headers
关键,跳转获取真实下载网址

想要获取页面上的文件素材内容,需要获取到真实下载地址,也就是文件的地址,好在该网站未做什么其他设置,只需要获取到跳转的真实文件下载地址即可!

页面下载链接:https://www.keyshot.com/download/351304/

真实跳转文件地址:https://media.keyshot.com/scenes/keyframe-animation.ksp

参考代码如下:

def get_real_url(url):
    rs = requests.get(url, headers=ua(), timeout=10)
    print(rs.url)

    return rs.url
下载,图片下载及视频下载

参考代码如下:

#下载图片
def get_img(imgurl,name):
    img_name=f'{name}{imgurl[-4:]}'
    r = requests.get(url=imgurl, headers=ua(), timeout=6)
    print(f"开始下载 {img_name} 图片..")
    with open(img_name, 'wb') as f:
        f.write(r.content)
    print(f"下载 {img_name} 图片完成!")

#下载文件
def get_sky(url,name):
    down_url=get_real_url(url)
    down_name=f'{name}{down_url[-4:]}'
    r=requests.get(url=down_url,headers=ua(),timeout=6)
    print(f"开始下载 {down_name} 文件..")
    with open(down_name,'wb') as f:
        f.write(r.content)
    print(f"下载 {down_name} 文件完成!")
文件数据内容获取

参考代码如下:

#获取数据
def get_data():
    url="https://www.keyshot.com/resources/downloads/scenes/"
    html=requests.get(url=url,headers=ua(),timeout=8).content.decode('utf-8')
    tree=etree.HTML(html)
    divs=tree.xpath('//div[@class="et_pb_text_inner"]')
    print(len(divs))
    #获取标题
    for div in divs:
        h3=div.xpath('.//h3/text()')
        if h3:
            h3=h3[0]
            pattern = r"[\/\\\:\*\?\"\<\>\|]"
            h3 = re.sub(pattern, "_", h3)  # 替换为下划线
            print(h3)
            img=div.xpath('.//img[@loading="lazy"]/@src')[0]
            print(img)
            get_img(img, h3)
            href=div.xpath('.//a[@class="cta-button"]/@href')[0]
            print(href)
            downhref=get_real_url(href)
            try:
                get_sky(downhref, h3)
            except Exception as e:
                print(f'下载文件出错!')
                with open('fail.txt','a+',encoding='utf-8') as f:
                    f.write(f'{h3}@{href}@{downhref}#{e}\n')

            time.sleep(2)

其中,关于特殊字符的替换

pattern = r"[\/\\\:\*\?\"\<\>\|]"
h3 = re.sub(pattern, "_", h3)  # 替换为下划线
文件下载爬虫运行效果:

完整源码参考:

#keyshot渲染场景下载
#by 微信:huguo00289
#https://www.keyshot.com/resources/downloads/scenes/
# -*- coding: UTF-8 -*-
import requests,time
from fake_useragent import UserAgent
from lxml import etree
import re


def ua():
    ua=UserAgent()
    headers={
        'User-Agent':ua.random,
    }
    return headers


#获取数据
def get_data():
    url="https://www.keyshot.com/resources/downloads/scenes/"
    html=requests.get(url=url,headers=ua(),timeout=8).content.decode('utf-8')
    tree=etree.HTML(html)
    divs=tree.xpath('//div[@class="et_pb_text_inner"]')
    print(len(divs))
    #获取标题
    for div in divs:
        h3=div.xpath('.//h3/text()')
        if h3:
            h3=h3[0]
            pattern = r"[\/\\\:\*\?\"\<\>\|]"
            h3 = re.sub(pattern, "_", h3)  # 替换为下划线
            print(h3)
            img=div.xpath('.//img[@loading="lazy"]/@src')[0]
            print(img)
            get_img(img, h3)
            href=div.xpath('.//a[@class="cta-button"]/@href')[0]
            print(href)
            downhref=get_real_url(href)
            try:
                get_sky(downhref, h3)
            except Exception as e:
                print(f'下载文件出错!')
                with open('fail.txt','a+',encoding='utf-8') as f:
                    f.write(f'{h3}@{href}@{downhref}#{e}\n')

            time.sleep(2)




#获取跳转网址
def get_real_url(url):
    rs = requests.get(url, headers=ua(), timeout=10)
    print(rs.url)

    return rs.url


#下载图片
def get_img(imgurl,name):
    img_name=f'{name}{imgurl[-4:]}'
    r = requests.get(url=imgurl, headers=ua(), timeout=6)
    print(f"开始下载 {img_name} 图片..")
    with open(img_name, 'wb') as f:
        f.write(r.content)
    print(f"下载 {img_name} 图片完成!")


#下载文件
def get_sky(url,name):
    down_url=get_real_url(url)
    down_name=f'{name}{down_url[-4:]}'
    r=requests.get(url=down_url,headers=ua(),timeout=6)
    print(f"开始下载 {down_name} 文件..")
    with open(down_name,'wb') as f:
        f.write(r.content)
    print(f"下载 {down_name} 文件完成!")


def main():
    get_data()


if __name__=='__main__':
    main()

·················END·················

你好,我是二大爷,

革命老区外出进城务工人员,

互联网非早期非专业站长,

喜好python,写作,阅读,英语

不入流程序,自媒体,seo . . .

公众号不挣钱,交个网友。

读者交流群已建立,找到我备注 “交流”,即可获得加入我们~

听说点 “在看” 的都变得更好看呐~

关注关注二大爷呗~给你分享python,写作,阅读的内容噢~

扫一扫下方二维码即可关注我噢~

关注我的都变秃了

说错了,都变强了!

不信你试试

扫码关注最新动态

公众号ID:eryeji

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值