Python正则表达式和模拟登录简单应用

这大概是大二时候闲着无聊去了解了一下python正则和模拟操作,简单进行了一下尝鲜。

[TOC]

Python简单爬取”中国日报”新浪微博的早晚安鼓励话语 – 正则表达式

有时睡醒睡前会去看中国日报的早晚安,挺有意思的。考虑到以后可能会用到这方面内容的爬取,就试着先把功能代码写了。写的比较简单,仅供参考。

具体实现可以写个定时脚本早上和晚上爬取内容和图片推送到服务器即可。

image-20230223192205129

image-20230223192035977

# -*- coding  = utf-8 -*-
# @Time : 2021/7/23 20:52
# @Author : fangfang
# @File : requestTest.py
# @Software : PyCharm
import json

import requests
import re
from bs4 import BeautifulSoup

url = "https://weibo.com/chinadailywebsite?page=3"
headers = {
    "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML, likeGecko) Chrome/91.0.4472.124 Safari/537.36",
    "Cookie": "" #补充自己的cookie~
}

imgRe = re.compile(r'<img src="(.*?)"/>', re.S)
timeRe = re.compile(r'\d\d\d\d-\d\d-\d\d 0[07]:0[0-1]', re.S)  # 00:00和07:00两个时间点,考虑1分钟误差 --但实际可能对方不是人工发的,是机器定时发的。。


def main():
    r = requests.get(url, headers=headers)
    if r.status_code == 200:
        html = re.findall(r'<script>FM.view(.*)</script>', r.text)  # 将script标签内容提取出
        for i in html:
            if re.search(r'WB_text', i) != None:  # 取出特定script段 其实就是html的最后一个
                i = i.strip('(').strip(')')  # 字串去掉括号
                data_jason = json.loads(i)  # 将字串载入成字典档
                soup = BeautifulSoup(data_jason['html'], 'lxml')  # 字典档当中只提取html对应的代码
                # print(soup)
                tags = soup.find_all('div', attrs={"class": "WB_feed_detail clearfix"})  # 提取文字的标签
                for tag in tags:
                    tag_str = str(tag)
                    if (re.search(timeRe, tag_str)) != None:
                        # print(tag)
                        content = tag.find_all('div', attrs={"class": "WB_text W_f14"})[0].text.replace('  ','')  # 去掉空格 第一个分号内有一个空格
                        print(content)
                        img_src = re.findall(imgRe, tag_str)
                        if len(img_src) != 0:
                            img_src = "https://" + img_src[0]
                        else:
                            print("无图片", end="")

                        print(img_src)
    else:
        print("获取失败")


if __name__ == "__main__":  # 当程序执行时
    main()

好吧,刚发现中国日报好像还真是人工发的,而且代码和方法还存在挺多问题的,有时间再优化更新吧,后续会补充脚本和服务器的方法。

python简单模拟登录教务系统

简单参考 Python3实现网站模拟登录 写了个python模拟登录教务系统,具体用到了selenium浏览器自动测试框架,参考了 Flask 的文档 作接口。代码供参考。

import time
from selenium import webdriver  # 网页自动化
from flask import Flask, request


app = Flask(__name__)

login_url = "https://auth.sztu.edu.cn/idp/authcenter/ActionAuthChain?entityId=jiaowu"  # 教务登录页面
base_url = "https://jwxt.sztu.edu.cn/jsxsd/framework/xsMain.jsp"  # 教务首页

headers = {
    "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML, likeGecko) Chrome/91.0.4472.124 Safari/537.36",
    "Origin": "https://jwxt.sztu.edu.cn"
}  # 用户代理,模拟机器类型
cookies = {}


@app.route("/login", methods=['POST'])
def login():
    print("request.json: ", request.json)

    options = webdriver.ChromeOptions()
    options.add_experimental_option("excludeSwitches", ["enable-logging"])
    driver = webdriver.Chrome(options=options)

    try:
        driver.get(login_url)

        driver.find_element_by_id('j_username').clear()  # 清空输入框
        driver.find_element_by_id('j_username').send_keys(request.json['school_id'])  # 自动敲入用户名

        driver.find_element_by_id('j_password').clear()  # 清空输入框
        driver.find_element_by_id('j_password').send_keys(request.json['password'])  # 自动敲入密码

        driver.find_element_by_id('loginButton').click()

        time.sleep(1)
        driver.get(base_url)
        for cookie in driver.get_cookies():
            cookies[cookie['name']] = cookie['value']
        print("cookies: ", cookies)

    finally:
        driver.quit()

    if not cookies:
        return {
                   "error": "登录失败,账号或密码错误",
               }, 403

    return {
        "cookies": cookies
    }

img

请求中带有模拟登录成功后获取的cookies即可爬取教务其它网页的数据,建议做成函数接口如下,获取后进行一些正则提取相应片段即可。

def get(url):
    return requests.get(url, headers=headers, timeout=2, cookies=cookies, verify=False)

根据课表代码段生成课表Excel表格 – 正则表达式

目前实现方法比较简单,需要手动复制课表相应的代码段到记事本,然后解析提取相应的内容整合生成excel,具体代码实现过程已注释啦。有时间了再琢磨怎么模拟登录后直接爬取代码段,可能以后某些时候会有用处~

在这里插入图片描述

可知tbody段便是我们需要的部分,复制到记事本(tbody.txt)中,运行代码即可生成表格。

在这里插入图片描述

代码:

# -*- coding  = utf-8 -*-
# @Time : 2021/7/17 21:02
# @Author : fangfang
# @File : demo9-timetable.py
# @Software : PyCharm

from bs4 import BeautifulSoup  # 网页解析,获取数据
import re  # 正则表达式,进行文字匹配
import xlwt  # 进行excel操作


def main():
    datalist = getData()

    savepath = "年级课程表.xls"
    saveData(datalist, savepath)


# 班级名称
className = re.compile(r'<nobr>(.*)</nobr>')  # 创建正则表达式对象,表示规则(字符串的模式)  --- r 是忽视后面的特殊字符
# 课程代码段
codeArea = re.compile(r'<td align="center" height="28" valign="top">(.*?)</td>', re.S)
# 课程信息
course = re.compile(r'<div class="kbcontent1" id="">(.*)</div>', re.S)


# 数据处理
def getData():
    dataList = []  # 全年级信息
    f = open('tbody.txt', "r", encoding='UTF-8') # 打开代码记事本
    html = f.read()
    f.close()
    soup = BeautifulSoup(html, "html.parser")
    for item in soup.find_all('tr'):  # 每个班级的代码段遍历
        data = []  # 单个班级的课表信息,第一个元素为班级名称,其后为课程信息

        item = str(item)
        # print(item)

        class_name = re.findall(className, item)[0]  # 班级名称
        data.append(class_name)
        # print(class_name)

        for td in re.findall(codeArea, item):  # 所有节次遍历
            course_information = re.findall(course, td)
            if course_information:
                course_information = re.sub('<br/>', '\n', course_information[0])
            else:
                course_information = "该时间段无课程"
            # print(course_information)
            data.append(course_information)

        dataList.append(data)  # 将处理好的班级放入list

    # print(dataList)
    return dataList


# 生成表格
def saveData(datalist, savepath):
    workbook = xlwt.Workbook(encoding="utf-8")  # 创建workbook对象

    alignment = xlwt.Alignment()  # Create Alignment  设置单元格对齐方式
    alignment.horz = xlwt.Alignment.HORZ_CENTER  # 水平居中
    alignment.vert = xlwt.Alignment.VERT_CENTER  # 垂直居中
    alignment.wrap = 1  # 设置自动换行

    font = xlwt.Font()  # 为样式创建字体
    font.name = '宋体'

    style = xlwt.XFStyle()  # Create Style
    style.alignment = alignment  # Add Alignment to Style
    style.font = font

    for item in datalist:
        # print(item)
        sheet = workbook.add_sheet(item[0])  # 创建工作表

        row = ('星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日')
        col = (' ', '0102', '0304', '0506', '0708', '0910', '1112')
        for i in range(0, 7):
            sheet.col(i + 1).width = 4400
            sheet.write(0, i + 1, row[i], style)  # 行 列 内容
            sheet.write(i, 0, col[i], style)

        now = 1
        for i in range(1, 8):  # 列
            for j in range(1, 7):  # 行
                # item[now] = re.sub('\n', '\r', item[now])
                sheet.write(j, i, item[now], style)
                now += 1

    workbook.save(savepath)


if __name__ == "__main__":  # 当程序执行时
    main()
    print("课程表生成完成")

生成课程表:

在这里插入图片描述

python-excel知识链接:python3-xlwt-Excel设置参考链接

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇