使用Selenium+PhantomJS抓取腾讯动漫漫画图链接

4,930次阅读
6 条评论

共计 1855 个字符,预计需要花费 5 分钟才能阅读完成。

前言

上周一位朋友在进行一些项目开发时,其中需要用到腾讯动漫中动漫的图片,但是自己手动一张一张另存为图片进行保存太浪费时间了,于是就用 Python 来进行抓取,但是很无奈腾讯动漫的章节动漫 DOM 元素是异步加载的,另外图片也使用了懒加载,使用一般的抓取方式肯定是行不通,于是我们就进行分析了一波,最终成功的获取到图片链接,之后就可以为所欲为了~ 使用 Selenium+PhantomJS 抓取腾讯动漫漫画图链接

正文

首先,我们需要选取一部动漫,就拿 《最强兵王》 作为例子吧,获取他第一章节的 url,即为http://ac.qq.com/ComicView/index/id/631111/cid/4,首先我们先看看页面渲染的 HTML:
使用 Selenium+PhantomJS 抓取腾讯动漫漫画图链接
由上图可以看出,漫画的主题部分均是使用 JS 模板来进行渲染的,所以我们需要等页面加载完成之后,在获取他的 HTML 元素:

from selenium import webdriver
import time
if __name__ == '__main__':
    driver = webdriver.PhantomJS()
    driver.get("http://ac.qq.com/ComicView/index/id/631111/cid/4")
    time.sleep(3)
    out_html= driver.find_element_by_xpath("//*").get_attribute("outerHTML")

上述代码中,我们将 webdriver 获取到页面之后进行睡眠 3 秒(即为等待 3 秒后继续执行下面的代码),那么这个时候 JS 已经将完整的漫画 DOM 元素渲染完成,我们就可以直接获取到渲染之后的完整的 HTML。

不过这个时候我们发现一个问题:就是所有的漫画内的图片的 URL 都是相同的:
使用 Selenium+PhantomJS 抓取腾讯动漫漫画图链接
然后进行简单的测试发现,漫画章节图使用了懒加载的模式,即为滚动到某个图片的上方固定 PX 值时才进行加载真实的 URL 图片,那么我们就需要执行一段 JS 来模拟浏览器滚动,但是滚动不能太快,否则懒加载不会进行图片加载。修改之后的代码为:

driver = webdriver.PhantomJS()
    driver.get("http://ac.qq.com/ComicView/index/id/631111/cid/4")
    time.sleep(3)
    driver.execute_script("""
        var temp_index = 100;
        setInterval(function(){window.scrollTo(0,temp_index+=100);
        },30);
    """)
    time.sleep(5)
    out_html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")

到这一步,我们就拿到了动漫章节包含真实的图片 URL 的完整 HTML 代码,接下来就可以为所欲为了,这里我使用了 BeautifulSoup 来进行获取属性值,所以最终的代码脚本为:

from selenium import webdriver
import time
from bs4 import BeautifulSoup

if __name__ == '__main__':
    driver = webdriver.PhantomJS()
    driver.get("http://ac.qq.com/ComicView/index/id/631111/cid/4")
    time.sleep(3)
    driver.execute_script("""
        var temp_index = 100;
        setInterval(function(){window.scrollTo(0,temp_index+=100);
        },30);
    """)
    time.sleep(5)
    out_html = driver.find_element_by_xpath("//*").get_attribute("outerHTML")
    soup = BeautifulSoup(out_html)
    comic_contain = soup.find('ul', id='comicContain')
    img_list = comic_contain.find_all('img', class_='loaded')
    for i in img_list:
        print(i['src'])  # 章节内每个漫画图的真实 URL

效果为:
使用 Selenium+PhantomJS 抓取腾讯动漫漫画图链接

后记

总体来说,本次代码的编写过程还算顺利,其对整个的情况分析也是比较清楚,另外现在越来越多的网站都是使用的异步加载,感觉之后又要有一波新的技术即将来袭~ 使用 Selenium+PhantomJS 抓取腾讯动漫漫画图链接

正文完
使用官方微信小程序体验更多功能
post-qrcode
 6
憧憬Licoy
版权声明:本站原创文章,由 憧憬Licoy 于2018-09-04发表,共计1855字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(6 条评论)
小亚 评论达人 LV.1
2020-03-11 17:29:08 回复

:wink: 厉害,老哥

 Windows  Chrome  中国山东省济南市联通
cess 评论达人 LV.1
2018-10-09 11:09:52 回复

666.真的厉害。以前家里没有网,看小说就是是一张一张保存网页,超级惨,哈哈哈。

 Windows  Chrome  中国江苏省常州市电信
广州网站建设 评论达人 LV.2
2018-09-06 09:40:28 回复

每日签到,生活更精彩 ~:2018-09-06 9:40:28

 Windows  Chrome  中国广东省广州市电信
Dont 评论达人 LV.1
2018-09-04 13:45:06 回复

看起来用puppeteer也可以实现的样子。
话说回来,看打印出来的图片地址后面跟上`/0`是什么意思?

 Windows  Chrome  中国广东省广州市电信
    憧憬Licoy 博主
    2018-09-04 13:47:37 回复

    @Dont 看了一下Puppeteer的相关介绍,实现功能应该是没问题的;图片地址后面/0可能是一个路径变量吧,这个具体不清楚,不过我所需要的就是能够获取到图片资源就好。

     Windows  Chrome