吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2390|回复: 5
收起左侧

[会员申请] 申请会员ID: lightninng【申请通过】

[复制链接]
吾爱游客  发表于 2021-11-18 20:25
1. 申请ID:  lightninng
2. 个人邮箱:lightninng@sina.com
3. 原创文章
python爬虫在工作中的简单应用——自动校时小程序

3.1背景
        本人是某十八线小山村的信息技术老师,因为计算机教室的机器购置时间较长,会出现各种各样的问题,其中一个比较烦人的问题就是——部分机器重启后日期和时间会编程机器刚购买时的年份,这导致在浏览网页时会有各种莫名奇妙的问题(最明显的,chrome会直接提示时间有问题)。这个问题大概率是因为主板电池没电,不过一体机拆卸繁琐,而且这批机器即将更换,重新换电池不仅麻烦,而且没有必要性。于是,硬件走不通的情况下,我们通过软件来实现相关的功能呢。
2.技术路线
2.1ntp时间服务器
        这个路线应该说是最标准的方式了,可以使用网络上的ntp服务器或者在本地服务器上开一个ntp的服务。不过用过windows自动校时的朋友应该知道,这个东西有时候也会出现莫名其妙的不更新的问题。而且这个问题在网上也没找到相关的解释。所以,在一番斗争之后,放弃了这个路线。
2.2开机自启校时小程序
        放弃了2.1方案之后,考虑到平时我使用的方式都是下发一个设定当前时间和日期的批处理程序,让学生自己运行批处理来校准时间。所以自然而然的想到写一个小程序,并设定为开机启动来校准程序。
       考虑到微软自动校时可能是由于时间服务器访问的问题导致的,以前在解决这个问题的过程中,试过各种ntp服务器,还是会出问题。所以本次通过爬虫方式直接从网页中获取日期和时间。
3.代码
[Python] 纯文本查看 复制代码
import requests
from bs4 import BeautifulSoup
import os
import time

#在20s中尝试校准时间,20s中不成功则关闭程序
start_time = time.time()
while(True):
    try:
        #从[url=https://time.tianqi.com/]https://time.tianqi.com/[/url]获取响应数据
        s = requests.Session()
        r = s.get(url="http://time.tianqi.com/",
              headers={"user-agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"}
              )

        #使用bs4进行数据解析
        soup=BeautifulSoup(r.text,'html.parser')
        time_date = soup.find("div",class_="time_date")

        #获取时间和日期相关
        hour = time_date.find("p",class_="hour_box").text
        minute = time_date.find("p",class_="minute_box").text
        second = time_date.find("p",class_="seconds_box").text
        year,m_d = time_date.find_all("span")[2].text.split("年")
        month,day = m_d.split("月")
        day = day.split("日")[0]

        #使用windows命令行命令设置日期和时间
        os.system(f"date {year}-{month}-{day}")
        os.system(f"time {hour}:{minute}:{second}")
        break
    except :
        #循环上述程序,程序出错时检查运行时间,超过20则结束循环退出程序
        if time.time()-start_time>20:
            break
        print(1)
        time.sleep(0.8)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2021-11-19 10:32
抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
吾爱游客  发表于 2021-11-19 13:26
Hmily 发表于 2021-11-19 10:32
抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。

其实手头还有一个在做的禁毒禁赛的答题程序,申请论坛账号的冲动也是来源于这里,坛子里的东西似乎都是自己登录用户名密码,然后自动答题,我做的是批量答题的
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1533853&highlight=%B5%DA%B6%FE%BF%CE%CC%C3
准备整理一下思路发到坛子里(包括完整的代码,打包的程序,以及设计的思路),不过因为工作事情也挺多的,所以整理比较慢,题库处理部分的代码完成了,我先贴上来,其他部分但是自己的写代码,里面会有很多可以优化的地方,我先把程序运行的效果发个图
请求管理员大大,先给我通过~~
####题库处理模块
import docx
import sys #为了获取sys.argv[1]——外部传入的第1个参数
import pickle

def get_question_bank(file):
    # 读取原始题库docx文件,返回去除空行后的每行文本(列表)
    doc = docx.Document(file)
    result=[]
    for p in doc.paragraphs:
        line=p.text.strip()         #去两端空格、回车
        if line:                    #去空行
            result.append(line)
    return (result)

def get_chinese(string):
    #提取string的中文字符
    import re
    return "".join(re.findall(r'[\u4e00-\u9fa5]|[0123456789]',string))

if __name__=="__main__":

    all_text =get_question_bank("2021年全国青少年禁毒知识竞赛中学组题库.docx")
    question_bank={}                             #题库字典,key为题目,value为答案
    question = ""
    anwsers={}
    for line in all_text:
        split_list = [i.strip() for i in line.split(".")]
        if str.isdigit(split_list[0]):           #"."前面为数字则为题目
            question = "".join(split_list[1:])
            if question in question_bank:        #检查是否有重复题目
                print(question)
        elif str.isalpha(split_list[0]):
            rest_line = line
            for option in ["D.","C.","B.","A."]:
                if option in rest_line:
                    anwsers[option[0]]=rest_line.split(option)[1].strip()
                    rest_line=rest_line.split(option)[0]                                                        
        elif "答案" in  split_list[0]:
            anwser_index=line.split(":")[1].strip()      #获取答案(默认题目格式统一,未区分中文和英文分号)
            question_bank[get_chinese(question)]=anwsers[anwser_index]
            question = ""
            anwsers={}
        else:
            question+="".join(split_list)                #当问题为多行时拼接

    pickle.dump(question_bank,open("question_bank","wb")) #将题库字典存入question_bank文件中       


程序运行效果
链接:https://pan.baidu.com/s/1pEpMAWCnhrgx5bb3PlTbNg
提取码:2gab
吾爱游客  发表于 2021-11-20 13:20

申请会员ID: lightninng

呼叫审核大大,能先给我通过,然后我慢慢编辑发个完整的到编码板块去,主要是不想造两遍轮子~~
目前完成了个头,语文水平有限,写的东西经常自己回头看发现看不懂,所以还在考虑怎么写,贴个总体设计
未命名文件.jpg
还有个已经写好的模块,也先放上来吧。
1.使用selenium模块,每个人chrome版本不同,所以用程序自动获取对应版本的chromedriver.exe。
2.封装一些创建chromediver对象的参数进去,主要是想简单的通过一个参数控制是否显示网页窗口。
[Python] 纯文本查看 复制代码
# selenium配套模块,用来检验chromedriver是否匹配,下载匹配的chromdriver

import winreg
import os
import urllib
import urllib.request
import winreg
import re
import sys
import zipfile


from selenium import webdriver
from selenium.common.exceptions import WebDriverException


def unzip_single(src_file, dest_dir, password=None):
    if password:
        password = password.encode()
    zf = zipfile.ZipFile(src_file)
    try:
        zf.extractall(path=dest_dir, pwd=password)
    except RuntimeError as e:
        return False
    zf.close()
    return True


def get_match_version():
    ## 获取最接近本机chrome版本的chromedirver版本号
    
    # 获取本机chrome版本号
    try:
        chrome_version = winreg.QueryValueEx(winreg.OpenKey(winreg.HKEY_CURRENT_USER,'Software\Google\Chrome\BLBeacon'),'Version')[0]
    except:
        raise WebDriverException("未安装chrome!")

    # 访问服务器
    try:
        urlRead = urllib.request.urlopen(urllib.request.Request('https://npm.taobao.org/mirrors/chromedriver/')).read().decode()
    except:
        raise WebDriverException("服务器连接失败!")
    
    # 从服务器的响应中解析可下载的chromedriver版本号
    version_list = [i.split('/">')[0] for i in re.findall('<a href="/mirrors/chromedriver/(.*?)</a>',urlRead)]

    # 迭代判断与本机chrome最接近的chromdriver版本号
    version_list = [i for i in version_list if str.isdigit("".join(i.split(".")))]
    the_closest_version = version_list[0]   # 初始值为第一个版本号,然后开始迭代
    for version in version_list:
        if int("".join(chrome_version.split(".")).ljust(15,"0"))>=int("".join(version.split(".")).ljust(15,"0")):
            the_closest_version = version
        else:
            break
    return the_closest_version
    

def download_chromedirver():
    # 获取匹配度最高的chromedriver版本号
    the_closest_version = get_match_version() 
               
    # 下载服务器上的chromedriver并解压,默认下载32位chromedriver,可同时适用与32与64位chrome上
    try:
        urllib.request.urlretrieve('https://npm.taobao.org/mirrors/chromedriver/'+the_closest_version+'/chromedriver_win32.zip','chromedriver_win32.zip')
    except:
        raise WebDriverException("chromedriver下载失败!")
    else:
        if unzip_single('chromedriver_win32.zip',''):
            print("下载成功!")
        else:
            raise WebDriverException("chromedriver下载失败解压失败!")

def get_browser(view_flag=1):
    chrome_opt = webdriver.ChromeOptions()    # 创建参数设置对象.
    if view_flag == 0:
        # 设置为无界面化运行
        chrome_opt.add_argument('--headless')   # 无界面化.
        chrome_opt.add_argument('--disable-gpu')    # 配合上面的无界面化.
    chrome_opt.add_argument('--window-size=1366,768')   # 设置窗口大小, 窗口大小会有影响.
        
    if view_flag == 0 or view_flag == 1:
        try:
            browser = webdriver.Chrome(options=chrome_opt)
        except WebDriverException as e:                  #若捕获到webdriver错误,则尝试下载匹配的chromedriver.exe
            print("chromedirver载入错误,重新匹配中...")
            download_chromedirver()
            browser = webdriver.Chrome(options=chrome_opt)
        return browser
    else:
        raise Exception("browser对象创建失败,参数不合法,view_flag只能为0或1!")

if __name__=="__main__":
    browser = get_browser()

Hmily 发表于 2021-11-22 10:51
I D:lightninng
邮箱:lightninng@sina.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。
lightninng 发表于 2021-11-22 13:25
谢谢版主大大,搞定了~~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 13:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表