在信息化越來越發(fā)達的今天伞广,網(wǎng)上的數(shù)據(jù)數(shù)不勝數(shù)汁果。當你想獲取某些資源或種子的時候涡拘,如果單純的靠手動自己一個個去下載,是非常的繁瑣和浪費時間据德。這個時候鳄乏,我們的python爬蟲技術就可以派上用場了。但你可能并不會寫爬蟲棘利,不要著急橱野,跟著我的文章看下去。我將帶你入門爬蟲技術赡译,讓你從此不用再為資源發(fā)愁仲吏,而是為身體發(fā)愁。
步驟一蝌焚、環(huán)境的安裝:
- 首先,在官網(wǎng)https://www.anaconda.com/download/下載一個與自己電腦系統(tǒng)相匹配的Anaconda3版本誓斥。
-
找到Anaconda3文件夾并打開只洒,再找到Scripts并打開,找到idle.exe劳坑。
Anaconda3
- 雙擊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ù)中找到跟此有關的信息段。如圖:
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(' ', '')
語句预明,將空格符號去掉。從而得到我們所需要的理想數(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(' ','')# 在html網(wǎng)頁中空格經(jīng)常用 表示,此處將 去掉:
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