IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Python Spider: 超星图书爬取转换

    Reverland (lhtlyy@gmail.com)发表于 2015-04-04 00:00:00
    love 0

    超星数字图书馆(北邮镜像): 在线阅读书籍爬取转换(selenium)

    我忧心忡忡地看待未来,但仍满怀美好的希望。

    —— Albert Schweitzer

    这次推荐selenium,自从有了selenium,爬虫从来没有这么简单过。


    几天前,一个工作的同学想让我帮他借一本书《聚酰亚胺新型材料》,他工作上需要看这本书的一些内容,但是这本书已经绝版,网上也没有出售。

    于是我帮他搜索了下,图书馆里没有这本书。忽然想起来我邮还买了很多电子资源。

    于是从图书馆主页选择电子图书->超星数字电子图书数据,进入如下页面。

    搜索了下这本书,找到了一本。

    太棒了,下载下来……额……下载需要阅读器……

    对一个伪geek最讨厌的事情之一就是,某个牛比的企业倚杖其资源绑架用户安装所谓的客户端。比如讨厌的腾讯和讨厌的淘宝。

    自然也不会下载什么阅读器,但是,既然可以在线看,那么就可以下载下来。实在在不行我浏览器截图行么。

    selenium让一切成为可能(包括截图)。

    让我们在线阅读:

    在线阅读提供了一些功能,包括索引、目录和文字提取,悲剧的是下载下来之后转成的pdf可没有这么多道道。虽然,如果肯花时间解决这些都不是问题……但是,我们又不是想pirate电子书……

    对页面按右键发现这是个图片!接着观察对应的源码发现,是一个input标签,仔细观察这个input标签你可以看到很多属性,比如比较重要的class、scr、src、jpgname。

    仔细多观察一个,你会发现,class是Jimg的似乎都是书页内容、jpgname属性是页码、scr和src好像都是书页图片地址。

    你可以试试。说服自己那些就是书页图片地址

    多看几个发现下面的页面其实src属性都是假的,猜测是书页滚动到某个页面,通过js动态修改src来实现实时加载而不是一下全加载。

    那么,我们抓取当前网页阅读页面所有class属性是Jimg的input标签的scr标签,就可以获取所有书页的图像了。

    接下来,看看selenium是多么丧心病狂……

    我们把以上所有从搜索到在线阅读的过程自动化……

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import sys
    import time
    import os
    import imghdr
    import urllib
    import urllib2
    from selenium import webdriver
    
    # bookname = u'聚酰亚胺新型材料'
    try:
        bookname = unicode(sys.argv[1], 'utf-8')
    except:
        print "[Usage:] chaoxing.py bookname"
        sys.exit(1)
    driver = webdriver.Firefox()
    
    # 首先搜索
    
    url = 'http://sslibbook2.sslibrary.com'
    
    driver.get(url)
    time.sleep(1)
    
    # 输入书名
    driver.find_element_by_id('sword').send_keys(bookname)
    # 检索
    driver.find_element_by_class_name("btn-jiansuo").click()
    # 检索结果
    driver.switch_to_frame('book')
    time.sleep(3)
    
    assert(len(driver.find_elements_by_class_name('yy')) > 1)
    # 确认书名
    assert(driver.find_elements_by_class_name('yy')[0].text
           == u"《" + bookname + u"》")
    # 确认有网页阅读
    assert(driver.find_elements_by_class_name('yy')[1].text == u'网页阅读')
    
    bookurl = driver.find_elements_by_class_name('yy')[1].get_attribute('href')
    
    driver.get(bookurl)
    
    # where img locate
    base_url = "http://" + urllib2.urlparse.urlparse(driver.current_url).netloc
    
    assert(driver.page_source.find(u'超星') >= 0)
    
    pages = driver.find_elements_by_xpath('//input[@class="Jimg"]')
    
    filelist = [e.get_attribute('jpgname') for e in pages]
    
    imglist = {}
    
    for e in pages:
        imglist[e.get_attribute('jpgname')] = base_url + e.get_attribute('scr')
    
    for k, v in imglist.iteritems():
        if os.path.exists(k):
            continue
        try:
            urllib.urlretrieve(v, k)
            assert(imghdr.what(k) == 'png')
        except Exception, e:
            print e
    
    cmd = u'convert ' + u' '.join(filelist) + ' ' + bookname + u'.pdf'
    cmd = cmd.encode('utf-8')
    os.popen(cmd)

    稍微解释下,最后,是用imagemagick把一大堆png格式的书页内容转化成pdf格式。这个过程相当耗内存……如果有空就想想怎么换种方式转pdf,也愿各位看官能指教下。

    当然,我并没有把pdf传给任何人,我看完之后跟同学讲了讲,没有做任何盗版行径。同学们也要遵守用户守则,不要乱搞。

    让我们引以为戒 Aaron Swartz

    Aaron Swartz

    非法下载书籍的罪名是非常非常严重的!!!!!




沪ICP备19023445号-2号
友情链接