第一个python程序:爬虫下载课件

@python学习

第一个python程序:爬虫下载课件

任务:爬取学校网站中自己课程列表里老师上传的课件
思路:我们使用模拟用户操作的方式,使用火狐浏览器来帮助程序运行selenium webdriver

火狐浏览器驱动

我们要使用selenium webdriver来启动火狐浏览器,则需要下载驱动geckodriver.exe
下载地址:https://github.com/mozilla/geckodriver/releases/注意版本问题
下载、解压,将geckodriver.exe放到和python.exe同一个文件中(很多这部分异常问题都是版本问题、环境变量问题等)
模拟火狐浏览器

登录

分析源代码,找到登录框中“用户名”、“密码”、“登录按钮”的位置
登录模块的源代码
完成登录的代码

获得网页源代码

利用BeautifulSoup、正则表达式等来定位元素

模拟键盘点击

因为点击下载链接后会弹出弹窗,但是这个弹窗是没办法解析的,只能通过模拟键盘来点击按钮
弹出的弹窗
模拟键盘点击
这一部分因为不同的文件下载出现的情况不同,
例如pdf会直接在页面显示出来,而右上角会有下载的按钮,网页显示的pdf是可以解析的,所以定位到按钮,click点击后才弹出弹窗
例如压缩包会直接弹出弹窗

而某些文件打开会是网页乱码,这样的情况回退就可以了

安装相关包

  1. selenium等包直接pip install 安装就好了
  2. pykeyboard安装
    但是pykeyboard包不能直接安装
    需要先安装pywin32和pyHook
    而pyHook直接安装也不行
    首先查看自己的python版本
    python对应版本
    去https://www.lfd.uci.edu/~gohlke/pythonlibs/下载对应的包
    下载pyhook的包
    再pip install安装
    安装pyhook
    pykeyboard和pymouse一起集成到了PyUserInput库中,所以我们安装pykeyboard需要安装***PyUserInput***使用pip install PyUserInput 安装

所用到的包

from selenium import webdriver
from bs4 import BeautifulSoup
from selenium.common.exceptions import NoSuchElementException
import re
import time
from pykeyboard import PyKeyboard

分析网页循环下载部分

soup1 = BeautifulSoup(driver.page_source, "html.parser")  # 多模式首页

course = soup1.find('div', attrs={"class": "userCourseList"})  #定位到课程列表
course_url = course.find_all('a', href=True)
# 得到课程ID
course_id = re.findall('<a href="/iclass/netclass/course/index.php\?cid=(.*?)">', str(course_url))

for C_id in course_id:
    print(C_id)
    driver.find_element_by_xpath('//a[@href = "/iclass/netclass/course/index.php?cid='+ C_id +'"]').click()  # 打开课程链接
    driver.find_element_by_id('CLDOC').click()  # 打开资料下载区
    soup2 = BeautifulSoup(driver.page_source,"html.parser")  #某课程资料下载区界面
    pdf = soup2.find_all('a', attrs={"class": " item"})  # 定位到课件的位置
    # 得到课件的id
    pdf_id = re.findall('<a class=" item" href="/iclass/netclass/backends/download.php\?url=(.*?)&',str(pdf))

    if pdf_id:
        for P_id in pdf_id:
            pdf_name = driver.find_element_by_xpath('//a[@href = "/iclass/netclass/backends/download.php?url=' + P_id + '&cidReset=true&cidReq=' + C_id + '"]').text  # 找到课件名称

            driver.find_element_by_link_text(pdf_name).click()  # 点击PDF
            try:
                driver.find_element_by_id('download').click()  # 下载(只有pdf的课件才会打开有download按钮)
                # 键盘操作
            except NoSuchElementException:
                k = PyKeyboard()
                k.press_key(k.alt_key)  # 按住ALT键
                k.tap_key('s')  # 点击S键
                k.release_key(k.alt_key)
                k.tap_key(k.enter_key)  # enter键完成保存工作
                print(pdf_name)
            else:
                k = PyKeyboard()
                time.sleep(1)
                k.tap_key(k.alt_key)  #按住ALT键
                k.tap_key(k.enter_key)  # enter键完成保存工作

                print(pdf_name)
                driver.back() #回退到课件列表界面

        driver.back()
        driver.back()
        driver.back()  # 一直回退到课程列表界面,就算back多也只会停留在登录后的界面

    else:
        driver.back()
        driver.back()#回到课程列表
        continue
driver.close()

可优化

多增加异常处理
不要下载已经下载过的课件

总结

分析网页定位元素是一件特别累的事
soup.find
soup.findall
soup.find_all
re.find_all
re.findall
re.find
之间的区别、条件格式还不是很清楚
以及和text之间的关系,如何获得标签之间的文字,在这一部分经常要试错很多次

这是我的第一篇博客,写得自己都不够满意却又不知道如何修改了
这个程序已经完成很久了,但是又做一遍的时候还是会有一些问题
计算机这条路不知道能走多久,可能毕业了就离开了
有些时候觉得自己很爱它,特别是完成一些小功能时,但是这种时候真的太少了,十分没有信心
还是勉励一下自己,还有一些时间,还不算晚
纯粹一些,坚定一点!加油!

猜你喜欢

转载自blog.csdn.net/t1996ys/article/details/83931782
今日推荐