逻辑分解:
- 第一步.获取入口网页源码
- 第二步.解析源码获取页面中所有的跳转链接
- 第三步.获取页面源码中所有的图片链接
- 第四部.下载图片到本地文件夹
- 第五步.递归重复二三四
实现逻辑:
首先,定义入口程序:
if __name__ == '__main__':
main()
复制代码
在入口程序中调用第一步,抓取入口地址源码
def main():
# log.log('测试'+config.config['strartUrl'],config.config['logUrl'])
get_page_urls(config['strartUrl'])
log('\n'.join(pages),config['logUrl'])
复制代码
get_page_urls
这个方法是本例中主要逻辑,先附代码再讲解:
def get_page_urls(url):
# 递归抓取页面地址以及图片地址
if not url.startswith(config['baseUrl']):
return
# retUrl=[]
log(url,config['logUrl'])
global pages # pages使用全局变量
respose=requests.get(url)
urls=re.findall(r'<a.*?href="(.*?)"',respose.text,re.S) #re.S 把文本信息转换成1行匹配==
imgs = re.findall(r'<img.*?src="(.*?)"',respose.text,re.S) #re.S 把文本信息转换成1行匹配== logImg
down_imgs(imgs) #下载图片
# log('\n'.join(imgs),config['logImg'])
for u in urls:
if u not in usedUrl:
if u.startswith(config['baseUrl']):
usedUrl.append(u)
pages.append(u)
get_page_urls(u) #递归
return
复制代码
这是一个递归的方法,首先根据入口程序传过来的入口网址通过 requests.get(url)
方法获取对应入口网址的源码。
解析源码,通过写好的抓取规则获取所有a标签的 链接网址href:
urls=re.findall(r'<a.*?href="(.*?)"',respose.text,re.S)
复制代码
抓取规则根据需要可自行调整。
然后。同样根据指定规则获取当前页面 所有img标签的图片链接。拿到图片链接,就可以实现下载图片到本地的操作。下载的代码稍后提供。
拿到源码中的 a标签链接后通过遍历链接递归调取get_page_urls获取所有相关页面的所有链接以及图片,为防止,网站中有重复调用的链接,这里先将每次成功抓取的链接备份到 usedUrl列表中。
最后提供下载图片的方法,实现比较简单。只是获取图片内容重写到本地文件中,为防止图片名称重复这里使用时间戳作为图片名:
def down_imgs(urls):
# 下载图片
for url in urls:
if url.startswith('http'):
result= requests.get(url)
timeSpan = str(int(round(time.time() * 1000)))
with open(config['downUrlBase']+timeSpan+'.jpg','wb') as f:
f.write(result.content)
log('图片名称:{0},原图片地址:{1}'.format(timeSpan+'.jpg',url),config['logImg'])
复制代码