小學課后服務 Python少兒編程 進階篇:4-爬取高校排名 課件_第1頁
小學課后服務 Python少兒編程 進階篇:4-爬取高校排名 課件_第2頁
小學課后服務 Python少兒編程 進階篇:4-爬取高校排名 課件_第3頁
小學課后服務 Python少兒編程 進階篇:4-爬取高校排名 課件_第4頁
小學課后服務 Python少兒編程 進階篇:4-爬取高校排名 課件_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Loremipsumdolorsitamet,consectetueradipiscingelit.Aeneancommodoligulaegetdolor.Cumsociisnatoquepenatibusetmagnisdisparturientmontes,nasceturridiculusmus.少兒編程課爬取高校排名本節(jié)課我們來編寫一個爬蟲案例,將高校信息爬取下來,并存入Excel表課程案例現(xiàn)在我們開始編寫代碼,首先使用Requests庫獲得頁面信息1導入requests庫,將要爬取的網(wǎng)站賦值給變量2編寫獲取整個網(wǎng)頁數(shù)據(jù)的函數(shù)importrequests

#要爬取的目標網(wǎng)站

start_url='https://tool.lu/school/index.html'defget_text(url):

response=requests.get(url)

returnresponse.text獲得網(wǎng)頁信息數(shù)據(jù)后,查看網(wǎng)頁源代碼,確定我們所需數(shù)據(jù)的位置1在網(wǎng)頁中單擊右鍵,然后點擊查看網(wǎng)頁源代碼2通過查看分析,發(fā)現(xiàn)需要的數(shù)據(jù)被兩個相同的標簽包裹在其中確定了所需信息的位置之后,我們使用字符串相關知識來獲取目標信息1通過源代碼中的標簽將整個頁面數(shù)據(jù)拆分2繼續(xù)查看源代碼,發(fā)現(xiàn)每個高校信息被<tr>標簽分割#使用字符串截取知識點獲取所有高校數(shù)據(jù)

defget_item_by_str(text):

item_list=[]

#將整頁數(shù)據(jù)拆為列表

list_1=text.split('<tablewidth="100%"cellspacing="0"cellpadding="0"class="tbl">')#將list_1的后半部分通過<tr>在拆一次

list_2=list_1[1].split('<tr>')3通過索引獲得包含高校數(shù)據(jù)的部分,并通過<tr>標簽在拆分一次1輸出list_2,觀察得到的數(shù)據(jù)2以下是一部分數(shù)據(jù)去除臟數(shù)據(jù)#使用字符串截取知識點獲取所有高校數(shù)據(jù)

defget_item_by_str(text):

……

print(list_2)content=get_text(start_url)

get_item_by_str(content)列表第一項為空數(shù)據(jù),之后的每一項都包含了高校的信息,但是有很多我們不需要的臟數(shù)據(jù)1通過切片,去除list_2列表中的第一項2替換每一項中的臟數(shù)據(jù),只保留<td>現(xiàn)在,我們?nèi)コ斜碇械呐K數(shù)據(jù)3輸出替換過后的數(shù)據(jù)4通過<td>標簽再次將每一條數(shù)據(jù)進行拆分foriinlist_2:

#去除臟數(shù)據(jù)

fortagin['\n','','</td>','<spanstyle="color:#009A61;">','</span>','</tr>','<tr>',

'<thwidth="40%">','<thwidth="20%">','</th>','<spanstyle="color:#E74C3C;">',

'</table>','<p>注:<p>','<spanstyle="color:#009A61;">','<spanstyle="color:#E74C3C;">']:

i=i.replace(tag,'')list_2=list_1[1].split('<tr>')[1:]print(i)little_item=i.split('<td>')第一條數(shù)據(jù)是我們不需要的,我們暫時先不管它1輸出little_item,結果如下:2通過切片去除空數(shù)據(jù)接著觀察處理后的數(shù)據(jù),對數(shù)據(jù)進行進一步處理3將處理之后的小列表添加到之前創(chuàng)建的空列表中4將完整的高校信息表作為返回值返回,同時去除第一條我們不需要的數(shù)據(jù)可以看到,第一個列表是我們不需要的數(shù)據(jù),剩下的每一個高校信息列表中的第一項數(shù)據(jù)都為空數(shù)據(jù)little_item=i.split('<td>')[1:]#將每個小列表添加到item_list中

item_list.append(little_item)returnitem_list[1:]正則表達式正則表達式也能夠索引數(shù)據(jù)以下是正則表達式中常用的一些規(guī)則:語法說明語法說明.匹配除換行符以外的所有字符*匹配前一個字符0次或多次\轉(zhuǎn)義字符,例如想要匹配.,使用\.+匹配前一個字符1次或多次[…]字符集?匹配前一個字符0次或一次\d數(shù)字,也可寫作[0-9]{m}匹配前一個字符m次\D非數(shù)字,[^\d]{m,n}匹配前一個字符m到n次\s空白字符^字符串以什么開頭\S非空白字符[^\s]$字符串以什么結尾\w單詞[A-Za-z0-9_]|左右表達式任意匹配一個\W非單詞字符(…)被括起來的表達式作為一個整體1對于本測試用例,手機號的匹配規(guī)則:接下來我們使用一個例子來看一下正則表達式的使用2郵箱的匹配規(guī)則測試用例test_str='''

小王手機號碼箱:12356484557@密碼:qwer123

小李手機號碼箱:dada_qqq@密碼:QQppp121

小劉手機號碼箱:abc666@163.com密碼:1545454

小吳手機號碼箱:545131ads@密碼:123645

小鄭手機號碼箱:assdasdfa@密碼:mingtian

小趙手機號碼箱:1231eq143123@密碼:nihao

小孫手機號碼箱:1121112wqeq@密碼:12qw12qw

小鄭手機號碼箱:dadad_dadad@密碼:qeqerqtad

小張手機號碼箱:1234@126.com密碼:qQDA12wQEQ3

小馮手機號碼箱:qwe@密碼:WEQDAQ12121

''''(1[0-9]\d{9})'([0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[a-zA-Z]+)1新建python文件,導入re庫并,將測試用例復制進去接下來我們使用一個例子來看一下正則表達式的使用2將手機號碼查找出來phone_rule=pile('(1[0-9]\d{9})')

result=phone_rule.findall(test_str)

print(result)3將郵箱查找出來mail_rule=pile('([0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[a-zA-Z]+)')

result=phone_rule.findall(test_str)

print(result)直接使用字符串表示的正則表達式進行findall操作時,Python會將字符串轉(zhuǎn)為正則表達式對象所以我們先使用compile完成一次轉(zhuǎn)換,之后使用就不用重復轉(zhuǎn)換了練習Exercises密封線內(nèi)不準答題編寫正則,使用re庫將密碼查找出來1導入Python正則庫re2定義函數(shù),首先去除整個網(wǎng)頁數(shù)據(jù)中的換行和空格接下來,我們回到高校案例,使用Python中的正則庫取出高校數(shù)據(jù)3通過正則提取數(shù)據(jù),縮小范圍4再次編寫正則,將高校數(shù)據(jù)取出,并作為返回值返回importre#使用正則表達式獲取所有高校數(shù)據(jù)

defget_item_by_re(text):

#去除空格

html=text.replace('\n','').replace('','')#縮小范圍

rule_1=pile(r'雙一流</th></tr><tr>(.*)</table><p>注')

table=rule_1.findall(html)#正則取出數(shù)據(jù)

rule_2=pile('td>(.*?)</td><td><spanstyle="color:#[A-Za-z0-9]+;">(.*?)</span></td><td>'

'<spanstyle="color:#[A-Za-z0-9]+;">(.*?)</span></td><td>(.*?)</td></tr>')

returnrule_2.findall(table[0])BeautifulSoup除了使用上面兩種方式獲取數(shù)據(jù),還有更加方便的方式:借助BeautifulSoup庫的幫忙BeautifulSoup是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫1首先來安裝,打開CMD,使用pip安裝2按下回車鍵,就能夠自動下載安裝安裝完成之后,我們通過一個小案例來學習一下它的簡單用法BeautifulSoup庫的簡單使用:<!DOCTYPEhtml>

<htmllang="en">

<head>

<metacharset="UTF-8">

<title>BeautifulSoup使用范例</title>

</head>

<body>

<h1>我是H1標簽</h1>

<pclass='第一個P'>我是第一個p標簽</p>

<p>我是第二個p標簽</p>

<a>我是第一個a標簽</a>

<aid='a2'>我是第一個a標簽</a>

<a>我是第一個a標簽</a>

<a>我是第一個a標簽</a>

</body>

</html>一個簡單的HTML范例如下:frombs4importBeautifulSoup

html='''...'''

bs=BeautifulSoup(html,'lxml')

#簡單的獲取數(shù)據(jù)的方法:

print('文檔的title:',bs.title)

print('title的name屬性:',)

print('title的內(nèi)容:',bs.title.string)

print('title的parent名稱,也就是上一級名稱:',)

print('文檔中第一個p節(jié)點:',bs.p)#獲取

print('文檔中第一個p節(jié)點的內(nèi)容:',bs.p.get_text())#獲取

print('第一個p節(jié)點的class內(nèi)容:',bs.p['class'])#獲取

print('文檔的第一個a節(jié)點:',bs.a)#獲取

print('文檔中所有的a節(jié)點,返回一個list:',bs.find_all('a'))

print('文檔中id屬性為a2的節(jié)點:',bs.find(id='a2'))1使用BeautifulSoup獲取數(shù)據(jù)212導入相關庫接下來,我們就使用BeautifulSoup獲取高校數(shù)據(jù)43#使用BeautifulSoup獲取所有高校數(shù)據(jù)

defget_item_by_bs(text):

#創(chuàng)建BeautifulSoup實例

bs=BeautifulSoup(text,‘lxml')frombs4importBeautifulSoup#查找所有標簽為tr的內(nèi)容

tag_tr=bs.find_all('tr')#獲取所有高校數(shù)據(jù)并轉(zhuǎn)為數(shù)據(jù)表

return[[i.get_text().strip()foriintr.find_all('td')]fortrintag_tr][1:-5]返回高校數(shù)據(jù)表獲得tr標簽中的內(nèi)容定義函數(shù),創(chuàng)建BeautifulSoup實例將數(shù)據(jù)存入Excel表1先來安裝,cmd中輸入pipinstallxlwt2安裝完成后,將其導入接下來,我們將得到的高校信息存入Excel表,Python操作Excel可以使用xlwt庫4設置第二列和第五列的單元格長度3觀察最終效果,第二列和第五列的單元格長度較長importxlwt#設置單元格寬度

defset_width(sheet):

#設置第二列寬度

col_2=sheet.col(1)

col_2.width=256*20

#設置第五列寬度

col_5=sheet.col(4)

col_5.width=256*15256*N,就表示有N個字符長度。1定義設置樣式的函數(shù),創(chuàng)建兩個樣式實例2設置表格邊框為實線然后,設置表格樣式4設置全部字體樣式3使文字居中顯示#設置Excel樣式

defset_sheet_style():

#創(chuàng)建第一行樣式和全部樣式實例

all_style=xlwt.XFStyle()

first_row_style=xlwt.XFStyle()由于第一行的樣式和剩余樣式不同,所以這里我們創(chuàng)建兩個樣式實例#設置邊框線

border=xlwt.Borders()

border.top=xlwt.Borders.THIN

border.bottom=xlwt.Borders.THIN

border.left=xlwt.Borders.THIN

border.right=xlwt.Borders.THIN#使文字居中

alignment=xlwt.Alignment()

alignment.horz=xlwt.Alignment.HORZ_CENTER#水平居中

alignment.vert=xlwt.Alignment.VERT_CENTER#垂直居中#設置字體為微軟雅黑

all_font=xlwt.Font()

all_='微軟雅黑'5設置第一行字體樣式#第一行設置為微軟雅黑并字體加粗,字體大小為11

first_row_font=xlwt.Font()

first_row_='微軟雅黑'

first_row_font.bold=True

first_row_font.height=20*111將修改好的相應樣式綁定到全部樣式實例2將修改好的相應樣式綁定到第一行樣式實例然后,設置表格樣式3將樣式返回#將修改好的樣式添加到全部樣式實例中

all_style.font=all_font

all_style.alignment=alignment

all_style.borders=border#將修改好的樣式添加到第一行樣式實例中first_row_style.font=first_row_font

first_row_style.alignment=alignment

first_row_style.borders=border#將樣式返回

returnall_style,first_row_style1定義函數(shù),參數(shù)為表格內(nèi)創(chuàng)建的單元,高校數(shù)據(jù)表和表格樣式2從第二行開始,向表格中寫入編號表格樣式相關工作已經(jīng)完成,下面我們編寫寫入數(shù)據(jù)的函數(shù)3向表格寫入數(shù)據(jù)#將數(shù)據(jù)寫入表格

defwrite_item_in_sheet(sheet,item_list,style):#獲得行號列號

forrowinrange(len(item_list)):

#生成表格編號

sheet.write(row+1,0,row+1,style)向表格寫入數(shù)據(jù),使用sheet.write()方法四個參數(shù)依次為:將內(nèi)容寫到第幾行、寫到第幾列、寫如的內(nèi)容、樣式由于是從第二行開始,所以是row+1forcolinrange(len(item_list[row])):

#將高校信息數(shù)據(jù)寫入到excel表格中

sheet.write(row+1,col+1,ite

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論