python爬虫案例_low版爬虫脚本,Python简单图片爬虫案例

news/2024/7/24 2:46:37

现在很多网站都是异步加载的方式加载数据,大部分都是json数据,如果不知道数据的传递过程,一些参数理不清头绪的话,又想要获取数据,那就比较难搞了,尤其是对于本渣渣级选手而言。

       2089ef9127f3a8c39a89e8c3da59ea89.png      

目标网址

https://www.keyshot.com/gallery/

需求

获取图片信息,需高清大图

经过简单浏览器抓包调试,可以获取到一些信息!

       7dada592b3248a87e91c1cbd238a64f0.png      

       d04a02c858e541b20ef996d45b6a9503.png      

不想努力了,想了两个笨方法,好在数据量不大!

枚举法获取图片地址,爬取图片

1.枚举获取图片地址

代码示例

for i in range(10000):
    if len(str(i))==1:
        i=f'000{i}'
    if len(str(i))==2:
        i = f'00{i}'
    if len(str(i))==3:
        i = f'0{i}'
    if len(str(i)) ==4:
        i=i

    print(i)
    url=f"https://www.keyshot.com/wp-content/uploads/2016/06/keyshot-gallery-{i}.jpg"
    if requests.get(url, headers=self.random_headers):
        print("存在图片!")

图片链接:

https://www.keyshot.com/wp-content/uploads/2016/06/keyshot-gallery-0003.jpg

可以看到id与图片链接是存在关系的,所以,对于id进行迭代,同时进行了if判断!

2.图片下载

代码示例

    def save_img(self, img_url, img_name, path):
        os.makedirs(f'{path}/', exist_ok=True)
        print("开始下载图片!")
        print(f">>> 开始保存 {img_name} 图片")
        r = requests.get(img_url, headers=self.random_headers,timeout=8)
        with open(f'{path}/{img_name}.jpg', 'wb') as f:
            f.write(r.content)
        print(f">>> 保存 {img_name} 图片成功")

这里需要注意的是 timeout=8 属性一定需要标配,尤其是国外网站获取请求的话,不然容易卡死!

完整代码

# -*- coding: UTF-8 -*-
#微信:huguo00289
import requests
import random,os


class Httprequest(object):
    ua_list = [
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36Chrome 17.0',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0Firefox 4.0.1',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
        'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
    ]
    @property  #把方法变成属性的装饰器
    def random_headers(self):
        return {
            'User-Agent': random.choice(self.ua_list)
        }


class Get_imgs(Httprequest):
    def __init__(self):
        self.path="key"


    def getimgs(self):
        for i in range(10000):
            if len(str(i))==1:
                i=f'000{i}'
            if len(str(i))==2:
                i = f'00{i}'
            if len(str(i))==3:
                i = f'0{i}'
            if len(str(i)) ==4:
                i=i

            print(i)
            url=f"https://www.keyshot.com/wp-content/uploads/2016/06/keyshot-gallery-{i}.jpg"
            if requests.get(url, headers=self.random_headers):
                print("存在图片!")
                self.save_img(url, str(i), self.path)


    #下载图片
    def save_img(self, img_url, img_name, path):
        os.makedirs(f'{path}/', exist_ok=True)
        print("开始下载图片!")
        print(f">>> 开始保存 {img_name} 图片")
        r = requests.get(img_url, headers=self.random_headers,timeout=8)
        with open(f'{path}/{img_name}.jpg', 'wb') as f:
            f.write(r.content)
        print(f">>> 保存 {img_name} 图片成功")



if __name__=='__main__':
    spider=Get_imgs()
    spider.getimgs()

手动获取json数据包,爬取图片

1.正则获取图片地址

代码示例

img_urls=[]
    zeimg=r'href="(.+?)"'
    imgs=re.findall(zeimg,str(datas),re.S)
    for img in imgs:
        if "www.keyshot.com" in img:
            img_urls.append(img)

2.多线程下载图片,这里使用了线程池技术

代码示例

def main():
    img_urls=get_imgs()

    try:
        # 开4个 worker,没有参数时默认是 cpu 的核心数
        pool = ThreadPool()
        results = pool.map(save_img, img_urls)
        pool.close()
        pool.join()
        print("采集所有图片完成!")

    except:
        print("Error: unable to start thread")

完整代码


#keyshot图片采集
# -*- coding: UTF-8 -*-
#微信:huguo00289
import requests,re,os,random
from multiprocessing.dummy import Pool as ThreadPool

def get_imgs():
    datas="""
    data: "↵    
5b61162257f21891623d4b545410a708.png
↵↵            
↵↵                
↵              
Dmitrij Leppée
↵              
↵   
↵↵↵↵    
5b61162257f21891623d4b545410a708.png
↵↵            
↵↵                
↵              
Tiho Ramovic
↵              
↵   
↵↵↵↵    
5b61162257f21891623d4b545410a708.png
↵↵            
↵↵                
↵              
Vitaly Bulgarov
↵              
↵   
↵↵↵↵    
5b61162257f21891623d4b545410a708.png
↵↵            
↵↵                
↵              
Maarten Verhoeven
↵              
↵   
↵↵↵↵    
5b61162257f21891623d4b545410a708.png
↵↵            
↵↵                
↵              
Philippe Vanagt
↵              
↵   
↵↵↵"
    message: ""
    success: true
"""
    img_urls=[]
    zeimg=r'href="(.+?)"'
    imgs=re.findall(zeimg,str(datas),re.S)
    for img in imgs:
        if "www.keyshot.com" in img:
            img_urls.append(img)

    print(len(img_urls))

    return img_urls


#下载图片
def save_img(img_url):
    path = "key"
    ua_list = [
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36Chrome 17.0',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0Firefox 4.0.1',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
        'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
        'Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
    ]
    os.makedirs(f'{path}/', exist_ok=True)
    img_name=img_url.split('/')[-1]
    print("开始下载图片!")
    print(f">>> 开始保存 {img_name} 图片")
    r = requests.get(img_url,headers={'User-Agent':random.choice(ua_list)},timeout=8)
    with open(f'{path}/{img_name}', 'wb') as f:
        f.write(r.content)
    print(f">>> 保存 {img_name} 图片成功")



def main():
    img_urls=get_imgs()

    try:
        # 开4个 worker,没有参数时默认是 cpu 的核心数
        pool = ThreadPool()
        results = pool.map(save_img, img_urls)
        pool.close()
        pool.join()
        print("采集所有图片完成!")

    except:
        print("Error: unable to start thread")




if __name__=='__main__':
    main()
    

e5ee8703373859af3a7fabddb0b8c281.png      

微信公众号:二爷记

不定时分享python源码及工具


http://www.niftyadmin.cn/n/621651.html

相关文章

qt qlistview获取选中行的值_Qt入门DirectX11学习之旅(五)文件系统 从工程文件打开自定义格式的Shader...

【闲话开始】本来今天想直接把透视变换加进去的,后来发现如果不很好的组织模型Mesh等各个资源数据到项目后期容易看不明白前面自己写的代码了~所以决定一步一步开始把项目改成一个小小的游戏引擎~先做个简单的文件系统管理下文件吧。。。不然乱糟糟的对于后期的深入…

最新挂载samba文件系统

最新挂载samba文件系统: mount.cifs //192.168.15.2/home /root/tony -hw -o usertony 192.168.15.2  : samba服务器ip地址 home    : 共享文件夹别名 密码     :  Enter后会提示输入对应的samba密码 hw     : 是要挂载到的目录 user…

Android调试底层服务

之前调试过VOLD,调试起来极为麻烦,稍微改一点就要编译整个系统,然后烧写system.img。极为耗时,经过多时经验总结出来了类似调试应用程序的调试方法,高效快速。这里先还以VOLD为例子。…

vue 多个回调_vue多个组件中如何监听vuex中同一个action的回调

vue单页面应用,在整个app入口,需要调用获取用户信息的接口,这个接口只调用一次,怎样能够在多个组件中获取到这个接口完成的通知。app.vueexport default {mounted() {this.userInfo().then(res > {if (res.code 200) {// 具体的操作}});},methods: {...mapState([userInfo]…

程序语言python循环_Python for和while循环

一、自动化测试 直观的来说就是写代码来帮你代替原来的点点点,节省了时间,提高了测试的效率; 录脚本是根据一定的规则生产了代码,这个比较简单,自动化一般是自己写代码:比如用Python、java、ruby、GO等 系统…

Centos 7 安装 MongoDB(偷懒版)

一、环境及工具说明 系统: CentOS 7.6 安装软件:MongoDB 4.2.10 协作工具:FileZilla, PuTTY, 360 压缩 二、下载 MongoDB 并解压软件包 官网地址(注意:若官网没有完全一样版本号软件包,可根据以下图片…

解决Android设备插入打印机无法启动

一直在想起一个什么题目好一些,题目只是最初的现实,经过不断调试最后很是其它问题,想要起一个其它名字比如《打印机驱动中热插拔事件中添加DEVTYPE》。但是最后想了想还是回到最初才是好的。 具体现象:源码位置NativeDaemonConnec…

linux安装python2的mysql_Linux下安装Django1.2和MySQL-Python

写这个教程主要是因为今天想试用一下django1.2,需要个django的运行环境。也当做个记录,让其他人也能顺利的搭建django环境。在安装之前,首先要保证你的系统中已经配置python环境,我使用的python版本是2.6.2,本文安装的…