個人第一次Python爬蟲——獲取本身博客園的全部文章

最近在學 python 爬蟲,因此拿本身的博客開刀,做爲一次簡單的 Python 爬蟲實踐。html

 

Python 爬蟲腳本的功能:

一、得到全部的文章標題和地址;python

二、得到右側公告欄裏的我的信息。web

1

 

運行的結果

2

先打印公告中的我的信息和文章的總數,接着列出全部的文章。截圖只是開頭的一部分。mvc

 

這個腳本有什麼用呢?

備份。之前我使用網上的軟件備份本身QQ空間的日誌,須要在軟件上登陸本身的帳號,風險很大。app

 

源碼[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()

 

 

一些說明

一、獲取公告中的信息(獲取異步加載的數據)

學了爬蟲對於網頁有更多的認識:發現博客地址 http://www.cnblogs.com/luoxu34 只是正文部分(文章列表),側邊的全部信息都是 js 異步加載出來的。異步

3

 

二、統計文章總數

第一個版本的 get_total_pages 方法:post

# 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 列表的長度,做爲文章的數量。url

爲了得到全部的文章,就要知道一共有多少頁。spa

4

http://www.cnblogs.com/luoxu34/default.html?page=2 是第二頁的文章列表,上下位置都出現了「共幾頁」的字樣。日誌

 

get_total_pages 方法就是截取了其中的一個字符,可是超過 9頁的文章就有問題。

image

 

三、get_total_pages_v2(name) 方法

下圖先把 <div class="paper"> 標籤下的文字打印出來,用 正則 匹配出了頁數。

5

 

http://www.cnblogs.com/Artech 一共有 564篇文章,截止如今:

6

這樣就正確統計出了文章的總數。

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)
相關文章
相關標籤/搜索