python实现懒加载图片的下载

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

说做就做,笔主使用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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值