最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實現(xiàn)爬蟲統(tǒng)計學(xué)校BBS男女比例(一)

 更新時間:2015年12月31日 14:22:48   作者:學(xué)習(xí)編程知識  
這篇文章主要介紹了python實現(xiàn)爬蟲統(tǒng)計學(xué)校BBS男女比例,,需要的朋友可以參考下

一、項目需求

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

經(jīng)過檢查,BBS注冊用戶的id對應(yīng)1-300000,大概是30萬的用戶

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

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

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

二、最終結(jié)果

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

三、實現(xiàn)思路

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

得到下面?zhèn)€人主頁

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

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

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

四、數(shù)據(jù)如何存儲?

用數(shù)據(jù)庫還是其他方案?

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

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

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

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

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

查看網(wǎng)頁源代碼

<!-- 找出性別這一欄-->
<li><em>性別</em>女</li>

還可以找到活動時間-->
<li><em>上次發(fā)表時間</em>2015-11-4 20:04</li>

<!-- 有些id不存在相應(yīng)的用戶,會有這樣的提示-->
<p>抱歉,您指定的用戶空間不存在</p>

我們可以利用re模塊來進(jìn)行正則匹配

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 轉(zhuǎn)換 中文工具,可以用站長工具 Unicode 轉(zhuǎn)換 ASCII,ASCII 轉(zhuǎn)換 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發(fā)送一個get請求,將得到的html保存下來。注意編碼問題unicode(html, 'utf-8'),然后對html正則匹配seWord。

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

#對myurl頁面進(jìn)行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') #需要進(jìn)行編碼,否則找不到信息
  timeMatch = seWord.search(html) #因為seWord是用unicode表示
  if timeMatch:
    s = timeMatch.groups()
    return s[0]
  else:
    return None

五、錯誤處理

1、斷網(wǎng)情況(熱修復(fù)方案)

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

2、無法獲取性別

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

知識點(diǎn)小結(jié)

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

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

因為 python 的默認(rèn)編碼文件是用的 ANSCII 碼

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
BBS網(wǎng)頁源代碼使用utf-8進(jìn)行編碼的。

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

import sys
print sys.getdefaultencoding()

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

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

更改 sys.defaultencoding 為'utf-8'

后期整理的時候發(fā)現(xiàn)了自己一個小問題,因為正則表達(dá)式當(dāng)時用unicode來表示的,所以需要把html進(jìn)行unicode轉(zhuǎn)換進(jìn)行查找。
后來發(fā)現(xiàn)可以直接用漢字對原來的html進(jìn)行查找。

# -*- 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)

輸出

35423
33658

以上就是python實現(xiàn)爬蟲統(tǒng)計學(xué)校BBS男女比例的前期準(zhǔn)備和方案分析,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • Python學(xué)習(xí)之路之pycharm的第一個項目搭建過程

    Python學(xué)習(xí)之路之pycharm的第一個項目搭建過程

    這篇文章主要介紹了Python學(xué)習(xí)之路之pycharm的第一個項目搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過的問題及解決

    pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過的問題及解決

    這篇文章主要介紹了pyinstaller打包后偶爾出現(xiàn)黑窗口一閃而過的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用Python下載Bing圖片(代碼)

    使用Python下載Bing圖片(代碼)

    代碼另存為py文件,運(yùn)行圖片將自動下載到py文件相同目錄,如果覺得每次運(yùn)行找文件麻煩,可以新建py文件的快捷方式,程序還會自動給下載的圖片命名
    2013-11-11
  • Django中如何使用celery異步發(fā)送短信驗證碼詳解

    Django中如何使用celery異步發(fā)送短信驗證碼詳解

    Celery是Python開發(fā)的分布式任務(wù)調(diào)度模塊,這篇文章主要給大家介紹了關(guān)于Django中如何使用celery異步發(fā)送短信驗證碼的相關(guān)資料,主要內(nèi)容包括基礎(chǔ)介紹、工作原理、完整代碼等方面,需要的朋友可以參考下
    2021-09-09
  • python自動腳本的pyautogui入門學(xué)習(xí)

    python自動腳本的pyautogui入門學(xué)習(xí)

    這篇文章主要介紹了python自動腳本的pyautogui入門學(xué)習(xí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 基于OpenCV的網(wǎng)絡(luò)實時視頻流傳輸?shù)膶崿F(xiàn)

    基于OpenCV的網(wǎng)絡(luò)實時視頻流傳輸?shù)膶崿F(xiàn)

    這篇文章主要介紹了基于OpenCV的網(wǎng)絡(luò)實時視頻流傳輸?shù)膶崿F(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python循環(huán)緩沖區(qū)的應(yīng)用詳解

    Python循環(huán)緩沖區(qū)的應(yīng)用詳解

    循環(huán)緩沖區(qū)是一個線性緩沖區(qū),邏輯上被視為一個循環(huán)的結(jié)構(gòu),本文主要為大家介紹了Python中循環(huán)緩沖區(qū)的相關(guān)應(yīng)用,有興趣的小伙伴可以了解一下
    2025-03-03
  • Django-imagekit的使用詳解

    Django-imagekit的使用詳解

    ImageKit是一個用于處理圖像的Django應(yīng)用程序。這篇文章主要介紹了Django-imagekit的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • Python 中的range(),以及列表切片方法

    Python 中的range(),以及列表切片方法

    今天小編就為大家分享一篇Python 中的range(),以及列表切片方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • pyqt5 禁止窗口最大化和禁止窗口拉伸的方法

    pyqt5 禁止窗口最大化和禁止窗口拉伸的方法

    今天小編就為大家分享一篇pyqt5 禁止窗口最大化和禁止窗口拉伸的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論

安达市| 伽师县| 太保市| 冀州市| 汪清县| 阳泉市| 蒲城县| 海丰县| 峨眉山市| 三河市| 容城县| 望城县| 息烽县| 婺源县| 会泽县| 板桥市| 武威市| 商都县| 汝州市| 榆林市| 湘潭市| 惠水县| 绥宁县| 扶余县| 吉林市| 贵州省| 邹平县| 太仆寺旗| 光泽县| 上虞市| 安化县| 芜湖县| 瑞安市| 吉隆县| 凤城市| 渝中区| 女性| 肇东市| 军事| 澄迈县| 宁德市|