mrbendan8023
V2EX  ›  Python

学科网预览文档打印求助

By mrbendan8023 at 2023 年 11 月 26 日 · 2799 次点击

各位老哥早上好,家里孩子上初中了经常需要各种试卷,我负责给他找试卷,主要用到的几个网站:学科网、组卷网和菁优网,之前有个 python 脚本可以把学科网的预览页面进行解析生成 html 文档,然后借助浏览器打印成 pdf 。但是最近学科网的文档预览机制(或者代码)好像做了修改,现在能够获取到的内容只有一部分,之前是可以全部预览的。那位老哥路过有时间帮忙看看或者分析下。 之前使用的代码如下:

import requests
from re import findall, sub
from hashlib import md5

HTML_FORMAT ='''
<html>

<head>
<title>{title}</title>
</head>

<body>
{body}
</body>

</html>
'''

def writefile(filename,text):
    filename = sub(r"""[\*\/\\\|\<\>\? \:\.\'\"\!]""", "", filename)
    unique = md5(text.encode())
    filename += "_"+unique.hexdigest()[:5]
    filename+=".html"
    print("Writing "+filename)
    # print("-=-=-=-=\n",text,"\n-=-=-=-=")
    with open(filename+'.html', 'w', encoding="utf-8") as f:
        f.write(text)

def main():
    softID=input("ID: ")
    url = "https://www.zxxk.com/soft/Preview/FirstLoadPreviewJson?softID={}&type=3&product=1&v=2&FullPreview=true"
    response = requests.get(url.format(softID))
    if response.status_code!=200:
        print("ERROR")
        print(response.status_code)
        return -1
    ret=response.json()["data"]
    if not ret["IsSuccess"]:
        print("ERROR: IsSuccess option is not true")
        print(ret)
    if not ret['IsRar']:
        print("Not rar")
        print("TotalPage=%d" % ret['TotalPage'])
        print("SoftExt=%s" % ret['SoftExt'])
        try:
            html=ret["Html"]
            print(ret)
        except:
            print(ret)
            exit(1)
        # replace "data-original" to "src" for showing in browser
        html=html.replace("data-original", "src")
        writefile(f"{softID}",html)
    else:
        print("is RAR")
        rar=ret['rarPreviewInfo']
        for file in rar:
            html=file["Html"]
            title=file["SoftName"]
            # replace "data-original" to "src" for showing in browser
            # html=html.replace("data-original", "src")
            urls=findall("(?<=data-original=\") https://preview.zxxk.com/\\S+(?=\")",html)
            l=[]
            for url in urls:
                if "jpg" in url:
                    l.append(f"<img src={url} />")
                    continue
                page=requests.get(url,cookies=response.cookies)
                if not page.status_code==200:
                    print(page)
                    print(page.status_code)
                    print(page.text)
                assert page.status_code==200
                l.append(page.text)
            format_html=HTML_FORMAT.format(title=title,body="\n".join(l))
            writefile(title,format_html)

if __name__  == "__main__":
    while True:
        main()
        

然后试卷的地址:https://www.zxxk.com/soft/40662248.html

6 条回复
ricklei2777
   1
ricklei2777  
   2023 年 11 月 26 日   ❤️ 1
着急的话看看这个 http://www.toolsba.top/
ricklei2777
   2
ricklei2777  
   2023 年 11 月 26 日
@ricklei2777 但是这个预览机制貌似百度文库也是一样,感觉可以参考百度文库的下载方式?亦或者是高校图书馆权限,不过我所在高校没有权限,上某宝问问可能有效。
mrbendan8023
   3
mrbendan8023  
OP
   2023 年 11 月 26 日
@ricklei2777 #1 看到啦,感谢老哥的回复,我去试试。
zuoheming
   4
zuoheming  
   2023 年 11 月 26 日
初中物理(人教版的话)还没开始上力学吧,初二目前上到凸透镜成像、初三上到电功率、化学上到碳这个单元
mrbendan8023
   5
mrbendan8023  
OP
   2023 年 11 月 26 日
@zuoheming 对的啊,现在正在学习欧姆定律和电功率部分,试卷是随便找的。。。
zorchp1
   6
zorchp1  
   2023 年 11 月 29 日
可以试试百度文库高校版,
推荐学习书目
› 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
© 2026 V2EX · 34ms · 3.9.8.5