爬取糗事百科上的段子,实现按一次回车,读取一条段子(过滤带有图片的段子),显示段子的发布人,点赞数和内容。
如图:
#!usr/bin/python2.7
# --*--coding:utf-8--*--
__author__ = '风凉zz'
import urllib
import urllib2
import re
class QSBK:
def __init__(self):
self.pageIndex = 1
self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
self.referer = 'https://www.qiushibaike.com/hot/'
self.headers = {'User-Agent': self.user_agent, 'Referer': self.referer} # 初始化headers
self.stories = [] # 存放段子的列表,每一个元素表示一页的段子
self.enable = False # 存放程序是否继续运行的变量
def getPageCode(self,pageIndex): # 获取第pageIndex页的html代码
url = 'https://www.qiushibaike.com/hot/page/' + str(pageIndex)
try:
request = urllib2.Request(url, headers=self.headers)
response = urllib2.urlopen(request)
pagecode = response.read().decode('utf-8')
return pagecode
except urllib2.URLError, e:
print u'连接糗事百科失败!'
if hasattr(e, 'code'):
print u'错误代码:', e.code
if hasattr(e, 'reason'):
print u'错误原因:', e.reason
def getPageStories(self,pageIndex): # 获取pageIndex页中所有不带图片的段子列表
pagecode = self.getPageCode(pageIndex)
if not pagecode:
print '页面加载失败!'
return None
pattern = re.compile('<div .*?author clearfix">.*?<h2>(.*?)</h2>'
'.*?<div.*?content">.*?<span>(.*?)</span>'
'(.*?)stats-vote">'
'.*?number">(.*?)</i>', re.S)
items = re.findall(pattern, pagecode) # items结构:[(...,...,...,...)第一个段子......(...,...,...,...)第n个段子]
pagestories = []
for item in items:
haveimg = re.search('img', item[2])
if not haveimg:
content = re.sub('<br/>', '\n', item[1]) # 将</br>替换成换行
pagestories.append([item[0].strip(), content.strip(), item[3].strip()])
# Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
# item[0]发布者,item[1]内容,item[3]点赞数
return pagestories # 返回pageIndex页中所有不带图片的段子列表
def loadPage(self):
if self.enable == True:
if len(self.stories) < 2: # stories列表中未看段子页数少于2时
pagestories = self.getPageStories(self.pageIndex) # 获取pagaIndex页的所有不含图段子
if pagestories:
self.stories.append(pagestories) # 将pageIndex页的段子放入stories列表中
self.pageIndex += 1 # 页面数+1
def getOneStory(self, pageIndex): # 从pageIndex页中一个一个读取段子
for story in self.getPageStories(pageIndex): # 遍历pageIndex页中所有段子
input = raw_input() # 读取输入
self.loadPage()
if input == 'q':
self.enable = False
return None
print u'第%d页\t' % (pageIndex),
print u'发布人:%s\t' % (story[0]),
print u'赞:%s\n' % (story[2]),
print '%s' % (story[1])
def start(self):
print '正在读取糗事百科...'
print '回车查看新段子/q退出'
self.enable = True # enable为True,使程序正常运行
self.loadPage()
nowpage = 1 # 当前页数
while self.enable:
if len(self.stories) > 0: # 如果stories列表中还有段子
pagestories = self.stories[0] # 从storiies列表中取出第一页的段子
del self.stories[0] # 将第一页删除
self.getOneStory(nowpage) # 从当前页中一个一个读取段子
nowpage += 1 # 当前页+1
spider = QSBK()
spider.start()
注:写正则表达式要注意html结束和开始的两个标签之间用. * ?,因为这里会解析为空格,不用. * ?程序会一直跑。
参考崔庆才老师博客