天天看點

爬蟲綜合大作業

本次作業的要求來自于: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')      
爬蟲綜合大作業

二.爬蟲綜合大作業

    1. 選擇一個熱點或者你感興趣的主題。
    2. 選擇爬取的對象與範圍。
    3. 了解爬取對象的限制與限制。
    4. 爬取相應内容。
    5. 做資料分析與文本分析。
    6. 形成一篇文章,有說明、技術要點、有資料、有資料分析圖形化展示與說明、文本分析圖形化展示與說明。
    7. 文章公開釋出。

本次作業主題是爬取廣商教務系統學生成績: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('&nbsp;',''),i[6],i[7],i[8],i[9].replace('&nbsp;',''),i[10].replace('&nbsp;',''),i[11].replace('&nbsp;',''),i[12].replace('&nbsp;','')])
            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++語言卻沒有十分掌握,軟體工程方面也并不好,程式類别中有好的地方也有不好的地方,可看出該生對這方面沒有絕對的把握,并不穩定。從就業方向來看,選擇前端工程師,或網絡方面的工作比較輕松一些,大資料是近期熱門職業,也可以自學,對這方面有興趣的話,也可以發展。