python爬虫遍历贴吧用户

此贴仅为了记录,不建议看代码 惨不忍睹啊
这是个老帖子,想起来刚学python的时候,就是自己啃文档,也没人教,到现在,还是很菜:)

原文的发布时间是2015-09-25 00:50,那会宿舍不断电了,估计宿舍里正打牌呢
原文链接


想法是遍历学校贴吧的用户,获取用户的数据用来分析,因为是初学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用户在命令行中查看进度。

因为不是多线程的,程序的效率真的非常的低。

希望下次可以做得更好。

最后修改:2017 年 04 月 29 日 02 : 31 PM

发表评论