本次作業的要求來自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159
可以用pandas讀出之前儲存的資料:
newsdf = pd.read_csv(r'F:\duym\gzccnews.csv')
一.把爬取的内容儲存到資料庫sqlite3
import sqlite3
with sqlite3.connect('gzccnewsdb.sqlite') as db:
newsdf.to_sql('gzccnews',con = db)
df2 = pd.read_sql_query('SELECT * FROM gzccnews',con=db)
儲存到MySQL資料庫
- import pandas as pd
- import pymysql
- from sqlalchemy import create_engine
- conInfo = "mysql+pymysql://user:passwd@host:port/gzccnews?charset=utf8"
- engine = create_engine(conInfo,encoding='utf-8')
- df = pd.DataFrame(allnews)
- df.to_sql(name = ‘news', con = engine, if_exists = 'append', index = False)
1)資料儲存
import sqlite3
with sqlite3.connect('gzccnews.sqlite')as db:
newsdf.to_sql('gzccnews',con=db)
2)資料表的資料檢視
with sqlite3.connect('gzccnews.sqlite')as db:
df2 = pd.read_sql_query('select * from gzccnews',con=db)
df2
截圖效果:

3)資料庫連接配接
import pymysql
from sqlalchemy import create_engine
coninfo = "mysql+pymysql://root:@localhost:3306/gzccnews?charset=utf8"
engine = create_engine(coninfo,encoding="utf-8")
4)建立表及相關資訊
newsdf.to_sql(name='news',con=engine,if_exists='append',index= False,index_label='id')
二.爬蟲綜合大作業
- 選擇一個熱點或者你感興趣的主題。
- 選擇爬取的對象與範圍。
- 了解爬取對象的限制與限制。
- 爬取相應内容。
- 做資料分析與文本分析。
- 形成一篇文章,有說明、技術要點、有資料、有資料分析圖形化展示與說明、文本分析圖形化展示與說明。
- 文章公開釋出。
本次作業主題是爬取廣商教務系統學生成績:http://jwxw.gzcc.cn/
1.擷取廣州商學院教務系統登入頁面url,以及驗證碼位址
首先使用浏覽器開發者調試工具找到登入頁面的準确位址:http://jwxw.gzcc.cn/default2.aspx
然後找到驗證碼的位址:http://jwxw.gzcc.cn/CheckCode.aspx
将驗證碼儲存讓使用者輸入即可
def login(username,password):
'''
登入方正教務系統(廣州商學院)
:param username: 學号
:param password: 密碼
:return: tuple(cookies,name) 傳回一個元組
'''
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
login_url = 'http://jwxw.gzcc.cn/default2.aspx'
checkcode_url = 'http://jwxw.gzcc.cn/CheckCode.aspx'
data=requests.get(login_url)
__VIEWSTATE=re.compile('name="__VIEWSTATE" value="(.*?)"').findall(data.text)[0]
cookies=data.cookies
checkcode=requests.get(checkcode_url,cookies=cookies,headers=headers)
with open('checkcode.jpg','wb') as f:
f.write(checkcode.content)
code=input('請輸入驗證碼:')
while '-' in code:
checkcode = requests.get(checkcode_url, cookies=cookies, headers=headers)
with open('checkcode.jpg', 'wb') as f:
f.write(checkcode.content)
code = input('請重新輸入驗證碼:')
post_data={
'__VIEWSTATE':__VIEWSTATE,
'txtUserName':username,
'Textbox1':'',
'TextBox2':password,
'txtSecretCode':code,
'RadioButtonList1':'%D1%A7%C9%FA',
'Button1':'',
'lbLanguage':'',
'hidPdrs':'',
'hidsc':'',
}
2.判斷登入是否成功
登入時發送POST請求,需要注意要送出一個叫__VIEWSTATE的字段,并且要攜帶cookies
發送POST後,如果登入成功則傳回使用者頁面,判斷即可
resource=requests.post(login_url,data=post_data,cookies=cookies,headers=headers).text
if '活動報名' in resource:
print('登入成功!')
dom_tree=etree.HTML(resource)
name=dom_tree.xpath('//span[@id="xhxm"]/text()')
name=name[0]
print('歡迎回來 '+name)
return (cookies,name.split('同')[0])
else:
print('登入失敗!')
exit(0)
3.構造函數
擷取成績資訊,并儲存在score.csv中
def get_score(cookies,username,name):
'''
擷取所有考試成績,并導出csv
:param cookies: cookies
:param username: 學号
:param name: 姓名
:return: Boolean
'''
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
'Referer':'http://jwxw.gzcc.cn/xs_main.aspx?xh='+username
}
first_url='http://jwxw.gzcc.cn/xscjcx.aspx?xh='+username+'&xm='+name+'&gnmkdm=N121605'
data=requests.get(first_url,cookies=cookies,headers=headers)
viewstate=re.compile('name="__VIEWSTATE" value="(.*?)"').findall(data.text)
viewstate=viewstate[0]
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
'Referer':'http://jwxw.gzcc.cn/xscjcx.aspx?xh='+username+'&xm='+quote(name)+'&gnmkdm=N121605'
}
print(headers)
score_url='http://jwxw.gzcc.cn/xscjcx.aspx?xh='+username+'&xm='+name+'&gnmkdm=N121605'
post_data={
'__EVENTTARGET':'',
'__EVENTARGUMENT':'',
'__VIEWSTATE':viewstate,
'hidLanguage':'',
'ddlXN':'',
'ddlXQ':'',
'ddl_kcxz':'',
'btn_zcj':'%C0%FA%C4%EA%B3%C9%BC%A8'
}
scores=requests.post(score_url,cookies=cookies,headers=headers,data=post_data)
all=re.compile('<td>(.*?)</td><td>(\d+)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td></td><td></td>').findall(scores.text)
for i in all:
with open('score.csv', 'a', newline='') as f:
try:
csv_out=csv.writer(f,dialect='excel')
csv_out.writerow([i[0],i[1],i[2],i[3],i[4],i[5].replace(' ',''),i[6],i[7],i[8],i[9].replace(' ',''),i[10].replace(' ',''),i[11].replace(' ',''),i[12].replace(' ','')])
except Exception:
print('導出失敗!')
return False
print('成績導出成功!')
return True
4.登入
if __name__ == '__main__':
print('廣州商學院正方教務系統登入')
username=input('請輸入學号:')
password=input('請輸入密碼:')
cookies,name=login(username,password)
get_score(cookies,username,name)
登入成功後,截圖:
擷取成績,截圖:
接下來進行相應的成績分析:
1.總成績依照分數越高,字型越大的邏輯顯示
# 存儲過濾後的文本
pd.DataFrame(wcls).to_csv('2.csv', encoding='utf-8')
# 讀取csv詞雲
txt = open('score.csv', 'r', encoding='utf-8').read()
# 用空格鍵隔開文本并把它弄進清單中
cut_text = "".join(jieba.lcut(txt))
簡要分析:本圖彙聚了該生所有的學科成績(去除慕課網課程分數),從圖中可見,移動軟體即Android,資料挖掘明顯突出,軟體工程與程式設計基礎較為其次,乒乓球與跆拳道等體育也清晰可見。但是,大學英語、高等數學等大學基礎課程模糊不可見。
總的來說,專業成績明顯優勢,體育活動亦有較好的發展,基本課程則明顯弱勢,由于學生的普遍認為,隻要注重專業成績,平時的基本文化課程沒什麼用處,受到這個觀念的影響下,才會有了這樣的發展。
2.分析各學期的平均績點走向
簡要分析:從圖中可見,每學年度的績點有小幅度增長的,從大一第一學期,到大三第一學期,從2.2到3.12,每次增長幅度為0.25-0.3,穩定發展。
側面突出該生的學習态度,從散漫随着時間的推移,過渡到認真求知,是一個良好的方向,這也是全國大學生的一個普遍現象,從大一的迷茫,由于擺脫了高中的壓抑環境,不再受到來自校方和家庭的限制,注意力不在學習上,同時還受到對基礎文化課程的不注重的觀念影響,但随着時間流逝,在不斷地求知中,逐漸認清了方向,越臨近畢業,大學生也就越成熟穩重。
3.将所有學科統一分成六大類
由于課程較多,為了分析該生在哪方面比較擅長,應對未來的發展就業,有個明顯的方向,特将全部課程統一區分為六大種類
程式類,網絡類,大資料處理類,web架構類,體育修身類,其他(包括基礎文化課程)
利用餅圖,将六類平均績點顯示出來,由于部分類别課程較少,部分類别課程明顯較多,該餅圖的資料僅供參考,分析的價值為一般,目前隻能利用已知的資訊做個大概分析。
簡要分析:從圖中可見,體育修身類(體育活動與思政文化修養)突出,網絡internet類緊随其後,程式類,資料類,網絡類發展均衡,其他類并不明顯,
以專業方向來看,首先剔除體育類與其他類,其餘四類都是相差不大,但結合上方成績表可看出,該生的網絡類是比其他類别更具優勢,web架構方面也較為精通,而程式類中,Android課程也比較優秀,但c++語言卻沒有十分掌握,軟體工程方面也并不好,程式類别中有好的地方也有不好的地方,可看出該生對這方面沒有絕對的把握,并不穩定。從就業方向來看,選擇前端工程師,或網絡方面的工作比較輕松一些,大資料是近期熱門職業,也可以自學,對這方面有興趣的話,也可以發展。