Python入門初體驗——網(wǎng)頁數(shù)據(jù)的爬取

在信息化越來越發(fā)達的今天伞广,網(wǎng)上的數(shù)據(jù)數(shù)不勝數(shù)汁果。當你想獲取某些資源或種子的時候涡拘,如果單純的靠手動自己一個個去下載,是非常的繁瑣和浪費時間据德。這個時候鳄乏,我們的python爬蟲技術就可以派上用場了。但你可能并不會寫爬蟲棘利,不要著急橱野,跟著我的文章看下去。我將帶你入門爬蟲技術赡译,讓你從此不用再為資源發(fā)愁仲吏,而是為身體發(fā)愁。

步驟一蝌焚、環(huán)境的安裝:

  1. 首先,在官網(wǎng)https://www.anaconda.com/download/下載一個與自己電腦系統(tǒng)相匹配的Anaconda3版本誓斥。
  2. 找到Anaconda3文件夾并打開只洒,再找到Scripts并打開,找到idle.exe劳坑。


    Anaconda3
Scripts
idle.exe
  1. 雙擊idle.exe運行毕谴,就可以在其中敲Python代碼來制作爬蟲。

步驟二距芬、爬蟲準備:

  • 準備好自己需要爬取網(wǎng)站的地址涝开,例如:對國防科大錄取分數(shù)線網(wǎng)站的爬取,我們需要知道國防科大的一些基本的網(wǎng)站地址框仔,然后根據(jù)URL獲取網(wǎng)頁舀武。

步驟三、開始爬蟲

1)根據(jù)URL獲取網(wǎng)頁

1.首先我們需要導入兩個常用的庫离斩,URL處理模塊和RE包:.

import urllib.request as req
import re

2.找到它的網(wǎng)址银舱,存儲到url變量名中。

url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'

3.創(chuàng)建一個表示遠程url的類文件對象跛梗,并將其打開

webpage=req.urloprn(url)

4.讀取網(wǎng)頁的所有數(shù)據(jù),并轉(zhuǎn)換為uft-8編碼進行存儲(此處編碼可以自己查看網(wǎng)頁所用的編碼寻馏,然后設置成相應的編碼)

data = webpage.read().decode('utf-8')

完整代碼如下:

import urllib.request as req
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
webpage = req.urlopen(url)
data = webpage.read().decode('utf-8')
print(data)

2)網(wǎng)頁數(shù)據(jù)存入文件

1.需要先打開一個文件,并執(zhí)行寫入的操作

2.將網(wǎng)頁數(shù)據(jù)寫入文件

outfile.write(data)
outfile.close#在寫完數(shù)據(jù)后將打開的文件關閉

3)提取鏈接

1.我們需要通過查看之前保存下來的數(shù)據(jù)核偿,找到我們需要的關鍵信息诚欠,此處我們是查找錄取分數(shù)線,所以我們需要在數(shù)據(jù)中找到跟此有關的信息段。如圖:


國防科技大學~年錄取分數(shù)統(tǒng)計.png

2.我們需要對相應的鏈接進行提取轰绵,一得到我們需要的關鍵的地址粉寞。例如對2017年的鏈接進行提取。

index = data.find('國防科技大學2017年錄取分數(shù)統(tǒng)計')
href = data[index-100:index].split('"')[3] # 提取url子串
# href是相對URL藏澳,需要加上站點域名
website = 'http://www.gotonudt.cn'
url = website+href
print(url)

4)根據(jù)超鏈接抓取并保存鏈接網(wǎng)頁內(nèi)容:

webpage = req.urlopen(url) # 根據(jù)超鏈訪問鏈接的網(wǎng)頁
data = webpage.read() # 讀取超鏈網(wǎng)頁數(shù)據(jù)
outfile = open("2017年.txt"%url[0], 'wb') # 按二進制寫方式打開文件(文件名可以自己任意命名)
outfile.write(data) # 將網(wǎng)頁數(shù)據(jù)寫入文件
outfile.close() # 關閉文件

5)根據(jù)獲得的網(wǎng)址仁锯,通過瀏覽器打開,查看網(wǎng)頁的數(shù)據(jù)翔悠,然后分析自己所要提取的數(shù)據(jù)有何特點业崖。而此處我們可以發(fā)現(xiàn),我們需要提取的分數(shù)數(shù)據(jù)蓄愁,在網(wǎng)頁中是以表格的形式存在双炕。所以下一步我們需要提取網(wǎng)頁中的表格。

6)提取表格

1.通過查看網(wǎng)頁源代碼撮抓,我們可以知道妇斤,表格在網(wǎng)頁數(shù)據(jù)中是以<table …> … </table>的形式存在。
2.提取表格需要用到我們在前文中提到的RE包丹拯,即正規(guī)表達式包站超。
3.提取表格所用到的正規(guī)表達式為:

'<table.*?>(.*?)</table>'

4.代碼如下:

webpage = req.urlopen(url)
data = webpage.read().decode('utf-8')
# 獲取網(wǎng)頁中的第一個表格中所有內(nèi)容:
table = re.findall(r'<table(.*?)</table>', data, re.S)
firsttable = table[0]

7)提取表格中的行

  • 根據(jù)提取到的表格數(shù)據(jù),我們可以發(fā)現(xiàn)乖酬,我們需要將每一行每一列中的數(shù)據(jù)提取出來死相,才能得到我們只需要的分數(shù)數(shù)據(jù)。所以我們先提取每一行咬像,再提取每一列算撮。
  • 提取行所使用的正規(guī)表達式為:
'<tr(.*?)</tr>'
  • 代碼如下:
rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)

8)提取行中的每一列

通過分析行中的數(shù)據(jù),我們可以得到每個分數(shù)的前后存在'…>640</span>…'這樣一個特征字符串县昂,所以我們可以通過這個特殊的字符串進一步提取我們需要的數(shù)據(jù)

  • 提取行所使用的正規(guī)表達式為:
r'<td.*?>(.*?)</td>'
  • 提取每一行中所有的元素:
scorelist = []
for row in rows:
    items = []
    tds = re.findall(r'<td.*?>(.*?)</td>', row, re.S)
    for td in tds:
          rightindex = td.find('</span>')
          if rightindex!=-1:
              leftindex = td[:rightindex].rfind('>')
              item=td[leftindex+1:rightindex]
              items.append(item)
    scorelist.append(items)
outfile=open('2017年國防科技大學分數(shù)線.txt'%, 'w')
for score in scorelist:
    for each in score:
        outfile.write('%s\t'%each)
    outfile.write('\n')
outfile.close()

9)數(shù)據(jù)清洗

  • 此時我們通過查看得到的數(shù)據(jù)會發(fā)現(xiàn)肮柜,得到的數(shù)據(jù)還會存在我們不想要的內(nèi)容,比如:空格符號(?)倒彰,所以我們需要對數(shù)據(jù)內(nèi)部進行清洗审洞。
  • 數(shù)據(jù)前后的清洗使用可以使用:x.strip(),比如此處狸驳,我們可以通過x.replace('&nbsp; ', '')語句预明,將空格符號去掉。從而得到我們所需要的理想數(shù)據(jù)文檔耙箍。

10)完整代碼

大家可以先嘗試通過前面的知識撰糠,自己一步步進行獲取,如果實在無法得到想要的數(shù)據(jù)辩昆,可以參考以下代碼:

import urllib.request as req
import re
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'
webpage = req.urlopen(url)
data = webpage.read().decode('utf-8')
index = data.find('國防科技大學2017年錄取分數(shù)統(tǒng)計')
href = data[index-100:index].split('"')[3] # 提取url子串
# href是相對URL阅酪,需要加上站點域名
website = 'http://www.gotonudt.cn'
url = website+href
webpage = req.urlopen(url)
data = webpage.read().decode('utf-8')

# 獲取網(wǎng)頁中的第一個表格中所有內(nèi)容:
table = re.findall(r'<table(.*?)</table>', data, re.S)
firsttable = table[0]
firsttable = firsttable.replace('&nbsp;','')# 在html網(wǎng)頁中空格經(jīng)常用&nbsp;表示,此處將&nbsp;去掉:
rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)

scorelist = []
for row in rows:
    items = []
    tds = re.findall(r'<td.*?>(.*?)</td>', row, re.S)
    for td in tds:
        rightindex = td.find('</span>')
        if rightindex!=-1:
            leftindex = td[:rightindex].rfind('>')
            item=td[leftindex+1:rightindex]
            items.append(item)
    scorelist.append(items)
outfile=open('2017年國防科技大學分數(shù)線.txt', 'w')
for score in scorelist:
    for each in score:
        outfile.write('%s\t'%each)
    outfile.write('\n')
outfile.close()

謝謝各位讀者的閱讀!J醴Q饩 !

悄咪咪的給大家送上一段獲取圖片的代碼供大家參考學習辉词,喜歡的可以點個贊必孤,送顆小心心哦!

from urllib import request
import re
def getReq
(url):
url_req = request.urlopen
(url) #打開一個url
return url_req
#返回這個對象
def getJpg(data):
jpglist = re.findall
(r'src="http.+?.jpg"',data
)
return jpglist
def getHtml(data):
htmllist = re.findall
(r'href=".+?.html"',data
)
return htmllist
def downLoad
(jpgUrl,n):
try:
request.urlretrieve
(jpgUrl,'%s.jpg' %n)
except Exception as e:
print(e)
finally:
print('圖片%s下載操作完成' % n)
def getAllJpg
(urllist):
index=0
jpegnum=1
while index<= len
(urllist):
try:
http_req = getReq
(urllist[index]) #拿到http請求后的上下文對象
# data = http_req.read().decode('GB2312','ignore') #獲取網(wǎng)頁數(shù)據(jù)
data = http_req.read().decode('gb18030','ignore') #獲取網(wǎng)頁數(shù)據(jù)
htmllist
=getHtml(data)
print(htmllist
)
for hl in htmllist
:
newurl = urllist[0]+hl.split('"')[1][1:]
if newurl not in urllist
:
urllist.append
(urllist[0]+hl.split('"')[1][1:])
jpglist = getJpg(data)
for jurl in jpglist
:
s = re.findall
(r'http.+?.jpg',jurl
)
print(s)
downLoad(s[0],jpegnum
)
jpegnum= jpegnum +1
index = index+1
except Exception as e:
print(e)
pass
urllist=['http://www.daimg.com/']
getAllJpg
(urllist
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑞躺,一起剝皮案震驚了整個濱河市敷搪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幢哨,老刑警劉巖赡勘,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捞镰,居然都是意外死亡闸与,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門岸售,熙熙樓的掌柜王于貴愁眉苦臉地迎上來践樱,“玉大人,你說我怎么就攤上這事凸丸∮承玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵甲雅,是天一觀的道長。 經(jīng)常有香客問我坑填,道長抛人,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任脐瑰,我火速辦了婚禮妖枚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苍在。我一直安慰自己绝页,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布寂恬。 她就那樣靜靜地躺著续誉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪初肉。 梳的紋絲不亂的頭發(fā)上酷鸦,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼臼隔。 笑死嘹裂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的摔握。 我是一名探鬼主播寄狼,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氨淌!你這毒婦竟也來了泊愧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宁舰,失蹤者是張志新(化名)和其女友劉穎拼卵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛮艰,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡腋腮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了壤蚜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片即寡。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袜刷,靈堂內(nèi)的尸體忽然破棺而出聪富,到底是詐尸還是另有隱情,我是刑警寧澤著蟹,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布墩蔓,位于F島的核電站,受9級特大地震影響萧豆,放射性物質(zhì)發(fā)生泄漏奸披。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一涮雷、第九天 我趴在偏房一處隱蔽的房頂上張望阵面。 院中可真熱鬧,春花似錦洪鸭、人聲如沸样刷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽置鼻。三九已至,卻和暖如春拾枣,著一層夾襖步出監(jiān)牢的瞬間沃疮,已是汗流浹背盒让。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留司蔬,地道東北人邑茄。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像俊啼,于是被迫代替她去往敵國和親肺缕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容