Python抓取極客學院開放數據

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人學習

發佈了35 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章