爬取糗事百科

糗事百科純文抓取,包括用戶id,用戶頭像,糗事內(nèi)容

#coding:utf-8
import sys
import string
import urllib2
import sqlite3
import re
import time


class HTMLTool:
    #用非貪婪模式匹配\t 或者\n 或者空格 或者超鏈接 或者圖片
    BgnCharToNoneRex = re.compile('(\t|\n| |<a.*?>|<img.*?>)')
    #用非貪婪模式匹配任意 <>標簽
    EndCharToNoneRex = re.compile("<.*?>")

    #用非貪婪模式匹配任意 <p>標簽
    BgnPartRex = re.compile("<p.*?>")
    CharToNewLineRex = re.compile('(<br/>|</p>|<tr>|<div>|</div>)')
    CharToNextTabRex = re.compile("<td>")

    #將一些html符號實體轉(zhuǎn)變?yōu)樵挤?    replaceTab = [("<","<"),(">",">"),("&","&"),("&","\""),(" "," ")]

    def replace_char(self,x):
        x = self.BgnCharToNoneRex.sub("",x)
        x = self.BgnPartRex.sub("\n    ",x)
        x = self.CharToNewLineRex.sub("\n",x)
        x = self.CharToNextTabRex.sub("\t",x)
        x = self.EndCharToNoneRex.sub("",x)

        for t in self.replaceTab:
            x = x.replace(t[0],t[1])
        return x


class SQLITETool:

    def __init__(self,databaseName):
        self.databaseName = databaseName
        self.create_db()

    def create_db(self):
        conn = sqlite3.connect(self.databaseName)
        conn.close();

    def execute_table(self,sql):
        conn = sqlite3.connect(self.databaseName);
        cursor = conn.cursor();
        try:
            cursor.execute(sql)
        except Exception, e:
            print(Exception,":",e)
        finally:
            cursor.close()
            conn.commit()
            conn.close()


class QiuBaiSpider:

    def __init__(self):
        self.myTool = HTMLTool()
        self.sqlTool = SQLITETool("qiubai.db")
        self.nowPage = ""
        self.pageNumber = 1
        print("create")

    def pageHandle(self,page):
        
        myItems = re.findall(r'<a href="/users/(.*?)/".*?rel.*?![](//(.*?)).*?<span>(.*?)</span>.*?</div>',page,re.S)
        for item in myItems:
            user_id = item[0]
            icon_url = item[1]
            content = self.myTool.replace_char(item[2]).decode('utf-8')
            sql = 'insert into text_table(user_id, icon_url, content) values({},\'{}\',\'{}\');'.format(user_id,icon_url,content)
            self.sqlTool.execute_table(sql)


    def getPageNumber(self,page):
        myMatch = re.search(r'<ul class="pagination">(.*?)</ul>',page,re.S)
        myItems = re.findall(r'<li>.*?<span .*?>(.*?)</span>.*?</li>',myMatch.group(1),re.S)
        value = self.myTool.replace_char(myItems[6])
        print("count="+self.myTool.replace_char(myItems[6]))
        if value.isdigit():
            return int(myItems[6])
        else:
            return 0

    def getSinglePage(self,kindName,page):
        myUrl = "http://m.qiushibaike.com/{}/page/".format(kindName) + str(page)
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent':user_agent}
        try:
            req = urllib2.Request(myUrl,headers=headers)
            myResponse = urllib2.urlopen(req)
            self.nowPage = myResponse.read()
            return self.nowPage
        except Exception, e:
            print(Exception,":",e)
            return

    def getAllPageOfKind(self,kindName):
        try:
            #先獲取首頁,
            self.getSinglePage(kindName,1)
            pageNum = self.getPageNumber(self.nowPage)
            self.pageHandle(self.nowPage)
            for i in range(2,pageNum+1):
                print("page="+str(i))
                self.getSinglePage(kindName,i)
                self.pageHandle(self.nowPage)
                time.sleep(0.5)
        except Exception, e:
            print(Exception,":",e)


if __name__ == '__main__':
    reload(sys);
    sys.setdefaultencoding('utf-8')
    spider = QiuBaiSpider()
    sql = "CREATE TABLE text_table(caseid integer PRIMARY KEY autoincrement, user_id char(15),icon_url char(128),content char(512));"
    spider.sqlTool.execute_table(sql)
    spider.getAllPageOfKind("hot")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容