亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python&MongoDB爬取圖書館借閱記錄

2020-01-04 17:46:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了python&MongoDB爬取圖書館借閱記錄的相關資料,需要的朋友可以參考下
 

直接上需求和代碼
首先是需要爬取的鏈接和網頁:http://211.81.31.34/uhtbin/cgisirsi/x/0/0/57/49?user_id=LIBSCI_ENGI&password=LIBSC

  python&MongoDB爬取圖書館借閱記錄

登陸進去之后進入我的賬號——借閱、預約及申請記錄——借閱歷史就可以看到所要爬取的內容

python&MongoDB爬取圖書館借閱記錄

然后將借閱歷史中的題名、著者、借閱日期、歸還日期、索書號存入Mongodb數據庫中,以上便是這次爬蟲的需求。

下面開始:

各軟件版本為:

  • python 2.7.11
  • MongoDb 3.2.1
  • Pycharm 5.0.4
  • MongoDb Management Studio 1.9.3
  • 360極速瀏覽器 懶得查了

一、登陸模塊
python中的登陸一般都是用urllib和urllib2這兩個模塊,首先我們要查看網頁的源代碼:
<form name="loginform" method="post" action="/uhtbin/cgisirsi/?ps=nPdFje4RP9/理工大學館/125620449/303">
<!--  Copyright (c) 2004, Sirsi Corporation - myProfile login or view myFavorites -->
<!--  Copyright (c) 1998 - 2003, Sirsi Corporation - Sets the default values for USER_ID, ALT_ID, and PIN prompts. - The USER_ID, ALT_ID, and PIN page variables will be returned. -->

<!-- If the user has not logged in, first try to default to the ID based on the IP address - the $UO and $Uf will be set.  If that fails, then default to the IDs in the config file. If the user has already logged in, default to the logged in user's IDs, unless the user is a shared login. -->

 

      <!-- only user ID is used if both on -->
        <div class="user_name">
            <label for="user_id">借閱證號碼:</label>
            <input class="user_name_input" type="text" name="user_id" id="user_id"  maxlength="20" value=""/>
        </div>
    
     
        <div class="password">
            <label for="password">個人密碼:</label>
            <input class="password_input" type="password" name="password" id="password"  maxlength="20" value=""/>
        </div>  
    
     
    <input type="submit" value="用戶登錄" class="login_button"/>
查找網頁中的form表單中的action,方法為post,但是隨后我們發現,該網頁中的action地址不是一定的,是隨機變化的,刷新一下就變成了下面這樣子的:
 <form name="loginform" method="post" action="/uhtbin/cgisirsi/?ps=1Nimt5K1Lt/理工大學館/202330426/303">
我們可以看到/?ps到/之間的字符串是隨機變化的(加粗部分),于是我們需要用到另一個模塊——BeautifulSoup實時獲取該鏈接:
url = "http://211.81.31.34/uhtbin/cgisirsi/x/0/0/57/49?user_id=LIBSCI_ENGI&password=LIBSC"
   res = urllib2.urlopen(url).read()
    soup = BeautifulSoup(res, "html.parser")
login_url = "http://211.81.31.34" + soup.findAll("form")[1]['action'].encode("utf8")
之后就可以正常使用urllib和urllib來模擬登陸了,下面列舉一下BeautifulSoup的常用方法,之后的HTML解析需要:

1.soup.contents 該屬性可以將tag的子節點以列表的方式輸出

2.soup.children 通過tag的.children生成器,可以對tag的子節點進行循環

3.soup.parent 獲取某個元素的父節點

4.soup.find_all(name,attrs,recursive,text,**kwargs) 搜索當前tag的所有tag子節點,并判斷是否符合過濾器的條件

5.soup.find_all("a",class="xx") 按CSS搜索

6.find(name,attrs,recursive,text,**kwargs) 可以通過limit和find_all區分開

二、解析所獲得的HTML

先看看需求中的HTML的特點:
<tbody id="tblSuspensions">
<!-- OCLN changed Listcode to Le to support charge history -->
     <!-- SIRSI_List Listcode="LN" -->

     <tr>
       <td class="accountstyle" align="left">
          <!-- SIRSI_Conditional IF List_DC_Exists="IB" AND NOT List_DC_Comp="IB^" -->
<!-- Start title here -->
 <!-- Title -->
            做人要低調,說話要幽默 孫郡鎧編著
        </td>
       <td class="accountstyle author" align="left">
          <!-- Author -->
            孫郡鎧 編著
        </td>
       <td class="accountstyle due_date" align="center">
          <!-- Date Charged -->
            2015/9/10,16:16
       </td>
        <td class="accountstyle due_date" align="left">
        <!-- Date Returned -->
            2015/9/23,15:15
        </td>

        <td class="accountstyle author" align="center">
          <!-- Call Number -->
            B821-49/S65
        </td>

      </tr>

     <tr>
       <td class="accountstyle" align="left">
          <!-- SIRSI_Conditional IF List_DC_Exists="IB" AND NOT List_DC_Comp="IB^" -->
<!-- Start title here -->
 <!-- Title -->
            我用一生去尋找 潘石屹的人生哲學 潘石屹著
        </td>
       <td class="accountstyle author" align="left">
          <!-- Author -->
            潘石屹, 1963- 著
        </td>
       <td class="accountstyle due_date" align="center">
          <!-- Date Charged -->
            2015/9/10,16:16
       </td>
        <td class="accountstyle due_date" align="left">
        <!-- Date Returned -->
            2015/9/25,15:23
        </td>

        <td class="accountstyle author" align="center">
          <!-- Call Number -->
            B821-49/P89
        </td>

      </tr>
由所有代碼,注意這行:

<tbody id="tblSuspensions">
該標簽表示下面的內容將是借閱書籍的相關信息,我們采用遍歷該網頁所有子節點的方法獲得id="tblSuspensions"的內容:
   for i, k in enumerate(BeautifulSoup(detail, "html.parser").find(id='tblSuspensions').children):
     # print i,k
        if isinstance(k, element.Tag):
             bookhtml.append(k)
                # print type(k)
三、提取所需要的內容

這一步比較簡單,bs4中的BeautifulSoup可以輕易的提?。?br /> for i in bookhtml:
                # p
                # rint i
                name = i.find(class_="accountstyle").getText()
                author = i.find(class_="accountstyle author", align="left").getText()
                Date_Charged = i.find(class_="accountstyle due_date", align="center").getText()
                Date_Returned = i.find(class_="accountstyle due_date", align="left").getText()
                bookid = i.find(class_="accountstyle author", align="center").getText()
                bookinfo.append(
                    [name.strip(), author.strip(), Date_Charged.strip(), Date_Returned.strip(), bookid.strip()])
這一步采用getText()的方法將text中內容提取出來;strip()方法是去掉前后空格,同時可以保留之間的空格,比如:s="   a a  ",使用s.strip()之后即為"a a"

四、連接數據庫
據說NoSQL以后會很流行,隨后采用了Mongodb數據庫圖圖新鮮,結果一折騰真是煩,具體安裝方法在上一篇日記中記載了。
1.導入python連接Mongodb的模塊
  import pymongo
2.創建python和Mongodb的鏈接:
# connection database
conn = pymongo.MongoClient("mongodb://root:root@localhost:27017")
db = conn.book
collection = db.book
3.將獲得的內容保存到數據庫:
user = {"_id": xuehao_ben,
                        "Bookname": name.strip(),
                        "Author": author.strip(),
                        "Rent_Day": Date_Charged.strip(),
                        "Return_Day": Date_Returned.strip()}
                j += 1
                collection.insert(user)
上面基本完成了,但是爬蟲做到這個沒有意義,重點在下面

五、獲取全校學生的借閱記錄

  我們學校的圖書館的密碼都是一樣的,應該沒有人閑得無聊改密碼,甚至沒有人用過這個網站去查詢自己的借閱記錄,所以,做個循環,就可以輕易的獲取到全校的借閱記錄了,然后并沒有那么簡單,str(0001)強制將int變成string,但是在cmd的python中是報錯的(在1位置),在pycharm前面三個0是忽略的,只能用傻瓜式的四個for循環了。好了,下面是所有代碼:
# encoding=utf8
import urllib2
import urllib
import pymongo
import socket

from bs4 import BeautifulSoup
from bs4 import element

# connection database
conn = pymongo.MongoClient("mongodb://root:root@localhost:27017")
db = conn.book
collection = db.book


# 循環開始
def xunhuan(xuehao):
    try:
        socket.setdefaulttimeout(60)
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.bind(("127.0.0.1", 80))
        url = "http://211.81.31.34/uhtbin/cgisirsi/x/0/0/57/49?user_id=LIBSCI_ENGI&password=LIBSC"
        res = urllib2.urlopen(url).read()
        soup = BeautifulSoup(res, "html.parser")
        login_url = "http://211.81.31.34" + soup.findAll("form")[1]['action'].encode("utf8")
        params = {
            "user_id": "賬號前綴你猜你猜" + xuehao,
            "password": "密碼你猜猜"
        }
        print params
        params = urllib.urlencode(params)
        req = urllib2.Request(login_url, params)
        lianjie = urllib2.urlopen(req)
        # print lianjie
        jieyue_res = lianjie.read()
        # print jieyue_res     首頁的HTML代碼
        houmian = BeautifulSoup(jieyue_res, "html.parser").find_all('a', class_='rootbar')[1]['href']
        # print houmian
        houmian = urllib.quote(houmian.encode('utf8'))
        url_myaccount = "http://211.81.31.34" + houmian
        # print url_myaccount
        # print urllib.urlencode(BeautifulSoup(jieyue_res, "html.parser").find_all('a',class_ = 'rootbar')[0]['href'])

        lianjie2 = urllib.urlopen(url_myaccount)
        myaccounthtml = lianjie2.read()
        detail_url = ''
        # print (BeautifulSoup(myaccounthtml).find_all('ul',class_='gatelist_table')[0]).children
        print "連接完成,開始爬取數據"
        for i in (BeautifulSoup(myaccounthtml, "html.parser").find_all('ul', class_='gatelist_table')[0]).children:
            if isinstance(i, element.NavigableString):
                continue
            for ii in i.children:
                detail_url = ii['href']
            break
        detail_url = "http://211.81.31.34" + urllib.quote(detail_url.encode('utf8'))
        detail = urllib.urlopen(detail_url).read()
        # print detail
        bookhtml = []
        bookinfo = []

        # 解決沒有借書
        try:
            for i, k in enumerate(BeautifulSoup(detail, "html.parser").find(id='tblSuspensions').children):
                # print i,k
                if isinstance(k, element.Tag):
                    bookhtml.append(k)
                    # print type(k)
            print "look here!!!"
            j = 1
            for i in bookhtml:
                # p
                # rint i
                name = i.find(class_="accountstyle").getText()
                author = i.find(class_="accountstyle author", align="left").getText()
                Date_Charged = i.find(class_="accountstyle due_date", align="center").getText()
                Date_Returned = i.find(class_="accountstyle due_date", align="left").getText()
                bookid = i.find(class_="accountstyle author", align="center").getText()
                bookinfo.append(
                    [name.strip(), author.strip(), Date_Charged.strip(), Date_Returned.strip(), bookid.strip()])
                xuehao_ben = str(xuehao) + str("_") + str(j)
                user = {"_id": xuehao_ben,
                        "Bookname": name.strip(),
                        "Author": author.strip(),
                        "Rent_Day": Date_Charged.strip(),
                        "Return_Day": Date_Returned.strip()}
                j += 1
                collection.insert(user)
        except Exception, ee:
            print ee
            print "此人沒有借過書"
            user = {"_id": xuehao,
                    "Bookname": "此人",
                    "Author": "沒有",
                    "Rent_Day": "借過",
                    "Return_Day": "書"}
            collection.insert(user)

        print "********" + str(xuehao) + "_Finish"+"**********"
    except Exception, e:
        s.close()
        print e
        print "socket超時,重新運行"
        xunhuan(xuehao)


# with contextlib.closing(urllib.urlopen(req)) as A:
#    print A
#   print xuehao
# print req

for i1 in range(0, 6):
    for i2 in range(0, 9):
        for i3 in range(0, 9):
            for i4 in range(0, 9):
                xueha = str(i1) + str(i2) + str(i3) + str(i4)
                chushi = '0000'
                if chushi == xueha:
                    print "=======爬蟲開始=========="
                else:
                    print xueha + "begin"
                    xunhuan(xueha)

conn.close()
print "End!!!"
下面是Mongodb Management Studio的顯示內容(部分):

 python&MongoDB爬取圖書館借閱記錄

   總結:這次爬蟲遇到了很多問題,問了很多人,但是最終效果還不是很理想,雖然用了try except語句,但是還是會報錯10060,連接超時(我只能質疑學校的服務器了TT),還有就是,你可以看到數據庫中列的順序不一樣=。=這個我暫時未理解,希望大家可以給出解決方法。

以上就是本文的全部內容,希望對大家的學習有所幫助。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男人天堂古典| 久久伊人精品视频| 久久久久久国产精品| 中文字幕欧美专区| 美女黄色丝袜一区| 欧美日韩国产一区二区三区| 日韩中文字幕国产精品| 伊人一区二区三区久久精品| 国产精品福利在线观看网址| 亚洲欧美在线一区二区| 久久久精品一区二区| 亚洲bt天天射| 黄色成人在线免费| 91精品国产91久久| 亚洲电影av在线| 日韩精品在线视频| 欧美精品激情视频| 日韩有码在线视频| 亚洲人免费视频| 欧美日韩一区二区三区在线免费观看| 97在线观看视频国产| 2019中文字幕在线观看| 日本一区二区在线免费播放| 国产91精品久久久久久| 91精品国产网站| 高清视频欧美一级| 日韩av网址在线观看| 欧美精品videofree1080p| 自拍偷拍亚洲一区| 欧美黄色片免费观看| 91午夜在线播放| 国产精品第2页| 国产精品久久久久久久美男| 97成人超碰免| 亚洲精品www久久久| 欧美激情一级欧美精品| 欧美一区二区三区艳史| 欧美在线视频观看免费网站| 国产精品福利无圣光在线一区| 亚洲影院污污.| 亚洲成人久久久久| 91av在线免费观看| 欧美视频在线观看 亚洲欧| 欧美性受xxxx黑人猛交| 国产精品综合网站| 精品亚洲aⅴ在线观看| 亚洲在线第一页| 欧美日韩在线视频一区| 啊v视频在线一区二区三区| 欧美特黄级在线| 国产精品亚洲视频在线观看| 欧美俄罗斯性视频| 亚洲成av人影院在线观看| 狠狠躁夜夜躁人人躁婷婷91| 亚洲欧美激情一区| 黄色一区二区在线| 久久国产精品亚洲| 精品国模在线视频| 亚洲成人网在线| 日韩av在线一区二区| 欧洲精品在线视频| 国产在线精品一区免费香蕉| 日本精品性网站在线观看| 亚洲精品资源在线| 成人a在线视频| 日本欧美国产在线| 国产精品偷伦视频免费观看国产| 91精品国产综合久久香蕉922| 午夜精品国产精品大乳美女| 亚洲人成网站999久久久综合| 午夜精品久久久99热福利| 中文字幕在线看视频国产欧美在线看完整| 国产精品视频区1| 国产综合色香蕉精品| 精品久久久久久中文字幕大豆网| 亚洲iv一区二区三区| 久久综合免费视频影院| 亚洲精品福利免费在线观看| 欧美大片网站在线观看| 亚洲专区国产精品| 日韩欧美国产骚| 福利一区福利二区微拍刺激| 久久久视频免费观看| 亚洲一区二区在线播放| 伊人成人开心激情综合网| 97在线视频免费播放| 国产91色在线播放| 美日韩精品视频免费看| 久久久av电影| 欧美肥臀大乳一区二区免费视频| 97精品久久久| 亚洲欧美在线x视频| 久久精品2019中文字幕| 久久中文精品视频| 精品成人69xx.xyz| 国产+成+人+亚洲欧洲| 性色av一区二区三区红粉影视| 欧美国产精品日韩| 色天天综合狠狠色| 欧美一乱一性一交一视频| 亚洲激情自拍图| 4388成人网| 欧美成人全部免费| 久久精品国产成人精品| 亚洲国产高清自拍| 午夜精品久久久99热福利| 日韩视频免费在线观看| 亚洲一区999| 国产91精品青草社区| 26uuu日韩精品一区二区| 国产精品成人va在线观看| 成人黄色av播放免费| 精品亚洲一区二区三区在线观看| 蜜臀久久99精品久久久久久宅男| 91沈先生在线观看| 国产精品一区久久| 欧美激情视频在线免费观看 欧美视频免费一| 国产在线视频2019最新视频| 日韩av成人在线| 蜜月aⅴ免费一区二区三区| 国产91精品久久久久久| 国产精品美乳一区二区免费| 精品久久久免费| 欧美午夜精品久久久久久久| 亚洲国产精品网站| 日韩美女福利视频| 欧美专区国产专区| 欧美怡春院一区二区三区| 国产高清视频一区三区| 57pao成人国产永久免费| 日本高清不卡在线| 欧美精品激情blacked18| 国产精品视频免费在线观看| 国产xxx69麻豆国语对白| 欧美在线视频一区二区| 成人精品一区二区三区电影黑人| 亚洲第一黄色网| 91美女片黄在线观看游戏| 亚洲一区二区三区视频播放| 亚洲电影免费观看高清完整版| 97涩涩爰在线观看亚洲| 欧美性视频网站| 久久91超碰青草是什么| 欧美激情国产日韩精品一区18| 亚洲综合色激情五月| 国产suv精品一区二区三区88区| 成人写真福利网| 午夜精品一区二区三区视频免费看| 国产精品高清在线观看| 欧美中文字幕视频| 精品人伦一区二区三区蜜桃网站| 日本精品性网站在线观看| 国产成人拍精品视频午夜网站| 亚洲精品av在线播放| 亚洲精品久久久久国产| 成人福利免费观看| 亚洲一区亚洲二区亚洲三区| 欧美人成在线视频| 福利精品视频在线| 久久久国产精品x99av| 国产裸体写真av一区二区| 国产视频一区在线| 亚洲激情视频网站| 最近2019中文免费高清视频观看www99|