当前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用户在命令行中查看进度。
因为不是多线程的,程序的效率真的非常的低。
希望下次可以做得更好。