怎么利用python爬取csdn博客访问量例子

Python015

怎么利用python爬取csdn博客访问量例子,第1张

一、网址分析

进入自己的博客页面,网址为:http://blog.csdn.net/xingjiarong 网址还是非常清晰的就是csdn的网址+个人csdn登录账号,我们来看一下下一页的网址。

看到第二页的地址为:http://blog.csdn.net/xingjiarong/article/list/2

后边的数字表示现在正处于第几页,再用其他的页面验证一下,确实是这样的,那么第一页为什么不是http://blog.csdn.net

/xingjiarong/article/list/1呢,那么我们在浏览器中输入http://blog.csdn.net/xingjiarong

/article/list/1试试,哎,果然是第一页啊,其实第一页是被重定向了,http://blog.csdn.net/xingjiarong

被重定向到http://blog.csdn.net/xingjiarong/article/list/1,所以两个网址都能访问第一页,那么现在规

律就非常明显了:

http://blog.csdn.net/xingjiarong/article/list/ + 页号

二、如何获取标题

右键查看网页的源代码,我们看到可以找到这样一段代码:

我们可以看到标题都是在标签

<span class="link_title"><a href="/xingjiarong/article/details/50651235">

所以我们可以使用下面的正则表达式来匹配标题:

<span class="link_title"><a href=".*?">(.*?)</a></span>

三、如何获取访问量

拿到了标题之后,就要获得对应的访问量了,经过对源码的分析,我看到访问量的结构都是这样的:

<span class="link_view" title="阅读次数"><a href="/xingjiarong/article/details/50651235" title="阅读次数">阅读</a>(1140)</span>

括号中的数字即为访问量,我们可以用下面的正则表达式来匹配:

<span class="link_view".*?><a href=".*?" title="阅读次数">阅读</a>\((.*?)\)</span>

四、如何判断是否为尾页

接下来我们要判断当前页是否为最后一页,否则我们就不能判断什么时候结束了,我找到了源码中‘尾页'的标签,发现是下面的结构:

<a href="/xingjiarong/article/list/2">下一页</a><a href="/xingjiarong/article/list/7">尾页</a>

所以我们可以用下面的正则表达式来匹配,如果匹配成功就说明当前页不是最后一页,否则当前页就是最后一页。

<a href=".*?">尾页</a>

五、编程实现

下面是完整的代码实现:

#!usr/bin/python

# -*- coding: utf-8 -*-

'''

Created on 2016年2月13日

@author: xingjiarong

使用python爬取csdn个人博客的访问量,主要用来练手

'''

import urllib2

import re

#当前的博客列表页号

page_num = 1

#不是最后列表的一页

notLast = 1

account = str(raw_input('输入csdn的登录账号:'))

while notLast:

#首页地址

baseUrl = 'http://blog.csdn.net/'+account

#连接页号,组成爬取的页面网址

myUrl = baseUrl+'/article/list/'+str(page_num)

#伪装成浏览器访问,直接访问的话csdn会拒绝

user_agent = 'Mozilla/4.0 (compatibleMSIE 5.5Windows NT)'

headers = {'User-Agent':user_agent}

#构造请求

req = urllib2.Request(myUrl,headers=headers)

#访问页面

myResponse = urllib2.urlopen(req)

myPage = myResponse.read()

#在页面中查找是否存在‘尾页'这一个标签来判断是否为最后一页

notLast = re.findall('<a href=".*?">尾页</a>',myPage,re.S)

print '-----------------------------第%d页---------------------------------' % (page_num,)

#利用正则表达式来获取博客的标题

title = re.findall('<span class="link_title"><a href=".*?">(.*?)</a></span>',myPage,re.S)

titleList=[]

for items in title:

titleList.append(str(items).lstrip().rstrip())

#利用正则表达式获取博客的访问量

view = re.findall('<span class="link_view".*?><a href=".*?" title="阅读次数">阅读</a>\((.*?)\)</span>',myPage,re.S)

viewList=[]

for items in view:

viewList.append(str(items).lstrip().rstrip())

#将结果输出

for n in range(len(titleList)):

print '访问量:%s 标题:%s' % (viewList[n].zfill(4),titleList[n])

#页号加1

page_num = page_num + 1

入门的话,我的经历:

1.先用python写一个爬取网页源代码的爬虫(最先是爬取个人博客,会遇到乱码问题当时困扰了很久)

2.后来写了爬取百度图片的程序,自动下载小说(我爱看小说-_-)(接触正则表达式)

3.然后百度图片他那种分页模式,一般一页只有20张左右的图片,分析源代码,完善爬取程序,不受到限制,一次可以下几千张(图片有的是原图,有的是缩略图)

4.后来发现程序卡顿,就添加了多线程。

5.然后模拟登陆一些不用验证码的网页(我学校的oj),cookie登陆B站(本来想写一个抢楼的脚本的,后来发现抢楼的被封号了-_-,就放弃了)

对于使用的库,python2 与 python3 有点不同,我学的是python3

先用的是urllib.request,后来用requests(第三方库),在后来接触Scrapy(也是第三方库)

现在因为事情多了,就把python放下了,准备寒假写一些脚本,毕竟python不会有期末考试...

我的个人经历,希望可以帮到你。