QQ海贼王漫画爬取日记之二破解JS

selenium firefox requests beautifulsoup 2016年09月09日 星期五

在上一篇中介绍了简单请求获取页面内容,页面是一段js渲染的,那就要破解js,若能够在爬取的时候执行这段js,那就OK了。

首先想着是否数据能够从接口直接调用,于是下载了http://ac.gtimg.com/media/js/ac.page.chapter.view_v2.3.4.js?v=20160826源码大概找了下,不出所料也是无功而返。

于是最后还是需要用上selenium,此次本地爬取数据,webdriver用的是Firefox,以下代码获取了一章节所有漫画图片li标签元素,遍历获取所有的图片链接。

driver = webdriver.Firefox()
driver.get('http://ac.qq.com/ComicView/index/id/505430/cid/1')
driver.find_elements(By.CSS_SELECTOR, 'ul#comicContain li')

for i in lis:
    if i.get_attribute('style'):
        print i.find_element(By.CSS_SELECTOR, 'img').get_attribute('src')

直接打印的时候会发现,只有前面3个左右会显示正确的URL,其他都是默认图,用firefox看了下,发现只有在缓慢下拉时才去加载,那这下需要模拟缓慢下拉去加载这些懒加载的图片了。

下面有两种缓慢加载策略,都是需要在获取图片链接前执行:

j = 0
for i in lis:
    driver.execute_script("window.scrollTo({}, {});".format(j, j + 1200))
    j += 1200
    time.sleep(0.3)
driver.execute_script("window.scrollTo(0, {});".format((len(lis) - 1) * 1200))
time.sleep(5)

这两种的思想都是利用执行js代码实现缓慢下拉动作。

但想想这糟糕的效率,也是郁闷,爬个一画都要10+分钟,就在思来想去没有好办的时候,偶然的情况下注意到了一个细节

对,就是js上面这些数据都有,要是能够直接返回这个js变量就好了,事实上这样是可行的

driver.execute_script("return window.PICTURE")

会返回该变量,并且转换为python的数据类型,这样一来算是大功告成一半了。

现在效率相对来说好了很多了 , 下一步就是整合代码高效率爬完整个海贼王漫画。