1. 程式人生 > >網路爬蟲—作者:王曉坤

網路爬蟲—作者:王曉坤

網路爬蟲作業


一、題目

羊車門作業已釋出,很快就會有同學提交作業,在此作業基礎上,我們釋出本網路爬蟲作業。

本作業共分兩部分,第一部分必做,第二部分選作。

第一部分:

請分析作業頁面,爬取已提交作業資訊,並生成已提交作業名單,儲存為英文逗號分隔的csv檔案。檔名為:hwlist.csv 。

 

檔案內容範例如下形式: 

學號,姓名,作業標題,作業提交時間,作業URL

20194010101,張三,羊車門作業,2018-11-13 23:47:36.8,http://www.cnblogs.com/sninius/p/12345678.html

20194010102,李四,羊車門,2018-11-14 9:38:27.03,

http://www.cnblogs.com/sninius/p/87654321.html

 

*注1:如製作定期爬去作業爬蟲,請注意爬取頻次不易太過密集;

*注2:本部分作業用到部分庫如下所示:

(1)requests —— 第3方庫

(2)json    —— 內建庫

第二部分:

在生成的 hwlist.csv 檔案的同文件夾下,建立一個名為 hwFolder 資料夾,為每一個已提交作業的同學,新建一個以該生學號命名的資料夾,將其作業網頁爬去下來,並將該網頁檔案存以學生學號為名,“.html”為副檔名放在該生學號資料夾中。

 

 


二、原始碼

 

import requests
import json
import os
import shutil
import datetime
import time
#————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

def GetUrl(url):
    '''爬取網頁內容函式.引數:網址'''
    try:
        r = requests.get(url)                       #
獲取網頁內容 r.raise_for_status() #返回異常,r.status_code是200,返回 None r.encoding = r.apparent_encoding # 轉化編碼, 根據r.apparent_encoding的結果轉碼 print('網頁內容讀取成功!') return r #返回網頁內容 except: print("產生異常") #———————————————————————————————————————————————————————————————————————————————————————————————————————————————————— def CreatFolder(FolderName): ''' 建立資料夾函式,引數資料夾的名稱(字串)''' exist=os.path.exists(FolderName) #判斷是否存在,存在返回真,否則返回假。 if not exist: os.mkdir(FolderName) print('{}資料夾建立成功!'.format(FolderName)) else: shutil.rmtree(FolderName) CreatFolder(FolderName) print('{}資料夾已存在,將其刪除後重建!\n'.format(FolderName)) #————————————————————————————————————————————————————————————————————————————————————————————————————————————————— def HW(url): r0=GetUrl(url) #呼叫函式爬取網頁 data0=json.loads(r0.text) #將json格式資料轉換為字典 #建立hwlist.csv with open ('hwlist.csv','w')as f: zero=('學號',',','姓名',',','作業標題',',','作業提交時間',',','作業URL','\n') #寫入第一行內容 f.writelines(zero) for i in data0['data']: xuehao=str(i['StudentNo'])+"\t" #在時間和日期後加上“\t”,轉換為格式 date=i['DateAdded'].replace('T',' ')+"\t" #用EXCEL開啟的時候,不會出現錯誤的形式 one=(xuehao,',',i['RealName'],',',i['Title'],',',date,',',i['Url'],'\n') f.writelines(one) #建立hwFolder資料夾 FolderName='hwFolder' CreatFolder(FolderName) os.chdir(FolderName) #進入hwFolder資料夾 #建立學生的資料夾和檔案 for i in data0['data']: name=str(i['StudentNo']) #得到學號 CreatFolder(name) #建立以學號命名的資料夾 os.chdir(name) #進入以學號命名的資料夾 with open (name+'.html','wb') as fp: #覆蓋寫模式和二進位制檔案模式,對以學號命名.html檔案 進行操作(必須以二進位制檔案模式) Url=i['Url'] r1=GetUrl(Url) #獲取該學號同學羊車門作業的網頁 fp.write(r1.content) #r1.content獲取網頁的內容,並寫入以該同學學號命名.html檔案中 #a=type(r1.content) #print(a) print("{}.html檔案內容建立成功。\n".format(name)) os.chdir('..') #返回上一層目錄,即hwFolder資料夾 #———————————————————————————————————————————————————————————————————————————————————————————————————————————————————— #定時爬取網頁內容 #if __name__=='__main__': flag=0 #設定一個值 now=datetime.datetime.now() print(now) sched_timer=datetime.datetime(now.year, now.month, now.day, now.hour, now.minute, now.second) + datetime.timedelta(seconds=5) print(sched_timer) while (True): url="https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=2420&_=1543326450118" now=datetime.datetime.now() if sched_timer<now<sched_timer+datetime.timedelta(seconds=5): time.sleep(1) HW(url) #執行函式 flag=1 else: if flag==1: sched_timer=sched_timer+datetime.timedelta(minutes=2) #2分鐘後執行 flag=0 print("程式執行完成!!")
 

 


 

三、結果

第一次讀取檔案

 

 

 

 

第二次讀取檔案

 

建立hwlist.csv檔案,hwFloder資料夾

 

 

hwlist.csv檔案內容

 

 

hwFloder資料夾

 

 

hwFloder資料夾,子資料夾中檔案及內容

 

 

 

 

 

 

 



四、思考與總結

1.字尾為.csv的檔案

最終的結果儲存在一個.csv檔案下。.csv檔案預設以EXCLE開啟,

但是,開啟後結果顯示,學號列沒有完全顯示,時間列沒有顯示年/月/日。

 

 

解決方法:

在學號和日期後面連線一個”\t”,(必須是雙引號),可以將學號和日期顯示出來。

更改後結果:

Excel中

 

 

記事本

 

 

  拓展:

    1.為什麼選用字尾為.csv的檔案?

      (1)寫csv檔案的效率很高。2. csv檔案的大小遠遠小於生成的Excel檔案。並且隨著Excel檔案的變大儲存效率會降低的。

             (參見網頁:http://www.blogjava.net/hongqiang/archive/2012/07/10/382668.html

      (2)有一個csv的模組

                   推薦網頁(https://www.cnblogs.com/pyxiaomangshe/p/8026483.html

 

2.用到一個shutil模組,shutil模組和os模組是對檔案,資料夾操作的。

os.remove ——刪除檔案

os.mkdir ——刪除空的資料夾

shutil. rmtree ——遞迴刪除非空資料夾,

網址:https://blog.csdn.net/huilaojia123/article/details/53939845

https://www.aliyun.com/jiaocheng/480630.html

 

 

3.with open (name+'.html','wb') as fp:

注:只能用”wb”寫,b:二進位制檔案模式.因為r1.content,他的型別是<class 'bytes'>

 

 

 

 

4.Requests庫

爬取網頁內容可以自定義一個函式,增加判斷條件,增強程式碼健壯性!

 

https://www.cnblogs.com/hanbb/p/7221659.html?utm_source=itdadao&utm_medium=referral

 

4.  if __name__ == '__main__' 的解釋

https://blog.csdn.net/yjk13703623757/article/details/77918633/

 

 

5.定時爬取網頁內容參考的網頁

https://blog.csdn.net/qq807237096/article/details/78794039

 

 

6. datetime模組

https://blog.csdn.net/cmzsteven/article/details/64906245

https://www.cnblogs.com/wenBlog/p/6023742.html