学校课程表爬取

import re
import time       #time.sleep() 
import requests
from bs4 import BeautifulSoup
import xlwt

re的作用:
pattern=re.compile(r’正则表达式’) #编写正则表达式
s=re.search(pattern,str) #将结果存入s

注意s.group(0)是整个整体
s.group(1)是对应的第一个空

time的作用:
time.sleep() 让搜索稍微停一下,不要让服务器察觉你是个爬虫

requests的作用:
用于创建session对象
session = requests.session()
session(会话控制)会找服务器临时创造出一个空间,来保存数据
有点类似函数中的形参
理解:一个session多次操作相当于一个人做了多件事情
而如果来让request来做的话,相当于多个人做了各自的事

xlwt的作用:
用来将数据存入表格

基本工作准备

link = 'http://jwch.fzu.edu.cn/login.aspx' #登录界面的网址
headers={
    
    
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'User-Agent':
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
    'Accept-Language': 'zh,zh-CN;q=0.9',
    'Accept-Encoding': 'gzip, deflate',
    'Referer':'http://jwch.fzu.edu.cn/'
}

#要明确找到的键
login_data={
    
    
    'muser':'用户名',
    'passwd':'密码'  #密码写错的话后面是跳不出id号的
} 

#要跳转的网站,在form表单中的action中找到
post_url="http://59.77.226.32/logincheck.asp"

f12开发者人员工具(或右键点检查)
难题:muser和passwd要找的对,先留个坑
头尽量写满(留个坑)
坑点:头的选择
response headers、request headers
request相当于向服务器提出求婚
response相当于问服务器是否还要保持暧昧关系
添加链接描述

寻找id

#要跳转的网站,在form表单中的action中找到
post_url="http://59.77.226.32/logincheck.asp"

#创建session对象
session = requests.session()

#有状态头和数据向post_url服务器发出post请求
s=session.post(post_url, headers = headers,data = login_data)

# print(s)
# print(s.url)
# print(type(s))
# print(type(s.url))
#
# #<Response [200]>
# #<class 'requests.models.Response'>
# #<class 'str'>


#用正则找id,用正则找id,用正则找id
id_loc =re.search(r'.*id=([0-9]*)',s.url)

id=id_loc.group(1)
#group(0)是整个id_loc一起输出来

real_url="http://59.77.226.35/right.aspx?id="+id
message = session.get(real_url,headers=headers)
#print(message.text)

表格保存

book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 方式压缩
sheet = book.add_sheet("福大课程表", cell_overwrite_ok=True)  # cell是细胞,是单元,后面的参数是用来允许覆盖
col = ("节次", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日")
for i in range(0,8):
    sheet.write(0,i,col[i])
row = ("8:20-9:05","9:15-10:00","10:20-11:05","11:15-12:00","14:00-14:45","14:55-15:40","15:50-16:35","16:45-17:30")
for i in range(1,9):
    sheet.write(i,0,row[i-1])
x=0
y=0
course_pattern=r'<font color.*?>(.*?)</font>'
for courses in soup.find_all('td',align='center', bgcolor='#FFFFFF'):
    print(courses)

    if courses.font !=None:
        single_course=re.search(course_pattern,str(courses.font)).group(1)
        sheet.write(y,x-1,str(single_course))#多了一列上午下午所以要减一
    x = x + 1
    if (x % 8 == 0):
        x = x % 8
        y = y + 1
    book.save("福大课程11445.xls")

写到一半的selenium

from selenium import webdriver
import time
from bs4 import BeautifulSoup
import requests
import re
import json

##基础准备
session = requests.Session()

#填写账号密码
login_username = "账号"
login_passdord = "密码"

headers={
    
    
          'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
          'User-Agent':
          'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36',
          'Accept-Language': 'zh,zh-CN;q=0.9',
          'Accept-Encoding': 'gzip, deflate',
         "Referer":"http://jwch.fzu.edu.cn/",
         "Cookie": "ASP.NET_SessionId=oribitksc1ffqzgekdoxivx1"
}
print(type(headers))
session.headers.update(headers)#保存头

browser = webdriver.Chrome()#浏览器
login_site="http://jwch.fzu.edu.cn/login.aspx"#登入网站



browser.get(login_site)#登入网站

#找到用户名并输入
username = browser.find_element_by_id("UserName")
username.send_keys(login_username)

time.sleep(0.2)

#找到密码名并输入
password = browser.find_element_by_id("passWord")
password.send_keys(login_passdord)

time.sleep(0.2)

#点击确认
submit=browser.find_element_by_class_name("btn.fl")
submit.click()

#解析
soup =BeautifulSoup(browser.page_source,"html.parser")


#正则,搜索id号
find = re.search(r'.*id=([0-9]*)', str(soup))

#进入异空间,失败
r = requests.get("http://59.77.226.35/right.aspx?id="+find.group(1),headers=headers)
print(r.text)```

还有很多瑕疵,寒假再战

猜你喜欢

转载自blog.csdn.net/Fangyechy/article/details/112172307
今日推荐