爬虫是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()