最近在學 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 import BeautifulSoup 5 import requests 6 import re 7 8 name = 'artech' 9 my_cnbolgs = 'http://www.cnblogs.com/' + name 10 11 #文章列表,每個元素都是字典,格式:{'title':aaa, 'url':bbb} 12 article_list = [] 13 14 15 def get_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 def get_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 in articles: 28 data = { 29 'title':article.get_text(), 30 'url':article.get('href') 31 } 32 article_list.append(data) 33 return article_list 34 35 36 # get_total_pages方法只是截取一個字符,文章頁數不能超過9頁 37 def get_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 return int(num) 44 45 46 def get_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 return int(num) 60 61 62 def get_info(name): 63 url = 'http://www.cnblogs.com/mvc/blog/news.aspx?blogApp=' + name 64 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 return data 74 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 in article_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頁 def get_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 列表的長度,作為文章的數量。
為了獲得所有的文章,就要知道一共有多少頁。
http://www.cnblogs.com/luoxu34/default.html?page=2 是第二頁的文章列表,上下位置都出現了“共幾頁”的字樣。
get_total_pages 方法就是截取了其中的一個字符,但是超過 9頁的文章就有問題。
3、get_total_pages_v2(name) 方法
下圖先把 <div class="paper"> 標簽下的文字打印出來,用 正則 匹配出了頁數。
http://www.cnblogs.com/Artech 一共有 564篇文章,截止現在:
這樣就正確統計出了文章的總數。
def get_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)