最近在学 python 爬虫,所以拿自己的博客开刀,作为一次简单的 Python 爬虫实践。
Python 爬虫脚本的功能:
1、获得所有的文章标题和地址;
2、获得右侧公告栏里的个人信息。
运行的结果
先打印公告中的个人信息和文章的总数,接着列出所有的文章。截图只是开头的一部分。
这个脚本有什么用呢?
备份。以前我使用网上的软件备份自己QQ空间的日志,需要在软件上登录自己的账号,风险很大。
源码[get_articles_from_cnblogs.py]:
1 #!/usr/bin/env python3.5
2 #-*- coding:utf-8 -*-
3
4 from bs4 importBeautifulSoup5 importrequests6 importre7
8 name = 'artech'
9 my_cnbolgs = 'http://www.cnblogs.com/' +name10
11 #文章列表,每个元素都是字典,格式:{'title':aaa, 'url':bbb}
12 article_list =[]13
14
15 defget_articles(name):16 page = get_total_pages_v2(name) #获得总页数
17 for i in range(1, page+1):18 url = 'http://www.cnblogs.com/{}/default.html?page={}'.format(name,i)19 get_one_page_articles(url)20
21
22 defget_one_page_articles(url):23 wb_data =requests.get(url)24 soup = BeautifulSoup(wb_data.text,'lxml')25 articles = soup.select('a.postTitle2')26
27 for article inarticles:28 data ={29 'title':article.get_text(),30 'url':article.get('href')31 }32 article_list.append(data)33 returnarticle_list34
35
36 #get_total_pages方法只是截取一个字符,文章页数不能超过9页
37 defget_total_pages(name):38 url = 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)39 web =requests.get(url)40 soup = BeautifulSoup(web.text,'lxml')41 page = soup.select('div.pager')42 num = page[1].get_text()[4:5] #总页数,是个字符
43 returnint(num)44
45
46 defget_total_pages_v2(name):47 url = 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)48 web =requests.get(url)49 soup = BeautifulSoup(web.text,'lxml')50 page = soup.select('div.pager')51 num = page[1].get_text()[4:5]52
53 ## print(page[1].get_text())
54 SEARCH_PAT = re.compile(r'\d+')55 pat_search = SEARCH_PAT.search(page[1].get_text())56 if pat_search !=None:57 ## print(pat_search.group())
58 num =pat_search.group()59 returnint(num)60
61
62 defget_info(name):63 url = 'http://www.cnblogs.com/mvc/blog/news.aspx?blogApp=' +name64 web =requests.get(url)65 soup = BeautifulSoup(web.text,'lxml')66 info = soup.select('div > a')67 ## nick = info[0].get_text()
68 ## age = info[1].get_text()
69 ## followers = info[2].get_text()
70 ## follwees = info[3].get_text()
71 data = [info[i].get_text() for i in range(0,4)]72 ## nick,age,followers,follwees = data
73 returndata74
75
76 if __name__ == '__main__':77 nick,age,followers,follwees = get_info(name) #获取个人信息
78 get_articles(name) #获取文章列表
79 print('昵称:' + nick, '园龄:' + age,'粉丝:' +followers,\80 '关注:' + follwees, '文章:' +str(len(article_list)))81 print()82 for i inarticle_list:83 print(i['title'], i['url'], sep='\n')84 print()
一些说明
1、获取公告中的信息(获取异步加载的数据)
学了爬虫对于网页有更多的认识:发现博客地址 http://www.cnblogs.com/luoxu34 只是正文部分(文章列表),侧边的所有信息都是 js 异步加载出来的。
2、统计文章总数
第一个版本的 get_total_pages 方法:
#get_total_pages方法只是截取一个字符,文章页数不能超过9页
defget_total_pages(name):
url= 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)
web=requests.get(url)
soup= BeautifulSoup(web.text,'lxml')
page= soup.select('div.pager')
num= page[1].get_text()[4:5] #总页数,是个字符
return int(num)
自己使用的博客模版上是没有显示博文总数的,所以脚本是用 len 方法计算 article_list 列表的长度,作为文章的数量。
为了获得所有的文章,就要知道一共有多少页。
get_total_pages 方法就是截取了其中的一个字符,但是超过 9页的文章就有问题。
3、get_total_pages_v2(name) 方法
下图先把
这样就正确统计出了文章的总数。
defget_total_pages_v2(name):
url= 'http://www.cnblogs.com/{}/default.html?page=2'.format(name)
web=requests.get(url)
soup= BeautifulSoup(web.text,'lxml')
page= soup.select('div.pager')
num= page[1].get_text()[4:5]## print(page[1].get_text())
SEARCH_PAT = re.compile(r'\d+')
pat_search= SEARCH_PAT.search(page[1].get_text())if pat_search !=None:## print(pat_search.group())
num =pat_search.group()return int(num)