當前blog已不再更新,請移步新家:moozik.cn
想法是遍歷學校貼吧的用戶,獲取用戶的數據用來分析,因為是初學python,就一點一點的寫,變量命名也不規范,見諒
系統:windows
版本:python 3.5
#獲取河北大學工商學院吧1000頁以內的用戶 import urllib.request import re url='http://tieba.baidu.com/f/like/furank?kw=%BA%D3%B1%B1%B4%F3%D1%A7%B9%A4%C9%CC%D1%A7%D4%BA&pn=' webfile=open('tieba.txt','w') for each in range(1000): url2=url+str(each+1) webdata=urllib.request.urlopen(url2).read() webdata = webdata.decode('gbk') userdata=re.findall('<table(.*?)</table>',webdata,re.S) webfile.write(userdata[1]+'\n') print(str(each+1)+'page done!') webfile.close()
上面的代碼遍歷了貼吧排名頁面的前1000頁,截取了網頁中需要分析的段落,並存儲在文件中
import re #打開tieba.txt用於讀取 tiebadata=open('tieba.txt','r') userlist=open('user.txt','w') tmp=tiebadata.readline() i=1 while not tmp=='': print(i) list=re.findall('<a.*?>(.*?)</a>.*?<td class="drl_item_title"><div class="bg_lv(\d+)"><span>.*?<td class="drl_item_exp"><span>(\d+)</span>',tmp) for each in list: userlist.write(each[0]+','+each[1]+','+each[2]+'\n') tmp=tiebadata.readline() i=i+1 userlist.close() tiebadata.close()
上面讀取了tieba.txt文件,每次讀取一行,使用正則表達式截取了用戶名,等級,經驗值三個數據,保存在了user.txt
#獲取所有用戶的詳細信息 import re import urllib.request import urllib.parse userlist=open('user.txt','r') userlist2=open('usermore.txt','w') text=userlist.read() userlist.close() alluser=text.split('\n') i=1 for each in alluser: user2=each.split(',') api='http://tieba.baidu.com/home/get/panel?ie=utf-8&un=' web=urllib.request.urlopen(api+urllib.parse.quote(user2[0])).read() #使用web.decode('unicode_escape')解碼unicode編碼的漢字 web=web.decode('unicode_escape') usertmp=re.findall('"id":(\d+).*?"sex":"(.*?)","tb_age":(.*?),"post_num":(.*?),',web) userlist2.write(each+','+str(','.join(usertmp[0]))+'\n') print(str(i)+user2[0]) i=i+1 userlist2.close()
上面這段代碼是有問題的,總是爆出一個錯誤,IndexError: list index out of range,顯示寫文件那一行出錯,在pychrm中執行了幾行就報錯,在命令行中還執行的多一些,現在還是很費解,希望有了解的前輩解答一下。
上面這一段是讀取user.txt,直接使用\n分割文本,制造了一個大列表,然后使用for循環,我覺得這里是不是按行讀取會更好一些。
循環中,使用用戶id組合url獲取更多的用戶數據,因為百度的接口獲取的數據的文本不是明文,所以這里使用decode解碼,之后依然是使用正則獲取了用戶的數字id,性別,吧齡,發帖數。之后print變量i用戶在命令行中查看進度。
因為不是多線程的,程序的效率真的非常的低。
希望下次可以做得更好。