您的位置:首页 > 编程语言 > Python开发

初学爬虫,爬取糗百段子(修改版,亲测)

2016-05-02 22:23 393 查看
这几天在网上看爬虫教程,有一个教程觉得写得很好,研究了一下,感谢作者做出这么好的教程。

原网页地址为:http://blog.csdn.net/column/details/why-bug.html

这个代码也是基于原作者爬虫代码修改而来,原网页地址为:http://blog.csdn.net/pleasecallmewhy/article/details/8932310

在代码中,已注释一些自己的理解,详尽之处请参考原文。

另外,暂时还没学会BS4的用法,也没有爬取图片,这些功能也会慢慢修改,欢迎看到此篇文章的人多交流,共同学习。

#-*- coding:utf-8 -*-

# from bs4 import BeautifulSoup
import urllib2
import re
import time
import thread

#建立一个爬虫的类
class spider:

def __init__(self):
#首先确定加载的页数
self.page = 1
self.pages = []
# 后面有循环
self.loop = False

# 扣除段子部分的代码
# 这个部分大部分爬虫都是一样
def getPage(self,page):
# 糗事百科地址,这个不要弄错
# 爬其他东西把地址换一下就可以
# 这个部分是伪装成浏览器进入糗百的主页
url = "http://m.qiushibaike.com/hot/page/" + page + '/'
user_agent = 'Mozilla/4.0(compatible;MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent}
req = urllib2.Request(url,headers = headers)
myResponse = urllib2.urlopen(req)
# 抓取页面
myPage = myResponse.read()
# 对爬下来的内容进行解码,转换成Unicode编码
unicodePage = myPage.decode('utf-8')
# soup = BeautifulSoup(myResponse.read())
# contents= soup.find_all('div class="content"','/div')
# 还在学BS4爬东西,暂时没用到
# 根据网页源代码的特点找出段子的内容
# 标记为<class="content"></div>
contents=re.findall('<div.*?class="content".*?>(.*?)</div>',unicodePage,re.S)
list = []
# 将段子保存进列表
for content in contents:
list.append(content.replace("\n",""))
return list

#如果页面中的段子已经扣完,想扣新的段子
def loadPage(self):
while self.loop:
if len(self.pages) < 2 :
# 当加载的段子条数小于两条的时候,读取第二页第三页内容
try:
# self.getPage返回的是list[],已经是这一页所有的段子
myPage = self.getPage(str(self.page))
# 这是第二页的第一条
self.page += 1
self.pages.append(myPage)
except:
print u"无法链接糗事百科"
else:
time.sleep(1)

def showPage(self,nowPage,page):
# nowPage中只有一个元素,list遍历出来只打印出于nowPage中相同的元素
for list in nowPage:
print u'第%d页\n' % page , list , '\n'
next = raw_input('>next\n')
if next == "exit":
self.loop = False
print u"已退出爬虫程序"
break

def start(self):
self.loop = True
page = self.page

print u"程序正在加载中,正在寻找段子,请稍后....\n"

# 多线程是个坑,可以做很多事情
thread.start_new_thread(self.loadPage,())

# 开始加载
while self.loop:
# 保证pages中只有不超过两个元素,删除刚才显示的那一条段子
if self.pages:
# nowPage内有所有的段子
nowPage=self.pages[0]
# 删除第一条,存入下一条
del self.pages[0]
self.showPage(nowPage,page)
page += 1

# 爬虫开始
print u"""
-----------------浏览糗事百科的段子--------------
按下任意键继续
退出请输入"exit"
时间:2016.5.1
语言:python 2.7
包:BS,RE,URLLIB2,TIME,THREAD
------------------------------------------------
"""

print u"按下回车浏览今日糗百热门内容:"
raw_input('>')
if __name__=='__main__' :
myModel = spider()
myModel.start()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  爬虫 python