學校課程表爬取

Fangyechy發表於2021-01-04

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)```

還有很多瑕疵,寒假再戰

相關文章