这大概是大二时候闲着无聊去了解了一下python正则和模拟操作,简单进行了一下尝鲜。
[TOC]
Python简单爬取”中国日报”新浪微博的早晚安鼓励话语 – 正则表达式
有时睡醒睡前会去看中国日报的早晚安,挺有意思的。考虑到以后可能会用到这方面内容的爬取,就试着先把功能代码写了。写的比较简单,仅供参考。
具体实现可以写个定时脚本早上和晚上爬取内容和图片推送到服务器即可。
# -*- 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
}
请求中带有模拟登录成功后获取的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设置参考链接