爬取教学立方上的pdf

教学立方是一个辅助上网课的平台,老师可以在上面发布课程相关的pdf,但是有时候老师并不会给文件设置下载。本文运用python以一个并不算简便的方法爬取教学立方上的pdf。

有更简单的方法!

有更简单的方法,可以直接下载,比直接爬出来的清晰多了!这个代码还是有兴趣再用吧,毕竟还要准备辣么多东西。
参考:
https://mp.weixin.qq.com/s/xXWPwoZDtbEBPtYNasgq4g

准备

一台装了python的电脑
安装chrome浏览器
安装相应版本的chromedriver
安装selenium,bs4,requests,img2pdf包

代码

参数设置

import time
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import img2pdf
import os
import shutil

url=[]
phonenumber=''
password='' # 在这里输入你的账号、密码
coursename='近代物理'
chromedriver = r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver" # 看你的chromedriver安装路径

进入课件

browser = webdriver.Chrome(chromedriver)
browser.get("https://teaching.applysquare.com/S/Index/index.html")
browser.maximize_window()
browser.find_element_by_xpath("/html/body/div[2]/div/div[2]/div/div/div/div/div[2]/div/div/div[1]/input").send_keys(phonenumber) 
browser.find_element_by_id("id_login_password").send_keys(password)
time.sleep(3) 
browser.find_element_by_id("id_login_button").click() # 完成登录
time.sleep(3) 
[k for k in browser.find_elements_by_class_name("coursename") if k.text=='课程 : '+coursename][0].click() # 点进相应课程
time.sleep(2) 
browser.find_element_by_xpath('//*[@id="wrapper"]/div/div[1]/div/div/ul/li[2]/a/img').click() # 点击资源
time.sleep(2) 
browser.find_element_by_xpath('//*[@id="wrapper"]/div/div[1]/div/div/ul/li[2]/ul/li[2]/a').click() # 点击课件

现在你已经能够看见老师发布的许多课件了,由于课件名称多样,懒得编代码,需要自己手动点击“查看”

获得课件图片的url

time.sleep(5) # 手动点击“查看”
#现在已经能够看到课件的第一页了
filename=browser.find_element_by_xpath('//*[@id="content_right"]/div[1]/div[1]/div[2]/div/div[1]/span').text # 获取文件名
max_page=int(browser.find_elements_by_class_name("t-gray")[-1].text[1:])
for i in range(max_page-1):
    browser.execute_script('window.scrollBy(0,25000)')
    content=BeautifulSoup(browser.page_source,'html5lib')
    pic=content.find_all('div','lesson-pdf-content')[0].img.attrs['src']
    url.append(pic)
    #browser.find_elements_by_tag_name("input")[0].send_keys(i+2) # 这个是直接跳转页面
    time.sleep(1)
    browser.find_element_by_xpath('//*[@id="content_right"]/div[1]/div[1]/div[3]/div/div[1]/a[2]').click()
     # 进入下一页
     
browser.execute_script('window.scrollBy(0,25000)')
content=BeautifulSoup(browser.page_source,'html5lib')
pic=content.find_all('div','lesson-pdf-content')[0].img.attrs['src']
url.append(pic)  # 由于循环设置不佳,这里还需要得到最后一个网址 

但是有的时候老师上传的是个pptx,下载下来还打开不了,如果后面报错的话,你可以试着打开一个网址,看看下载下来的是什么东西。

存储图片并转化为pdf

folder = os.getcwd() + '\\'+coursename+'图片'
os.makedirs(folder) # 创建一个暂时放图片的文件夹

for i in range(len(url)):
    r = requests.get(url[i])
    with open(folder+'\\'+str(i)+'.png', 'wb') as f:
        # 对于图片类型的通过r.content方式访问响应内容,将响应内容写入png中
        f.write(r.content)

def from_photo_to_pdf(photo_path):
    # 1、生成地址列表
    photo_list = os.listdir(photo_path)
    photo_list.sort(key = lambda x: int(x[:-4]))
    photo_list = [os.path.join(photo_path,i) for i in photo_list]

    # 1、指定pdf的单页的宽和高
    a4inpt = (img2pdf.mm_to_pt(794), img2pdf.mm_to_pt(1122)) # 爬不同pdf记得改尺寸960,720;793,1122;
    layout_fun = img2pdf.get_layout_fun(a4inpt)
    with open(os.getcwd()+'\\'+coursename+filename+'炮'+'.pdf', 'wb') as f: # 文件名格式不一样,需要加一个字防错
        f.write(img2pdf.convert(photo_list, layout_fun=layout_fun))

if __name__ == '__main__':
    photo_path = folder
    from_photo_to_pdf(photo_path)
    shutil.rmtree(folder) # 删除存放图片的文件

注意事项

  1. 有个地方需要自己手动点击
  2. 只能用于下载pdf,有的时候老师发布的是pptx就不太行 可以爬pptx,不过点进网址直接下载下来打不开,用requests就行了

这个代码只是写着玩的,不建议传播老师的课件。
以同样的原理可以爬取很多东西。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值