Python 是比較美的語言,相見恨晚
抓數據的一般步驟
首先,鎖定目標,也就是確定網站鏈接的格式。
其次,在瀏覽器中或者在wireshark中嘗試抓包,分析數據,主要是利用瀏覽器的查看源碼功能,分析需要抓包的數據的結構特點,確定規律。
編寫python代碼,分析數據,反反覆覆,得到腳本。
我的例子
#encoding:utf-8
import requests
import re
class Spider:
#構造函數
def __init__(self):
print u('開始執行爬蟲')
#用來獲取頁面源碼
def getSource(self,url):
html=requests.get(url)
return html
#產生不同頁數
def changePage(self,url,total_page):
now_page=int(re.search('pageNum=(\d+)',url,re.S).group(1))
page_group=[]
for i in range(now_page,total_page+1):
link=re.sub('pageNum=\d+','pageNum=%s'%i,url,re.S)
page_group.append(link)
return page_group
#獲取每個課程塊的內容,方便以後目標的鎖定
def getClass(self,source):
everyClass=re.findall('(<li id=.*?</li>)',source,re.S)
return everyClass
#獲取明確的目標
def getInfo(self,eachClass):
info{}
info['title']=re.search('class="lessonimg" title="(.*?)"',eachClass,re.S).group(1)
info['content']=re.search('display: none;">(.*?)</p>',eachClass,re.S).group(1).replace('\n','')
info['srcImg']=re.search('<img src="(.*?)"',eachClass,re.S).group(1)
timeAndLevel=re.findall('<em>(.*?)</em>',eachClass,re.S)
info['classtime'] =timeAndLevel[0].replace('\n', '')
info['classlevel'] = timeAndLevel[1]
info['learnnum'] = re.search('class="learn-number">(.*?)</em>', eachclass, re.S).group(1)
return info
# saveinfo用來保存結果到info.txt文件中
def saveinfo(self, classinfo):
f = open('info.txt', 'a')
for each in classinfo:
f.writelines(("title:" + each['title'] + "\n").encode('utf-8'))
f.writelines(("srcImg:" + each['srcImg'] + "\n").encode('utf-8'))
f.writelines("content:" + (each['content'] + "\n").encode('utf-8').lstrip())
f.writelines(("classtime:" + each['classtime'] + "\n").encode('utf-8'))
f.writelines(("classlevel:" + each['classlevel'] + "\n").encode('utf-8'))
f.writelines(("learnnum:" + each['learnnum'] + "\n\n").encode('utf-8'))
f.close()
if __name__ == '__main__':
classinfo = []
url = 'http://www.jikexueyuan.com/course/?pageNum=1'
jikespider = Spider()
all_links = jikespider.changepage(url, 10)
for link in all_links:
print u'正在處理頁面:' + link
html = jikespider.getsource(link)
everyclass = jikespider.geteveryclass(html)
for each in everyclass:
info = jikespider.getinfo(each)
classinfo.append(info)
jikespider.saveinfo(classinfo)
運行的結果:
開始執行爬蟲
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=1
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=2
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=3
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=4
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=5
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=6
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=7
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=8
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=9
正在處理頁面:http://www.jikexueyuan.com/course/?pageNum=10
Process finished with exit code 0
info.txt文件一個內容:
title:登錄到Guitar運行的 Linux系統
srcImg:http://a1.jikexueyuan.com/home/201607/25/07df/57956e9d40cbe.jpg
content:本課程主要介紹除了使用 HDMI 接口以外的系統登陸方式,便於後期在條件受限的情況下進行Guitar 的開發和學習。
classtime:3課時 8分鐘
classlevel:初級
learnnum:2515人學習