首页 > 编程语言 >python爬取教习网试卷下载

python爬取教习网试卷下载

时间:2024-02-01 17:34:23浏览次数:26  
标签:python doc 试卷 jpg 爬取 url path os id

#!/usr/local/bin/python3
# -*- encoding: utf-8 -*-
 
import requests
from lxml import etree
import os
from PIL import Image
import shutil
 
 
def get_doc_url(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.53"
    }
    try:
        response = requests.get(url=url, headers=headers)
        if response.status_code == 200:
            html = response.text
            all_doc_page = etree.HTML(html)
            doc_url = all_doc_page.xpath("//div[@class='list-bd']//div[@class='title fl']/a/@href")
            return doc_url
    except Exception as e:
        print("【请求失败,请检查URL和网络环境!】")
        print(e)
 
def jpg2pdf(doc_id):
    image_list = []
    for i in range(len(os.listdir(os.path.join("output", doc_id)))):
        image_path = os.path.join("output", doc_id, f"{i}.jpg")
        img = Image.open(image_path)
        if img.mode != "RGB":
            img = img.convert("RGB")
        image_list.append(img)
 
    pdf_path = os.path.join("output", doc_id, f"{doc_id}.pdf")
    image_list[0].save(pdf_path, "PDF", resolution=100.0, save_all=True, append_images=image_list[1:])
    if os.path.exists(f"output/{doc_id}/{doc_id}.pdf"):
        # 转换成功,删除原jpg文件
        print(f"{doc_id} 【转换为pdf成功!】")
        os.system(f"del /s /q output\\{doc_id}\\*.jpg")
        print(f"{doc_id} 文件夹图片已删除")
    else:
        # 转换失败
        print(f"{doc_id} 【转换失败,请检查!】")
 
def get_jpg(doc_url):
    for i in doc_url:
        url = "https://www.51jiaoxi.com/" + i[1:]
        headers = {
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36 Edg/105.0.1343.53"
        }
 
        response = requests.get(url=url, headers=headers)
        html = etree.HTML(response.text)
        doc_id = url.split("-")[1].split(".")[0]
        jpg_url = html.xpath("//div[@class='img-box']/img/@src")
        jpg_url_split = jpg_url[0].split("/")
        jpg_url_prefix = f"https://{jpg_url_split[2]}/{jpg_url_split[3]}/{jpg_url_split[4]}/{jpg_url_split[5]}"
        start_page_num = int(jpg_url[0].split(".")[2].split("/")[-1])
        show_page_num = len(jpg_url)
        no_show_page_num = html.xpath("//div[@class='remain-previews-inner']/span/span/text()")[0]
        all_page_num = int(show_page_num) + int(no_show_page_num)
 
        if not os.path.exists("output"):
            os.mkdir("output")
        if not os.path.exists(os.path.join("output", doc_id)):
            os.mkdir(os.path.join("output", doc_id))
 
        print("\n正在下载试卷: {}...".format(doc_id))
 
        for j in range(start_page_num, int(all_page_num)):
            jpg_url = f"{jpg_url_prefix}/0/{j}.jpg?x-oss-process=image/crop,h_1044,g_center/format,webp"
            response = requests.get(url=jpg_url, headers=headers)
            with open(os.path.join("output", doc_id, f"{j}.jpg"), "wb") as f:
                f.write(response.content)
 
        print("下载完成!")
        print("正在转换为pdf...")
        jpg2pdf(doc_id)
         
        print(f"已完成: 【{doc_url.index(i) + 1}/{len(doc_url)}】")
 
    print("\n全部下载完毕!\n")
 
def main():
    url = input("\n请输入成套试卷链接: ")
    while "album" not in url:
        print("【不是成套试卷链接,请重新输入!】")
        url = input("\n请输入成套试卷链接: ")
    doc_url = get_doc_url(url)
    if doc_url:
        get_jpg(doc_url)
    else:
        print("无法获取试卷链接,请检查输入的链接是否正确。")
 
if __name__ == "__main__":
    main()

 

标签:python,doc,试卷,jpg,爬取,url,path,os,id
From: https://www.cnblogs.com/anzhili/p/18001707

相关文章

  • python word 删除表格的指定列
    fromdocximportDocumentfromdocx.sharedimportCmdefdelete_columns(path,table_n,column_n):"""删除一列:parampath:路径:paramtable_n:第几个表格:paramcolumn_n:第几列:return:"""doc=Document(path)......
  • Python中的基础数据类型:List、Tuple和Dict及其常用用法简析
    在Python编程语言中,基础数据类型是构建程序的基本元素。这些基础数据类型包括List(列表)、Tuple(元组)和Dict(字典)。每种数据类型都有其特定的用途和特性,了解并掌握它们对于编写高效、可维护的Python代码至关重要。本文将深入探讨这三种基础数据类型,并通过代码示例展示它们的常用用法。......
  • Python3 操作ES7
    Python3操作ES7 Python3操作ES71、连接ES7,创建索引fromelasticsearchimportElasticsearches=Elasticsearch(['127.0.0.1:9200'])index_name='student'request_body={"mappings":{"properties":{......
  • python连接mysql8、sqlserver2012
    python连接mysql比较顺利,网上很多代码,连接sqlserver的例子少,且很多错误,尝试很多帖子,最后成功代码如下。#连接mysqlimportpymysqldefconn():try:connection=pymysql.connect(host='localhost',port=3306,user='root',password='123456',database='cl&#......
  • python 魔术方法
    __init__、__new__、__del__构造方法__new__触发时机:实例化对象时自动触发(在__init__之前触发)参数:至少一个cls接收当前类,其他参数根据初始化方法参数决定返回值:必须返回一个对象实例,没有返回值,则实例化对象的结果为None作用:实例化对象注意:实例化对象是Object类底层实现,其......
  • Python | json文件和jsonl文件
    Python|json文件和jsonl文件JSON文件是使用JSON(JavaScriptObjectNotation)格式存储数据的文件。它是一种结构化的文本格式,使用键值对的方式表示数据。JSON文件通常包含一个根对象,可以包含多个嵌套的对象、数组和基本数据类型。而JSONL文件(JSONLines),则是一种每行包含一......
  • python提取PDF中表格数据到数据库
    工作中遇到的问题:需要从PDF中提取表格数据,并数据落到MySQL库中。具体情况如下图所示:目录页:代码数据页:使用python实现代码如下(水平有限,此代码仅供自用):importpdfplumberpdf=r'XXX.pdf'wookroot=pdfplumber.open(pdf)pages=wookroot.pagestable_text=''forpage......
  • pyqt报错、python报错:src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没
    报错信息:-DNDEBUG-fwrapv-O2-Wall-fPIC-O2-isystem/home/devil/anaconda3/envs/91/include-fPIC-O2-isystem/home/devil/anaconda3/envs/91/include-fPIC-I/usr/local/include-I/usr/include-I/home/devil/anaconda3/envs/91/include/python3.10-csrc/pyaudio......
  • Python实现学生信息管理系统
    学生信息管理系统系统设计系统功能结构 录入学生信息模块查找学生信息模块删除学生信息模块修改学生信息模块学生成绩排名模块统计学生总人数模块显示全部学生信息模块系统业务流程 用户->主界面->功能菜单->选择功能->是否为0->y->结束程序主函数设计 主函数的业务......
  • Python时间序列分析苹果股票数据:分解、平稳性检验、滤波器、滑动窗口平滑、移动平均、
    全文链接:https://tecdat.cn/?p=33550原文出处:拓端数据部落公众号什么是时间序列?时间序列是一系列按时间顺序排列的观测数据。数据序列可以是等间隔的,具有特定频率,也可以是不规则间隔的,比如电话通话记录。在进行投资和交易研究时,对于时间序列数据及其操作要有专业的理解。本文......