




版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年全自動變焦照相機項目資金申請報告代可行性研究報告
- 2024年變頻器柜體系統(tǒng)項目資金籌措計劃書
- 2025年河南省三門峽市單招職業(yè)適應性測試題庫匯編
- 2025年湖北省荊門市單招職業(yè)傾向性測試題庫匯編
- 2025年黑龍江商業(yè)職業(yè)學院單招職業(yè)適應性測試題庫一套
- 兒童樂園裝修合同
- 2025年度安全培訓與操作規(guī)范服務協(xié)議
- 2025年度員工勞動合同終止及生活困難補助協(xié)議
- 2025陜西省安全員C證考試(專職安全員)題庫附答案
- 2025年度房屋贈與及物業(yè)管理權轉(zhuǎn)移合同
- 易制毒化學品理論考試試題及答案
- 小學全體教師安全工作培訓
- 北師大版數(shù)學八年級下冊全冊教案及反思
- 湖南版(湘教版)三年級美術下冊全冊全套課件(247張)
- 《教育心理學(第3版)》全套教學課件
- 2024年南京信息職業(yè)技術學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 駱駝祥子1一24章批注
- 新部編人教版四年級下冊道德與法治全冊教案(教學設計)
- 物業(yè)服務企業(yè)市場拓展戰(zhàn)略規(guī)劃課件
- 進制轉(zhuǎn)換教學設計
- 垂直度和跳動形位公差間的關系及取代應用下
評論
0/150
提交評論