国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python實現爬蟲統計學校BBS男女比例(一)

2020-01-04 17:52:57
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了python實現爬蟲統計學校BBS男女比例,,需要的朋友可以參考下
 

一、項目需求

前言:BBS上每個id對應一個用戶,他們注冊時候會填寫性別(男、女、保密三選一)。

經過檢查,BBS注冊用戶的id對應1-300000,大概是30萬的用戶

筆者想用Python統計BBS上有多少注冊用戶,以及這些用戶的性別分布

順帶可以統計最近活動用戶是多少,其中男、女、保密各占多少

活動用戶的限定為“上次活動時間”為 2015年

二、最終結果

性別信息保存在文本里,一行表示一個用戶的信息,各列分別表示 
【行數,id(涂掉了),性別,最后活躍時間】

python實現爬蟲統計學校BBS男女比例(一)

python實現爬蟲統計學校BBS男女比例(一)

python實現爬蟲統計學校BBS男女比例(一)

三、實現思路

用戶性別信息在哪個頁面?

得到下面個人主頁

python實現爬蟲統計學校BBS男女比例(一)

把后面的uid=256730數字改成其他數字,就可以得到其他人的主頁。

另外,如果上面的鏈接無法得到性別,可以再通過這個鏈接,也是修改uid可以訪問其他人主頁。

http://rs.xidian.edu.cn/home.php?mod=space&uid=256730&do=profile

python實現爬蟲統計學校BBS男女比例(一)

四、數據如何存儲?

用數據庫還是其他方案?

為了閱讀方便,我們考慮用文本文件存儲。

30萬的用戶存儲在一個文本里會導致文本過大。如果程序被意外終止,30 萬的用戶數據需要重新爬取。

我們我們考慮一個文本里存放1000條記錄,理論上可以用30個文本來存放30萬條數據。

文本名稱為correct1-1001.txt correct47001-48001.txt,注意:1-1001是[1,1001),包含1,不包含1001

1、使用正則匹配找出性別

查看網頁源代碼

<!-- 找出性別這一欄--><li><em>性別</em>女</li>還可以找到活動時間--><li><em>上次發表時間</em>2015-11-4 20:04</li><!-- 有些id不存在相應的用戶,會有這樣的提示--><p>抱歉,您指定的用戶空間不存在</p>

python實現爬蟲統計學校BBS男女比例(一)

我們可以利用re模塊來進行正則匹配

 

sexRe = re.compile(u'em>/u6027/u522b</em>(.*?)</li')timeRe = re.compile(u'em>/u4e0a/u6b21/u6d3b/u52a8/u65f6/u95f4</em>(.*?)</li')notexistRe = re.compile(u'(p>)/u62b1/u6b49/uff0c/u60a8/u6307/u5b9a/u7684/u7528/u6237/u7a7a/u95f4/u4e0d/u5b58/u5728<')

因為中文的原因,需要Unicode 轉換 中文工具,可以用站長工具 Unicode 轉換 ASCII,ASCII 轉換 Unicode,比如下面這個鏈接: http://tool.chinaz.com/Tools/Unicode.aspx

  • 性別的Unicode 是 /u6027/u522b
  • 上次活動時間 /u4e0a/u6b21/u6d3b/u52a8/u65f6/u95f4
  • 抱歉,您指定的用戶空間不存在
  • /u62b1/u6b49/uff0c/u60a8/u6307/u5b9a/u7684/u7528/u6237/u7a7a/u95f4/u4e0d/u5b58/u5728

這兒是簡單獲取性別的源代碼,通過urllib2對鏈接myurl發送一個get請求,將得到的html保存下來。注意編碼問題unicode(html, 'utf-8'),然后對html正則匹配seWord。

如果該用戶有性別信息,返回對應的性別;否則,返回None

#對myurl頁面進行seWord匹配查找#seWord是用unicode表示def getInfo(myurl, seWord):  headers = {    'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'  }  req = urllib2.Request(    url=myurl,    headers=headers  )  time.sleep(0.3)  response = urllib2.urlopen(req)  html = response.read()  html = unicode(html, 'utf-8') #需要進行編碼,否則找不到信息  timeMatch = seWord.search(html) #因為seWord是用unicode表示  if timeMatch:    s = timeMatch.groups()    return s[0]  else:    return None

五、錯誤處理

1、斷網情況(熱修復方案)

  • 總共爬蟲需要幾天時間,用的校園網,中間可能有斷網的可能。
  • 如果發現斷網,我們可以重新連上互聯網,這中間有些用戶的性別沒有獲取到。
  • 程序運行時間較長,斷一次網就重新從id=1開始跑是不科學的。而且你也不能保證這次就網一直是好的。
  • 為了不讓程序重頭開始跑,所以我們是記錄下斷網中漏掉的用戶id。
  • 等一次程序跑完了(這需要幾天的時間),我們再跑記錄下來的id重新跑一次。

2、無法獲取性別

  • 這種有兩種情況:
  • 一是真的沒有性別(用戶沒有填寫)
  • 二是服務器抽了,咱們請求網頁失敗了。
  • 這種咱們也是和上面類似,記錄下失敗的id,后面再重新跑。

知識點小結

對于這種錯誤,SyntaxError: Non-ASCII character '/xe5' in file

需要在文件開頭加上# -*- coding: UTF-8 -*-

因為 python 的默認編碼文件是用的 ANSCII 碼

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
BBS網頁源代碼使用utf-8進行編碼的。

本項目設計到中文字符,自然會遇到編碼問題。

import sysprint sys.getdefaultencoding()

輸出 ascii 
從上面的代碼可以看出 sys.defaultencoding 是 ANSCII,ANSCII是無法對中文字符進行編碼的。UTF-8是Unicode的實現方式之一,可以對中文字符進行編碼。遇到中文字符,我們需要加上這行代碼

reload(sys)# sys.setdefaultencoding('utf-8')

更改 sys.defaultencoding 為'utf-8'

后期整理的時候發現了自己一個小問題,因為正則表達式當時用unicode來表示的,所以需要把html進行unicode轉換進行查找。 
后來發現可以直接用漢字對原來的html進行查找。

# -*- coding: UTF-8 -*-  html = response.read()  sexRe = re.compile('em>性別</em>(.*?)</li')  timeMatch = sexRe.search(html)  if timeMatch:    s = timeMatch.groups()    print "字符串 "+s[0]  html = unicode(html, 'utf-8')  sexRe = re.compile(u'em>/u6027/u522b</em>(.*?)</li')  timeMatch = sexRe.search(html)  if timeMatch:    s = timeMatch.groups()    print "unicode " +s[0]

輸出

字符串 女unicode 女  html = response.read()  print len(html)  html = unicode(html, 'utf-8') #  print len(html)

輸出 

html = response.read()  print len(html)  html = unicode(html, 'utf-8') #  print len(html)

輸出

3542333658

以上就是python實現爬蟲統計學校BBS男女比例的前期準備和方案分析,希望對大家的學習有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌黎县| 谢通门县| 望奎县| 县级市| 望江县| 通榆县| 榆中县| 资中县| 汕尾市| 林芝县| 平顺县| 辽源市| 德化县| 巴彦淖尔市| 威信县| 宜阳县| 凉城县| 天等县| 常熟市| 芦山县| 类乌齐县| 门头沟区| 桂林市| 治多县| 清河县| 交城县| 灌南县| 山阴县| 陈巴尔虎旗| 巨鹿县| 万全县| 昌宁县| 鄢陵县| 塔河县| 什邡市| 垣曲县| 贵南县| 景德镇市| 黎城县| 正定县| 太白县|