#coding:utf-8 import urllib2
import re
# 工具类 class Tools(object):
remove_n = re.compile(r'\n')
replace_br = re.compile(r'<br>|<br>')
remove_ele = re.compile(r'<.*?>', re.S)
#rs 参数,要进行替换的数据 def replace_rs(self,rs):
name = re.sub(self.remove_n, '', rs[0])
content = re.sub(self.remove_n, '', rs[2])
content = re.sub(self.replace_br, r'\n', content)
content = re.sub(self.remove_ele, '', content)
dz_tuple = (name, rs[1], content, rs[3], rs[4])
# 返回处理后的元组 return dz_tuple
#糗事百科爬虫类 class QSBK(object):
''' 1.根据url地址获取网页源代码 2.从网页源代码中提取想要的数据 3.存储或展示数据 ''' #把爬虫需要的基础设置进行初始化 def __init__(self):
#爬虫基础url地址,不包含参数部分 self.baseURL = 'https://www.qiushibaike.com/hot/page' #请求头 self.headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50' }
# 创建一个Tools对象,把对象赋值self的tool属性 # 在整个爬虫的过程中,只创建一个Tools工具类的对象 self.tool = Tools()
#根据页码获取HTML源代码 def get_page(self,num):
#1、根据num拼接完整的URL地址 #str()转化为字符串,int()转换为整数 url = self.baseURL+str(num)
#2.创建request对象 request=urllib2.Request(url,headers=self.headers)
# 3. 发起请求,接收响应 try:
response = urllib2.urlopen(request)
except (urllib2.URLError,Exception),e:
print '连接糗事百科失败,原因:%s'%e
#获取失败,返回None return None else:
# 返回页码对应的HTMl源代码 return response.read()
#从一段html源代码中获取数据 def get_data(self,html):
# 1.准备正则表达式 pattern = re.compile(
r'<div class="author clearfix">.*?<h2>(.*?)</h2>.*?Icon">(.*?)</div>.*?class="content">(.*?)</span>.*?<i class="number">(.*?)</i>.*?<i class="number">(.*?)</i>',
re.S)
# 2.根据正则表达式筛选数据 results = re.findall(pattern, html)
# 准备列表,存放处理后的数据 rs_data =[]
# 3.处理筛选出的数据 for rs in results:
dz_tuple = self.tool.replace_rs(rs)
# 把元组放在列表中 rs_data.append(dz_tuple)
# 4.返回处理后的数据 return rs_data
#对象函数,开始爬虫 def start(self):
#1.根据某一页页码,获取该页的HTML源代码 html = self.get_page(1)
# 2.如果获取到的html源代码不为None,则从源代码中提取数据 if html == None:
return rs_data = self.get_data(html)
for rs in rs_data:
s = raw_input('敲击回车查看下一条段子,输入Q结束:')
if s == 'Q':
print '程序结束!' break print '用户名:%s 年龄:%s 好笑数:%s 评论数:%s'%(rs[0],rs[1],rs[3],rs[4])
print rs[2]
print '\n' if __name__ == '__main__':
#创建QSBK对象 qsbk = QSBK()
qsbk.start()
转载于:https://my.oschina.net/u/3682435/blog/1535393