一个简单的图片爬虫,运行日志的处理和记录
优采云 发布时间: 2021-06-17 03:23一个简单的图片爬虫,运行日志的处理和记录
一个简单的图像爬虫。 采集对象是原燕雅设计官网的设计作品,实现了设计作品的采集爬取,包括采集对图片文字信息的处理,下载,但是视频的播放没有找到链接,也没有实现回放,所以没有写处理。
目标网址:
这里是使用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'保存访问失败的图片链接成功!')
爬行效果