V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ouankou
V2EX  ›  Python

终于写出了第一个Python小程序,批量下载单页pdf

  •  
  •   ouankou ·
    ouankou · 2012-08-14 16:09:34 +08:00 · 7251 次点击
    这是一个创建于 4266 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前几天找本很老的书,纸质书只有图书馆有,电子版要么上淘宝买要么到论坛上灌水刷金币买。好不容易找到一个网站可以在线看,但只能单页保存,GF帮忙点了好久才下了几十页。于是就想试着写个脚本批量下载。
    一个高手看起来巨简单的的程序,我在官网上看了N久的库文献加上N多google代码片段,断断续续写了3天才出来,不过总算稍微入点门了⋯⋯
    代码如下,看那一堆注释就知道每一步我都要调试几遍才能过去。最后组合单页pdf,去水印本来也想直接完成的,但mac终端下没有现成的程序,准备手动用Acrobat完成了。
    因为我没有看几页《A byte of Python》就开始写了,只是想完成需求就好了,所以写得肯定有好多不正规的地方。请大家帮忙指点一下,哪些地方可以改进或是写得更正规一点?
    谢谢啦!


    #下载西山电子书
    import urllib.request
    import re
    import os
    #循环 次数=书页数
    for i in range(1, 231):
    #get pdf所在网页
    fileHandle = urllib.request.urlopen('http://www.bjmem.com/bjm/bjwh/include/showpdf.jsp?bookId=5259&xuhao=' + str(i) + '&pdfuri=/bjm/bjwh/zrdl/200711/')
    #打开网页文件搜索SRC一行,读取pdf网址
    pagesrc = str(fileHandle.read(), 'utf-8')
    fileHandle.close()
    # print (pagesrc)
    posbegin = re.search('PARAM NAME="SRC" VALUE=', pagesrc)
    # print (posbegin.end())
    #original = re.compile(pagesrc)
    #print (original)
    posend = re.search('.pdf', pagesrc)
    # print (posend.end())
    # print (pagesrc[posbegin.end():posend.end()])
    pdfaddress = 'http://www.bjmem.com/' + pagesrc[posbegin.end():posend.end()]
    # print (pdfaddress)
    #wget下载pdf,并按页码命名
    cmd = 'wget -c ' + pdfaddress + ' -O bjxs' + str(i) + '.pdf'
    os.system (cmd)
    #print (url)
    #用工具组合pdf为一个文件
    12 条回复    1970-01-01 08:00:00 +08:00
    TheSe7en
        1
    TheSe7en  
       2012-08-14 16:36:07 +08:00
    贊一個!
    neildd
        2
    neildd  
       2012-08-14 16:39:02 +08:00
    其实文件名是流水号的话,用wget一个命令就完成了,根本用不着写脚本。
    ouankou
        3
    ouankou  
    OP
       2012-08-14 16:43:02 +08:00
    @neildd 问题就是网页参数是流水号,而且从-6开始,变态⋯⋯。pdf地址内尾部是随机的6位数字,至少我看不出什么规律,所以就手动提取了。

    类似这样的,最后六位数字每页都不同。
    <PARAM NAME="SRC" VALUE=/bjm/bjwh/zrdl/200711/P020071117503730461643.pdf>
    zern
        4
    zern  
       2012-08-14 17:05:30 +08:00
    欢迎LZ来我的豆瓣pdf小站寻找古本PDF哈哈

    http://site.douban.com/171180/

    介绍分享珍稀古本或优质PDF文件
    --
    huihen
        5
    huihen  
       2012-08-14 20:06:12 +08:00
    楼上不错
    armoni
        6
    armoni  
       2012-08-14 20:16:34 +08:00   ❤️ 1
    curl提取pdf地址,然后wget,这事儿还是shell好使
    twor2
        7
    twor2  
       2012-08-14 21:13:46 +08:00
    赞一个
    zhaobei92
        8
    zhaobei92  
       2012-08-17 18:30:35 +08:00
    pagesrc = str(fileHandle.read(), 'utf-8') 这句好像不能实现吧。
    ouankou
        9
    ouankou  
    OP
       2012-08-17 18:34:22 +08:00
    @zhaobei92 是的,那个编码选错了,这里贴的代码已经改了不少。这句改成了:
    pagesrc = str(fileHandle.read(), 'euc-jp', 'ignore')

    请参见:
    https://github.com/ouankou/Caribrenamer
    ouankou
        10
    ouankou  
    OP
       2012-08-17 18:35:59 +08:00
    @zhaobei92 哦⋯⋯不好意思,回复错了。

    这个脚本可以正常实现啊,已经下完整本书了。
    zhaobei92
        11
    zhaobei92  
       2012-08-17 18:40:06 +08:00
    @ouankou 难道你用的是python3.0 .我用python2.7提示str里只能给一个参数啊。
    ouankou
        12
    ouankou  
    OP
       2012-08-17 18:49:34 +08:00
    @zhaobei92 哦,是的,不好意思,没有说明。我确实用的Python3,可能有些语句用法不完全一样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2673 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:01 · PVG 10:01 · LAX 19:01 · JFK 22:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.