python 爬帖子内容

来源:互联网 发布:透明罗盘软件下载 编辑:程序博客网 时间:2024/05/23 16:01

 最近学习python 微信后台开发,试着做一个爬虫,每天后台推送一条消息,发现一个论坛,比较具有代表性

 

  下面分析一下我的代码,是如何爬取帖子内容的 url:view-source:http://www.jz100.com/thread-410368-2-1.html、

 

<table cellspacing="0" cellpadding="0"><tr><td class="t_f" id="postmessage_4160906">怀孕每日一读--怀孕第26天第4周<br /><br />&nbsp;&nbsp;宝宝发育 <br />  到第一月末时,胚胎是一个椭圆形的小物体,腹部隆起,其中便是心脏原基。它虽不具有心脏的形状,但它已有活力,在不像人形的身体中轻轻的地跳动。<br /><br />  每日胎教 <br />  中医认为受妊娠之后,宜镇静,以使气血安和,须内远七情,外薄五味,大冷大热之物,皆在所禁,宜谨节饮食,勿过饮酒,食毋太饱,衣毋太温,使雾露风邪,不得投间而入,亦不得交合阴阳,触动欲火,勿多睡卧,时时行步,勿登高涉险,勿劳力过伤,否则小儿生后羸瘦多病。又云:“母有所触,胎必感之。”胎儿在孕期,母之寒热、温凉、饮食滋味,以及外感六淫,内伤七情,皆足以使胎儿遭受影响而发生胎病。<br /><br />  准妈妈保健 <br />  孕早期突然出现小腹剧痛,并伴有恶心、呕吐、甚至发生晕厥,或有少量阴道流血。遇到这种情况,应考虑到子宫外孕。特别是输卵管妊娠,管腔破裂,出血会很急,严重者在短时间内大量失血休克,甚至死亡。因而遇到这种情况,一刻都不能停留,立即送医院检查。<br />从事有放射性工作的医护人员,特别是女性,如果在妊娠前长期受到小剂量的放射线照射,可使卵细胞发生染色体畸变或基因突变,若此时妊娠,极易发生胎儿畸形。妊娠后接受大量的放射线,可使胎儿染色体断裂、畸变、也会造成胎儿畸形。因此在从事放射线工作的已婚待孕人员,在妊娠前半年应停止接触放射线工作,妊娠后最好暂时离开此项工作,以免发生自然流产、新生儿死亡、先天畸形及遗传性疾病。<br /><br />  饮食营养 <br />  维生素D(钙化醇)是儿童、孕妇、乳母、老人不可缺少的一种重要维生素。成人缺乏维生素D会患骨软化病,儿童缺乏时,就会发生软骨病。但维生素D在自然界中存在不广泛,而维生素D原(维生素D3)则在许多食物中存在,最丰富的是在鱼的肝脏中。<br /><br />  你知道吗 <br />  第一胎生了患有有遗传病的孩子,最好不要再生第二个孩子。如果坚持再生一个,最好要做产前诊断和产前检查。<br /></td></tr></table>

右键点击查看源代码,发现内容全部 <td> ...</td>标签中,所以通过SGMLParser 解析html 内容(python 内部还有HTMLParser 类可以用),下面就是我实现的解析html的类

使用方法很简单,通过start_xx 和end_xx 可以完成对html网页中的标签进行解析


class GetIdList(SGMLParser):                            //继承SGMLParser类 
def __init__(self):
SGMLParser.__init__(self)
self.td = False
self.getdata  = []
self.flag = False
self.num = 0                        

def reset(self):
self.td = False
self.getdata  = []
self.flag = False
self.num = 0
SGMLParser.reset(self)

def start_td(self,attrs):                                             
if self.td == True:                  //避免嵌套出现,如:<td>...<td>....</td></td> 
self.num += 1             
return
for k,v in attrs:                      //解析td属性,避免一些抓取一些其他的没必要的td内容
if k == "class" and v == "t_f":
self.td = True

def end_td(self):
if self.num == 0:
self.td = False
if self.td == True:
self.num -= 1


def handle_data(self,text):                  //存储解析的内容
if self.td == True:
self.getdata.append(text) 



上面方法实现解析html网页的内容,那么下面就是实现如何获取网站内容的方法

def gethtmlpage(url,days):                    //url 为网站地址  days 为怀孕的天数,用于截取响应的内容
token = u"怀孕每日一读"
content = urllib2.urlopen(url).read()      //获取网站内容的方法      
list = GetIdList()                                  //调用上面的类,去解析内容
list.feed(content)
str = ""
flags = 0
days = bytes(days)                            
for item in list.getdata:                          //下面就是根据天数,匹配哪一个帖子是需要的,
ss = item.decode('GB2312')
if token in ss and days in ss and flags == 0:
flags = 1
elif token in ss and flags == 1:
break
if flags == 1:
str += item
return str


def getcontent():
d1 = datetime.datetime(xxx,xx,xx)                    //根据怀孕日期,计算怀孕天数
d2 = datetime.datetime.now()
dd = d2 - d1
msg = ''
for i in range(1,15):                        //由于帖子是分页的,所以需要逐页爬取, 直到有自己需要的帖子为止
num = bytes(i)
url = 'http://www.jz100.com/thread-410368-'+num+'-1.html'
print "url:",url,"dd.days:",dd.days
msg = gethtmlpage(url,dd.days)
if msg.strip():
break
return msg



上面就是一个简单的爬虫程序,由于python 是自学,还有些不成熟和需要优化的地方,后续会慢慢完善,然后就可以部署到我的个人公众号,每天推送





原创粉丝点击