几步完成Python爬虫采集附源码

发布时间 2023-03-22 21:13:50作者: 华科爬虫

对于长期做爬虫行业的程序员我来说,现在随便编写一个爬虫程序也只是分分钟的事情,这次我编辑一个有关图文采集的爬虫,从试错到下载保存等一些列重点全部都写入下面的文章中希望大家避坑。

这里应用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="日本デザインセンター | Nippon Design Center, Inc.".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=["日本デザインセンター | Nippon Design Center, Inc.{}".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'保存访问失败的图片链接成功!')

爬取效果