额……有这种想法,感觉自己坏坏哒……其实,自己刚开始写CSDN博客,看到朋友们的博客访问量都达到几十万几百万了,而自己刚开始写,一星期过去了访问量才两位数,好拙计啊……说白了还是自己的虚荣心在作怪……尝试一下吧……
使用了python3的urllib模块,开始使用了简单的urllib.request.urlopen()函数,结果发现行不通,csdn设置了简单的检查选项,需要python模拟浏览器进行访问才行,简单的很,那就模仿一个好啦,使用urllib.request.build_opener()就可以进行模拟啦,添加一个访问头就可以啦
但是呢,访问太频繁有可能会造成服务器拒绝访问,那么就稍微等等好啦,使用time模块中的sleep()函数即可。还有一个小问题,当服务器拒绝的时候,python会当成错误,从而终止了程序,这样就不好玩了,一点都不自动化,解决这个问题也蛮简单,刚才看书才看到try…except…语法,这样把出现的错误都放到except语句里面不就OK了么,经过本人测试,一般会出现下面两个错误urllib.error.HTTPError和urllib.error.URLError,那这两个错误都弄到except里面就可以啦,哈哈
于是简单的刷一个页面的版本出现啦,代码如下:
- __author__ = 'MrChen'
- import urllib.request
- import time
- #使用build_opener()是为了让python程序模仿浏览器进行访问
- opener = urllib.request.build_opener()
- opener.addheaders = [('User-agent', 'Mozilla/5.0')]
- #专刷某个页面
- print('开始刷了哦:')
- tempUrl = 'http://blog.csdn.net/calling_wisdom/article/details/40900815'
- for j in range(200):
- try :
- opener.open(tempUrl)
- print('%d %s' % (j , tempUrl))
- except urllib.error.HTTPError:
- print('urllib.error.HTTPError')
- time.sleep(1)
- except urllib.error.URLError:
- print('urllib.error.URLError')
- time.sleep(1)
- time.sleep(0.1)
上面这个版本圆满完成了刷一个页面的任务,还蛮好用的,但是呢,如果我要把我所有的博客都刷个遍呢,一个一个地刷是不是太慢了呢,鄙人七八篇博客还勉强可以接受,但是如果以后七八十篇呢……想想就头疼,还是继续想办法吧
鉴于目前本人的所有博客都在博客主页目录的第一页中,所以直接查看博客目录,然后把每篇博客的网址都提取出来不久OK了么,嗯,说干就干
简单列一下思路:
1, 先抓取博客目录页的网址内容,然后使用re模块进行查找,找到每篇博客的地址(实际情况是这样的,里面的网址都是半截半截的,类似这样的/calling_wisdom/article/details/........,一会把前面的部分加上就可以了)
2, 把里面重复的网页过滤掉,这个也简单,使用set()就可以了
3, 把抓取到的网址合并成可以直接进行访问的网址
4, 使用一下刚学的BeautifulSoup解析网页的标题,这样就可以知道刷的是哪篇博客了(在这里继续夸一夸BeautifulSoup,超级好用,一下就把我想要的内容提取出来了)
5, 准备完毕,刷起来!每个页面给大爷刷200遍先!让爷装B让爷飞!
代码如下:(注释写的很到位了吧,不用再解释什么吧,最讨厌写代码没注释的)
- __author__ = 'MrChen'
- import urllib.request
- import re
- import time
- from bs4 import BeautifulSoup
- p = re.compile('/calling_wisdom/article/details/........')
- #自己的博客主页
- url = "http://blog.csdn.net/calling_wisdom"
- #使用build_opener()是为了让python程序模仿浏览器进行访问
- opener = urllib.request.build_opener()
- opener.addheaders = [('User-agent', 'Mozilla/5.0')]
- html = opener.open(url).read().decode('utf-8')
- allfinds = p.findall(html)
- #print(allfinds)
- urlBase = "http://blog.csdn.net"#需要将网址合并的部分
- #页面中的网址有重复的,需要使用set进行去重复
- mypages = list(set(allfinds))
- for i in range(len(mypages)):
- mypages[i] = urlBase+mypages[i]
- print('要刷的网页有:')
- for index , page in enumerate(mypages) :
- print(str(index), page)
- #设置每个网页要刷的次数
- brushNum = 200
- #所有的页面都刷
- print('下面开始刷了哦:')
- for index , page in enumerate(mypages) :
- for j in range(brushNum):
- try :
- pageContent = opener.open(page).read().decode('utf-8')
- #使用BeautifulSoup解析每篇博客的标题
- soup = BeautifulSoup(pageContent)
- blogTitle = str(soup.title.string)
- blogTitle = blogTitle[0:blogTitle.find('-')]
- print(str(j) , blogTitle)
- except urllib.error.HTTPError:
- print('urllib.error.HTTPError')
- time.sleep(3)#出现错误,停几秒先
- except urllib.error.URLError:
- print('urllib.error.URLError')
- time.sleep(3)#出现错误,停几秒先
- time.sleep(0.5)#正常停顿,以免服务器拒绝访问