python爬虫获取指定网站所有连接下图片【单线程】

·  阅读 671

逻辑分解:

  • 第一步.获取入口网页源码
  • 第二步.解析源码获取页面中所有的跳转链接
  • 第三步.获取页面源码中所有的图片链接
  • 第四部.下载图片到本地文件夹
  • 第五步.递归重复二三四

实现逻辑:

首先,定义入口程序:

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'])
复制代码
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改