python实现懒加载图片的下载

来源:互联网 发布:mac充电黄灯一直亮 编辑:程序博客网 时间:2024/04/25 21:51

最近接了一个需求,需要爬取阿里巴巴网站上指定网址的详情图片,想来是个很容易的事情,也就需要采集一下网页,在此基础上做一些匹配性质的操作就应该可以了,也就是顺手而为的事情。

说做就做,笔主使用python很快的把网页采集出来,很快的把需要的图片截取出来,很快的把图片下载下来(嗯,效率还是很快的)。好了,开始测试,输入网址列表的文本文件,等待。。。,恩,输出是空的,输出是空的!看下采集的网页文件,恩,网页里竟然不包含我需要的字段!!我在网页上明明能看到呀,为啥这边就没有呢?好吧,回去看下网页上为啥会有,原来人家使用了优化策略,详情是通过js的懒加载技术实现,代码中采集的网页当然不可能解析js了,肿么办呢?(跟人家说分分钟的事情Orz)

冷静!

现在想想我们要解析网页上的js我们有哪些方法,恩,我如果写一段js代码在浏览器里跑一下我就能得到我想要的图片列表,但是js不能帮我保存图片呢,恩,我可以将得到的图片url列表丢给后端让后端下载,批量下载后,打包,再在前端的页面上给个下载链接,供人下载(我真是个天才!!)。不过好麻烦啊,需要人参与的地方还是很多的,有没有什么可以优化的地方呢?要是可以在代码中加载浏览器内核就好了。

搜索中。。。

咦,发现个好东西,phantomjs selenium python,再次感叹下网络带来的便利性。相关的安装什么的我就不说了,其实也很简单啦!读者有兴趣可以自己装装。

好了,不说废话了,我们该干正事了。

首先,我们要抓取到我们需要的那段html代码,既然是懒加载,我们一直将控制条拖到最底部不就好啦!然后我们根据element的id就可以获得我们想要的那段代码,下面是实现详情。

def get_page_source(url):    driver = webdriver.PhantomJS()    driver.set_window_size(1120, 550)    driver.get(url)    lastHeight = driver.execute_script("return document.body.scrollHeight")    while True:        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")        time.sleep(1)        newHeight = driver.execute_script("return document.body.scrollHeight")        if newHeight == lastHeight:            break        lastHeight = newHeight    element = driver.find_element_by_id('desc-lazyload-container')    outerhtml = element.get_attribute("outerHTML")    driver.quit()    return outerhtml

html代码片段有了,接下来我们该截取图片url字段了。

def get_image_url_list(html):    url = []    for v in html.split():        if v.startswith('src="'):            url.append(v.split('"')[1])    return url

下载呢?

def download_images(urls, pre='/tmp'):    sfn = 11;    for url in urls:        file_name = '{}/{}.{}'.format(pre, sfn, url.split('.')[-1])        with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:            data = response.read()             out_file.write(data)        sfn +=1

顺便也贴个打包的代码吧!

def zipdir(path, ziph):    for root, dirs, files in os.walk(path):        for file in files:            ziph.write(os.path.join(root, file))

好了,至此功能也算完成了,唯一不和谐的就是需求方那幽怨的眼神,说好的秒秒钟的事情呢!!

0 0
原创粉丝点击