step 1:构建一个提取糗事百科笑话的函数
import urllib2
import urllib
import re
import thread
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
def GetPage(page):
myUrl = "http://www.qiushibaike.com/hot/page/"+ str(page) + "/?s=4936484"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(myUrl, headers = headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read()
unicodePage = myPage.decode("utf-8")
myItems = re.findall('<div.*?class="content".*?>.*?<span>(.*?)</span>.*?</div>',unicodePage,re.S)
items=[]
for item in myItems:
print item + '\n'
#items.append(item[0].replace("\n",""))
#return items
if __name__=="__main__":
a=GetPage(2)
print a
step 2:构建一个获得糗事百科笑话的类,并保证每次读取到的有2个页面的内容。
tips:如有报错,注意下缩进关系
import urllib2
import urllib
import re
import thread
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class spider_qs:
def __init__(self):
self.page = 1
self.pages = []
self.enable = True
#将每一页的段子提取出来,添加到列表中并且返回列表
def GetPage(self,page):
myUrl = "http://www.qiushibaike.com/hot/page/"+ str(page) + "/?s=4936484"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(myUrl, headers = headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read()
unicodePage = myPage.decode("utf-8")
myItems = re.findall('<div.*?class="content".*?>.*?<span>(.*?)</span>.*?</div>',unicodePage,re.S)
items=[]
for item in myItems:
#print item + '\n'
items.append(item) #items.append(item.replace("\n",""))将item的换行符转为空白
return items
#用于加载新的段子,保证self.pages里面有2页的爬取内容
def LoadPage(self):
# 如果用户未输入quit则一直运行
while self.enable:
# 如果pages数组中的内容小于2个
if len(self.pages) < 2:
try:
# 获取新的页面中的段子们,从第1页开始
myPage = self.GetPage(self.page)
self.page += 1
self.pages.append(myPage)
except:
print '无法链接糗事百科!'
else:
time.sleep(1)
return self.pages
if __name__=="__main__":
a=spider_qs()
b=a.LoadPage()
print b
step 3:构建一个完整的爬虫程序
tips:线程的用法不太会
import urllib2
import urllib
import re
import thread
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class spider_qs:
def __init__(self):
self.page = 1
self.pages = []
self.enable = False
#将每一页的段子提取出来,添加到列表中并且返回列表
def GetPage(self,page):
myUrl = "http://www.qiushibaike.com/hot/page/"+ str(page) + "/?s=4936484"
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
req = urllib2.Request(myUrl, headers = headers)
myResponse = urllib2.urlopen(req)
myPage = myResponse.read()
unicodePage = myPage.decode("utf-8")
myItems = re.findall('<div.*?class="content".*?>.*?<span>(.*?)</span>.*?</div>',unicodePage,re.S)
items=[]
for item in myItems:
#print item + '\n'
items.append(item) #items.append(item.replace("\n",""))将item的换行符转为空白
return items
#用于加载新的段子,保证self.pages里面有2页的爬取内容
def LoadPage(self):
# 如果用户未输入quit则一直运行
while self.enable:
# 如果pages数组中的内容小于2个
if len(self.pages) < 2:
try:
# 获取新的页面中的段子们,从第1页开始
myPage = self.GetPage(self.page)
self.page += 1
self.pages.append(myPage) #起始状态下,self.pages包含有第1、2页面的段子
except:
print '无法链接糗事百科!'
else:
time.sleep(1)
return self.pages
#启动该类
def Start(self):
self.enable = True
page = self.page #为1
print u'正在加载中请稍候......'
# 新建一个线程在后台加载段子并存储
thread.start_new_thread(self.LoadPage,()) #help(thread.start_new_thread)
#----------- 加载处理糗事百科 -----------
while self.enable:
# 如果self的page数组中存有元素
if self.pages:
nowPage = self.pages[0] #[【】,【】],将第一个列表赋值给nowPage
del self.pages[0] #删除self.pages,则Loadpage函数将继续往第3页读取段子
self.ShowPage(nowPage,page)
page += 1
def ShowPage(self,nowPage,page):
for items in nowPage:
print u'第%d页' % page , items
myInput = raw_input()
if myInput == "quit": #输入quit,则退出程序。否则按任意键都能继续
self.enable = False
break
if __name__=="__main__":
print u'请按下回车浏览今日的糗百内容:'
raw_input('') #此处输入回车键即可不断往下读取糗百段子
a=spider_qs()
myqb=a.Start()
参考链接:
http://blog.csdn.net/pleasecallmewhy/article/details/8932310