Python之初体验

         最近python是越来越火了,自己也是想体验一把,所以就抽时间把python基础语法什么的都了解了下,也把具体的代码试了试。看完了想着总要应用下吧,否则总感觉没劲儿,就跟没学似得,毕竟实践是最好的老师嘛。那么实现个什么功能呢?然后就看到了博客,要不就把所有博客的标题以及阅读次数统计下吧,也算是网络爬虫吧,哈哈哈。

        确定了,就想想大致要怎么做吧。我们的基本步骤也是首先先看下需要获取信息的网页源代码,我们就是博客列表页面呀,即为 http://blog.csdn.net/submit66/article/list,其实现在我觉得所谓的爬取就是把网页内容请求到,然后根据网页标签取到我们想要的标签,以及数据。这就是大致的思路。

       好,接下就是请求的步骤了,第一步打开上面那个链接,然后只需要右键然后显示网页源代码就好了。我们的目的就是想要渠道每一篇博客的名称以及访问量,通过观察可以看到所有的标题以及阅读次数都是写在如下的标签里面的:


里面的注释写的比较清楚了,我们的目的就是获取上面的title“自定义Linearlayout实现dividerPaddingLeft和dividerPaddingRight”和阅读次数“54”了呀。接下来看下代码:

# -*- coding: utf-8 -*- 指定编码格式防止 代码中有中文编译失败

'''
使用python爬取csdn个人博客的访问量
'''

import urllib2 # 网络请求模块
import re # 正则表达式模块
from bs4 import BeautifulSoup; # 导入解析html的标签模块

page_num = 1; # 页码,因为有的博客比较多,那么一页不能展示全了
notLast = 1;
account = 'submit66' # 博客id

# 开始循环爬取
while notLast:

    #博客首页地址,csdn+博客id
    baseUrl = 'http://blog.csdn.net/'+account
    #构造爬取的页面地址,因为可能有多页
    myUrl = baseUrl+'/article/list/'+str(page_num)

    #构造请求
    req = urllib2.Request(myUrl);
    myResponse = urllib2.urlopen(req)
    # 获取请求回来的数据
    myPage = myResponse.read();
    #在页面中查找是否存在‘尾页’这一个标签来判断是否为最后一页,如果没有则代表是最后一页了,用的正则匹配
    pattern = re.compile('尾页</a>');
    notLast = pattern.findall(myPage, re.S);
    # 打印爬取的页码数
    print '-----------------------------第%d页---------------------------------' % (page_num);
    soup = BeautifulSoup(myPage, 'lxml');
    # 使用beautifulsoup来解析html的span标签,找到所有的标题以list形式返回
    titleList = soup.find_all('span', class_='link_title');
    # 利用正则表达式获取博客的访问量,最终会将所有的页码以list形式返回
    viewlist = re.findall('<span class="link_view".*?><a href=".*?" title="阅读次数">阅读</a>\((.*?)\)</span>', myPage,re.S)

    #将结果打印出来,因为标题返回时候是ASCII码,所以需需要将标题部分获取到的中文以utf-8再次编码,否则无法输出打印
    #另外我们获取到的标题会有一些没用的空格,打印出来不美观,所以后面加上了去除左右空格的方法
    for n in range(len(titleList)):
        print '访问量: %s   标题: %s' % (viewlist[n], titleList[n].get_text().encode('utf-8').strip())

    #本页抓取完毕后页号加1
    page_num = page_num + 1;
        上面的代码做什么基本注释都写得比较清晰,最上面的import肯定就是导入需要的第三方模块,其中的BeautifulSoup需要单独安装,否则会找不到的。首先肯定是需要通过网络请求将页面的html代码下载下来,然后开始解析的,因为有的同学的博客比较多,所以会存在分页的问题,我们循环爬取,但是还需要知道什么时候爬取结束呀,就取了一个标志,因为我们经常看博客会发现

底部这样子的提示,当你到最后一页时候,其实就没有“尾页”这个tab了,所以这里姑且通过正则表达式匹配它来判断是否还需要再次进行循环。其实也可以通过爬取回来的页面是否还有博客来判断,因为如果一个空页面博客列表肯定为空呀,或者获取到的博客标题为空等等方式。然后就是用的python自带的网络请求模块,普通的get请求,然后拿到网页内容,接下来就是获取博客标题了,beautifulsoup的find_all方法第一次参数就是要查找的标签名称,第二个参数是指定了class必须为link_title,然后它会返回一个list,后面则是又通过正则表达式匹配出来了页码数,最后是将标题以及访问量格式化输出了,大体的流程就是酱紫。其实上面的博客标题我都想通过正则表达式匹配出来,无奈,自己正则表达式用的不6,所以借助了beautifulsoup这个在Python中解析html代码标签的第三方模块库,其实它还是挺方便以及强大的。其实获取博客访问量部分我们依然可以通过soup来解析了,只不过下面那的代码就要变成酱紫了:

    # 使用beautifulsoup来解析html
    viewList = soup.find_all('span', class_='link_view');
    #将结果输出
    for n in range(len(titleList)):
       print '访问量: %s次   标题: %s' % (viewList[n].contents[1].encode('utf-8').strip(), titleList[n].get_text().encode('utf-8').strip());
    #页号加1
    page_num = page_num + 1;
可以看到输出viewlist时候用了contents这个属性,是因为contents能够取到viewlist中的每一个span的子标签子内容,通过取数观察发现,访问数量处于第二位所以是contents[1]了。而获取标题部分的get_text方法则是获取标签所包的具体文案内容的。上面的代码是可以直接运行的,在终端或者IDE里面执行过后可以看到如下的结果:



         以上就是本次博客的全部内容,如果有错误纰漏欢迎批评指正。其实,觉得python这个东西真的挺神奇的,简单几行代码就可以搞很多事情,以后还要多研究呀大笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值