第一個爬蟲和測試

来源:https://www.cnblogs.com/deng11/archive/2020/05/13/12882015.html
-Advertisement-
Play Games

一、完善球賽程式,測試球賽程式。 將代碼末尾稍作改動即可,若代碼正確,則運行,否則輸出Error。 from random import random #列印程式介紹信息 def printIntro(): print("19信計2班23號鄧若言") print("這個程式模擬兩個選手A和B的乒乓球 ...


一、完善球賽程式,測試球賽程式。

將代碼末尾稍作改動即可,若代碼正確,則運行,否則輸出Error。

from random import random
 
#列印程式介紹信息
def printIntro():
    print("19信計2班23號鄧若言")
    print("這個程式模擬兩個選手A和B的乒乓球比賽")
    print("程式運行需要A和B的能力值(以0到1之間的小數表示)")
 
#獲得程式運行參數
def printInputs():
    a = eval(input("請輸入選手A的能力值(0-1): "))
    b = eval(input("請輸入選手B的能力值(0-1): "))
    n = eval(input("模擬比賽的場次: "))
    return a, b, n
 
# 進行N場比賽
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        for j in range(7):           #進行7局4勝的比賽
            scoreA, scoreB = simOneGame(probA, probB)
            if scoreA > scoreB:
                winsA += 1
            else:
                winsB += 1
    return winsA,winsB
 
 
 #進行一場比賽
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0           #初始化AB的得分
    serving = "A"                
    while not gameOver(scoreA, scoreB):     #用while迴圈來執行比賽
        if scoreA==10 and scoreB==10:
            return(simOneGame2(probA,probB))
        if serving == "A":
            if random() < probA:            ##用隨機數生成勝負
                scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving="A"
    return scoreA, scoreB
 
def simOneGame2(probA,probB):
    scoreA,scoreB=10,10
    serving = "A"
    while not gameOver2(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving="A"
    return scoreA, scoreB
 
#比賽結束
def gameOver(a,b):               #正常比賽結束
    return a==11 or b==11
def gameOver2(a,b):              #進行搶12比賽結束
   if abs((a-b))>=2:
       return a,b
 
 
#輸出數據
def printSummary(winsA, winsB):
    n = winsA + winsB
    print("競技分析開始,共模擬{}場比賽".format(n))
    print("選手A獲勝{}場比賽,占比{:0.1%}".format(winsA, winsA/n))
    print("選手B獲勝{}場比賽,占比{:0.1%}".format(winsB, winsB/n))
 
#主體函數
def main():
    printIntro()
    probA, probB, n = printInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)

try:
    main()
except:
    print("Error!")

結果如下:

則測試得代碼無誤。 

二、用requests庫的get()函數訪問必應搜狗主頁20次,列印返回狀態,text內容,並且計算text()屬性和content屬性返回網頁內容的長度。

關於requests庫的內容可戳以下鏈接

 https://www.cnblogs.com/deng11/p/12863994.html

import requests
for i in range(20):
    r=requests.get("https://www.sogou.com",timeout=30)   #網頁鏈接可換
    r.raise_for_status()
    r.encoding='utf-8'
    print('狀態={}'.format(r.status_code))
    print(r.text)
    print('text屬性長度{},content屬性長度{}'.format(len(r.text),len(r.content)))

 結果如下(取20次中的其中一次,text屬性內容太長所以不展示出來):

 

 三、根據所給的html頁面,保持為字元串,完成如下要求:

(1)列印head標簽內容和你學號的後兩位

(2)獲取body標簽的內容

(3)獲取id的first的標簽對象

(4)獲取並列印html頁面中的中文字元

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>

<h1>我的第一個標題</h1>
<p id="first">我的第一個段落。</p>

</body>
	<table border="1">
		<tr>
			<td>row 1, cell 1</td>
			<td>row 1, cell 2</td>
		</tr>
	</table>
</html>

 代碼如下:

from bs4 import BeautifulSoup
r = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)  23號的作業</title>
</head>
<body>

<h1>我的第一個標題</h1>
<p id="first">我的第一個段落。</p>

</body>
	<table border="1">
		<tr>
			<td>row 1, cell 1</td>
			<td>row 1, cell 2</td>
		</tr>
	</table>
</html>
'''
demo = BeautifulSoup(r,"html.parser")

print(demo.title)
print(demo.body)
print(demo.p)
print(demo.string)

效果如下:

 

四、爬取中國大學排名(年費2016),將數據存為csv文件。

import requests
from bs4 import BeautifulSoup
ALL = []
def getHTMLtext(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        return ""

def fillUni(soup):
    data = soup.find_all('tr')
    for tr in data:
        td1 = tr.find_all('td')
        if len(td1) == 0:
            continue
        Single = []
        for td in td1:
            Single.append(td.string)
        ALL.append(Single)

def printUni(num):
    print("{1:^2}{2:{0}^10}{3:{0}^6}{4:{0}^6}{5:{0}^6}{6:{0}^6}{7:{0}^6}{8:{0}^6}{9:{0}^5}{10:{0}^6}{11:{0}^6}{12:{0}^6}{13:{0}^6}".format(chr(12288),"排名","學校名稱","省市","總分",\
                                                               "生源質量","培養結果","科研規模","科研質量",\
                                                               "頂尖成果","頂尖人才","科技服務",\
                                                               "產學研究合作","成果轉化"))
    for i in range(num):
          u = ALL[i]
          print("{1:^4}{2:{0}^10}{3:{0}^6}{4:{0}^8}{5:{0}^9}{6:{0}^9}{7:{0}^7}{8:{0}^9}{9:{0}^7}{10:{0}^9}{11:{0}^8}{12:{0}^9}{13:{0}^9}".format(chr(12288),u[0],\
                                                                                                                                                          u[1],u[2],eval(u[3]),\
                                                                                                                                                          u[4],u[5],u[6],u[7],u[8],\
                                                                                                                                                          u[9],u[10],u[11],u[12]))

def main(num):
          url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html"
          html = getHTMLtext(url)
          soup = BeautifulSoup(html,"html.parser")
          fillUni(soup)
          printUni(num)
main(10)

效果:

 

 將爬取到的數據存為csv文件,只需將printUni()函數換掉。

改動後的代碼如下:

import requests
from bs4 import BeautifulSoup
import csv
import os

ALL = []
def getHTMLtext(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = 'utf-8'
        return r.text
    except:
        return ""

def fillUni(soup):
    data = soup.find_all('tr')
    for tr in data:
        td1 = tr.find_all('td')
        if len(td1) == 0:
            continue
        Single = []
        for td in td1:
            Single.append(td.string)
        ALL.append(Single)
        

def writercsv(save_road,num,title):
    if os.path.isfile(save_road):
        with open(save_road,'a',newline='')as f:
            csv_write=csv.writer(f,dialect='excel')
            for i in range(num):
                u=ALL[i]
                csv_write.writerow(u)
    else:
        with open(save_road,'w',newline='')as f:
            csv_write=csv.writer(f,dialect='excel')
            csv_write.writerow(title)
            for i in range(num):
                u=ALL[i]
                csv_write.writerow(u)

title=["排名","學校名稱","省市","總分","生源質量","培養結果","科研規模","科研質量","頂尖成果","頂尖人才","科技服務","產學研究合作","成果轉化"]
save_road="C:\\Users\\鄧若言\\Desktop\\html.csv"

def main(num):
    url = "http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html"
    html = getHTMLtext(url)
    soup = BeautifulSoup(html,"html.parser")
    fillUni(soup)
    writercsv(save_road,num,title) 

main(10)

  效果:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先上圖: 上代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script type="text/javascript" src="../../../static/js/j ...
  • 我是風箏,公眾號「古時的風箏」,一個不只有技術的技術公眾號,一個在程式圈混跡多年,主業 Java,另外 Python、React 也玩兒的 6 的斜杠開發者。 Spring Cloud 系列文章已經完成,可以到 "我的github" 上查看系列完整內容。也可以在公眾號內回覆「pdf」獲取我精心製作的 ...
  • 預設情況下 拖拽a標簽效果如下: 現在我們禁止這個行為:在標簽行內寫入 ondragstart="return false" ...
  • 工廠模式就是好 工廠模式很普遍,想必好多人一開始接觸的就是這個模式了 工廠方法模式一種創建對象的模式,它被廣泛應用在jdk中以及Spring、Mybatis、Hibernate和Struts框架中; 工廠方法模式基於"輸入",應用在超類和多個子類之間的情況,這種模式將創建對象的責任轉移到工廠類; 首 ...
  • [TOC] 哈嘍,大家好!距離上一篇文章近1個半月了,不是我拖呀~,剛好這個月遇到了工作調整,再加上要照顧10個月的孩子,實屬不易,所以就這麼長時間沒來更新了。這不,我每天碼一點點,'滴水成河',努力完成了這篇文章。 1. 封裝和解構 1.1 封裝 說明: 等號(=)右邊有多個數值僅通過逗號分割,就 ...
  • 我們在爬取網站的時候,都會遵守 robots 協議,在爬取數據的過程中,儘量不對伺服器造成壓力。但並不是所有人都這樣,網路上仍然會有大量的惡意爬蟲。對於網路維護者來說,爬蟲的肆意橫行不僅給伺服器造成極大的壓力,還意味著自己的網站資料泄露,甚至是自己刻意隱藏在網站的隱私的內容也會泄露,這也就是反爬蟲技 ...
  • 1、@Resource註解和@Autowired的區別 @Autowired註解:是按類型裝配依賴對象,預設情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性為false。 @Resource註解:和@Autowired一樣,也可以標註在欄位或屬性的setter方法上, ...
  • spring boot集成hasor下的dataway,幹掉後臺,自動配置介面,實現0代碼搭建介面 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...