【新手】python爬蟲遍歷貼吧用戶



 

當前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用戶在命令行中查看進度。

因為不是多線程的,程序的效率真的非常的低。

 

希望下次可以做得更好。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM