图片爬虫,Python原研哉设计作品采集爬虫源码

一个简单的图片爬虫,采集对象为原研哉设计官网的设计作品,实现了设计作品的采集爬取,包括图片及文字信息内容的采集处理,下载获取,可惜视频没找到播放链接,播放也未能实现,故没有写入处理。

pic_001.png

目标网址:https://www.ndc.co.jp/works/

这里应用self.log简单的做了一下运行日志的处理和记录!

几个关键点:

1.常规操作,访问出错重试

这里仅仅是简单的写了访问出错重试,没有排除掉其他访问出错,比较简单粗暴的处理。

参考代码:

    # 六次重试
    def s(self, url, headers,timeout=10, num_retries=6):
        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.s(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


2.多线程下载图片

比较简单应用多线程,来进行图片的下载处理,一定程度上提高了下载图片的效率。

参考源码:

    #多线程下载图片
    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("多线程下载图片完成")


3.re正则简单应用,替换不合法的字符

其实在保存文件时,有不少特殊字符是违法字符,需要进行替换处理,不然保存文件会报错,尤其是你用它来建立保存路径,命名为文件名的时候!

参考源码:

    #替换不合法字符
    def filter(self,old_str):
        pattern=r'[\|\/\<\>\:\*\?\\\"]'
        new_str= re.sub(pattern, "_", old_str)  # 剔除不合法字符
        return new_str


4.获取所有链接

参考源码:

    #获取列表链接
    def get_urllist(self):
        for i in range(1,13):
            if i==1:
                url=self.url
            else:
                url="https://www.ndc.co.jp/works/page/{}/".format(i)
            response=self.s(url,self.headers)
            html=response.content.decode('utf-8')
            tree=etree.HTML(html)
            hrefs=tree.xpath('//div[@class="worksCard js-loadItem"]/a/@href')
            hrefs=["https://www.ndc.co.jp{}".format(href) for href in hrefs]
            print("已获取到第 {} 页作品链接为:".format(i))
            print(hrefs)
            self.urllist.extend(hrefs)

        print("恭喜,共获取 {} 条链接!".format(len(self.urllist)))


5.保存为文本文件

参考源码:

    #保存文本内容
    def save_txt(self,title,content,path):
        print("开始保存 {} 内容".format(title))
        with open(f'{path}{title}.txt','w',encoding='utf-8') as f:
            f.write(content)
        print("保存 {} 内容成功!".format(title))


6.下载图片

参考源码:

    #下载图片
    def get_img(self,img_url,path):
        r=self.s(img_url,self.headers)
        if r:
            img_name=img_url.split('/')[-1]
            with open(f'{path}{img_name}.jpg','wb')as f:
                f.write(r.content)
            print("下载图片成功!")
            time.sleep(1)
        else:
            print("下载图片失败!")
            with open(f"{path}fail_img.txt", 'a+', encoding='utf-8') as f:
                f.write(f'{img_url}\n')
            print(f'保存访问失败的图片链接成功!')


爬取效果


完整项目源码获取 

请关注本渣渣微信公众号:二爷记

pic_008.jpg

后台回复“设计爬虫”