设为首页 收藏本站
查看: 770|回复: 0

[经验分享] 十一Python网页抓取实战(网页抓取三)

[复制链接]

尚未签到

发表于 2017-5-6 14:18:47 | 显示全部楼层 |阅读模式
  声明:本文只用于技术交流和学习使用,如果侵害到您的合法权利,请发邮件到daokun66@163.com告知删除。
  抓取的内容为osc的最新推荐博客列表,分析出博客的链接、标题、内容简介、作者和发布时间。
DSC0000.jpg
 

 上图为ocs最新推荐的文章列表的html结构,由图可知所有的文章列表都在ul标签里面且ul的class="BlogList",每一篇文章的基本信息都在ul下的li标签里,每一个li下的h3下的a的href即为博客内容链接,a的内容即为博客标题,li下的p标签的内容即为博客简介,li下的div标签且class="date"的内容即为作者和发布时间。


#-------------------------------------------------------------------------------
# coding:        utf-8
# Version:      python3.2
# Purpose:抓取测试 pageCrawl,抓取osc的最新推荐博客列表
#分析出博客链接、标题、内容简介、作者和发布时间
#
#声明:本例只供技术交流和练习使用,如侵害了您的权利,请发邮件给daokun66@163.com通知删除
# Author:      zdk
# Created:     07/03/2013
#-------------------------------------------------------------------------------
import httplib2
from html.parser import HTMLParser

def getPageContent(url):
'''
使用httplib2用编程的方式根据url获取网页内容
将bytes形式的内容转换成utf-8的字符串
'''
#使用ie9的user-agent,如果不设置user-agent将会得到403禁止访问
headers={'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'}
if url:
response,content = httplib2.Http().request(url,headers=headers)
if response.status == 200 :
return str(content,'utf-8')

class MyHtmlParser(HTMLParser):
'''
根据html内容解析出相应的标签,获取标签的属性或相应的数据并输出
'''
def __init__(self):
HTMLParser.__init__(self)
self.href = []      #存放博客链接
self.title = []     #存放博客标题
self.summary = []   #存放博客内容简介
self.author = []    #存放作者和发布时间
self.ul = None          #是否进入到了ul标签
self.ul_li = None       #是否进入到了ul里的li标签
self.ul_li_h3 = None    #是否进入到了ul里的li里的h3标签
self.ul_li_h3_a = None  #是否进入到了ul里的li里的h3里的a标签
self.ul_li_p = None     #是否进入到了ul里的li里的p标签
self.ul_li_div = None   #是否进入到了ul里的li里的div标签
def handle_starttag(self, tag, attrs):
if tag == 'ul' :
for name,value in attrs:
if name == 'class' and value =='BlogList':
self.ul = 1   #进入到了ul标签
break
elif self.ul and tag == 'li':
self.ul_li = 1        #进入到了ul里的li标签
elif self.ul and self.ul_li and tag == 'h3':
self.ul_li_h3 = 1     #进入到了ul里的li里的h3标签
elif self.ul and self.ul_li and self.ul_li_h3 and  tag== 'a':
self.ul_li_h3_a = 1   #进入到了ul里的li里的h3里的a标签
for name,value in attrs:
if name == 'href':
self.href.append(value)    #取博客链接
print("博客链接:"+value)   #输出博客链接
elif self.ul and self.ul_li and tag == 'p':
self.ul_li_p = 1    #进入到了ul里的li里的p标签
elif self.ul and self.ul_li and tag == 'div':
for name,value in attrs:
if name == 'class' and value =='date':
self.ul_li_div = 1 #进入到了ul里的li里的class='date'的div标签
break
def handle_data(self, text):
if self.ul and self.ul_li and self.ul_li_h3 and self.ul_li_h3_a :
self.title.append(text) #链接里面的数据即为标题
print("博客标题:"+text)
elif self.ul and self.ul_li and self.ul_li_p :
self.summary.append(text) #ul里的li里的p标签的内容为博客内容简介
print("博客简介:"+text)
elif self.ul and self.ul_li and self.ul_li_div :
self.author.append(text)   #ul里的li里的div标签的内容为作者和更新时间
print("博客作者和更新时间:"+text)
def handle_endtag(self, tag):
if tag == 'a' and self.ul and self.ul_li and self.ul_li_h3 and self.ul_li_h3_a :
#退出了ul里的li里的h3里的a标签
#重置h3和a的标识数据
self.ul_li_h3 = None
self.ul_li_h3_a = None
elif tag == 'p' and self.ul and self.ul_li and self.ul_li_p:
#退出了ul里的li里的p标签
self.ul_li_p = None
elif tag == 'div' and self.ul and self.ul_li and self.ul_li_div:
#退出了ul里的li里的div标签
self.ul_li_div = None
elif tag == 'li' and self.ul and self.ul_li :
#退出了ul里的li标签
self.ul_li = None
elif tag == 'ul' and self.ul :
#退出了ul标签
self.ul = None

if __name__ == '__main__':
pageC = getPageContent('http://www.oschina.net/blog/more?p=1')
my = MyHtmlParser()
my.feed(pageC)
运行结果

博客链接:http://my.oschina.net/lzp/blog/112341
博客标题:将私有Android工程迁移至GitHub
博客简介:      以前不太在意GitHub是因为印象中他一直是托管开源代码的,适合大家分享开源代码。最近感谢党和政府对它的XX,也使我...
博客作者和更新时间:lzpliu 发布于 4小时前
博客链接:http://my.oschina.net/ryanhoo/blog/112322
……
博客链接:http://my.oschina.net/NGINX08/blog/111380
博客标题:OceanBase分布式系统负载均衡案例学习
博客简介:        一个集群如果出现了负载不均衡问题,那么负载最大的机器往往将成为影响系统整体表现的瓶颈和短板。为了避免这...
博客作者和更新时间:NGINX08 发布于 4天前
  程序非常简陋,只能抓取第一页的列表,没有代理(ip容易被墙),没有多线程(不能同时抓取多页),只是小弟学习python的一个练习,还望大牛多多指教。  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373916-1-1.html 上篇帖子: 九Python之HTML的解析(网页抓取一) 下篇帖子: 用python爬虫抓站的一些技巧总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表