Python爬虫,超简单nendo官网作品图片爬虫demo

一个简单的demo,Python采集下载图片,其中图片下载的时候采用了简单的多线程下载,未涉及到其他知识,比较简单,属于拿来就能使用的demo,供大家参考和学习,如有疑问可以加本渣渣微信探讨!

pic_001.png

目标网址:http://www.nendo.jp/en/release/2020/

佐藤大官网作品集获取,从2003年作品到2020年作品,一键采集下载!

该网站结构比较清晰明了,适合新人爬取测试学习,推荐吧!对了,网站应该是用Wordpress开源程序搭建的!


按照惯例,几个关键点,简单阐述一下!

四次重试

在应用requests库访问的时候,可能会存在访问超时,或者出错的情况,设置好重试机制,避免你二次数据补坑,还是比较推荐的!

参考代码:

    #四次重试
    def get_req(self,url,headers,timeout=8,num_retries=4):
        print(f">>正在爬取{url}")
        try:
            response=requests.get(url,headers=headers,timeout=timeout)
            time.sleep(2)
        except:
            if num_retries > 0:  ##num_retries是我们限定的重试次数
                time.sleep(6)  ##延迟六秒
                print(u'获取网页出错,8S后将获取倒数第:', num_retries, u'次')
                return self.get_req(url, headers,timeout, num_retries - 1)
            else:
                print(f">> 访问 {url} 失败!")
                with open("fail_url.txt", 'a+', encoding='utf-8') as f:
                    f.write(f'{url}\n')
                print(f'保存访问失败网页链接成功!')
                response=[]


        return response


多线程下载图片

由于详情页面可能存在不少图片需要采集,这里简单的应用了多线程,获取到页面上的所有图片,进行多线程采集下载。

参考代码:

    #多线程下载图片
    def dowm_imgs(self,img_urls,path):
        threadings=[]
        for img_url in img_urls:
            t= threading.Thread(target=self.get_img,args=(img_url,path))
            threadings.append(t)
            t.start()

        for x in threadings:
            x.join()

        print("多线程下载图片完成")


异常处理,可能存在链接是列表页的情况处理

很多时候,在实际采集的过程中,可能会出现各种异常,突发情况,这个时候你就需要兼容处理了,在异常的时候,或者说没有考虑到的问题上进行处理,补坑采集,比如这里出现的情况,那就是列表页面采集到的链接存在并非详情页的情况,还是一个列表页面,这里简单应用if判断,重新调用列表页链接的获取来进行处理,这样才能完整采集,跑完整个程序。

参考代码:

    #获取详情页数据
    def parse(self,url,year):
        r = self.get_req(url, self.headers, timeout=8, num_retries=4)
        html = r.content.decode('utf-8')
        tree = etree.HTML(html)
        if len(tree.xpath('//div[@class="entry-content"]/p'))>0:
            print("该页面为详情页面")
            h1 = tree.xpath('//h1[@class="entry-title"]/text()')[0]
            pattern = r"[\/\\\:\*\?\"\<\>\|]"
            title = re.sub(pattern, "_", h1)  # 替换为下划线,去除待存储目录特殊字符
            print(title)
            path = f'{year}/{title}/'
            os.makedirs(path, exist_ok=True)
            imgs = tree.xpath('//div[@class="entry-content"]//img/@src')
            print(imgs)
            self.dowm_imgs(imgs, path)

        else:
            print("该页面非详情页面")
            self.get_parseurls(url, year)

爬取效果:



完整项目源码获取 

请关注本渣渣公众号 

pic_005.jpg

后台回复:nendo