糗事百科純文抓取,包括用戶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ù)。