如何爬取部落格中分欄的所有文章的标題和連結
今天在寫一個自己部落格的一個部落格文章導航的文章,想把各個分欄的文章做一個彙總導航,前面幾個分欄還好,文章不多,等到整理算法題目的文章的時候,瞬間就發現問題不對勁了,雖說寫的時間不長,但是也有100篇左右的算法題了,這要是手寫得寫多久啊。這時候就想到能不能爬取一下自己分欄的文章标題和連結呢?
為了嚴謹起見,部落客還是先去看了下CSDN的robots.txt檔案也就是爬蟲協定,畢竟部落客也不想牢底坐穿啊~~
CSDN的爬蟲協定如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMxADN1UGN4ATZilzMkdTNzYzX3IjNxAjM1IzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
import re
import requests
from bs4 import BeautifulSoup
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',
# 網站Host
'Host': 'blog.csdn.net'
}
# 網頁連結
link = 'https://blog.csdn.net/qq_43422111/category_8847039.html'
# 擷取網頁
r = requests.get(link, headers=headers, timeout=10)
# 使用soup進行過濾
soup = BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('li')
articles = []
for each in div_list:
article = {}
href = str(each.find('a').get('href')).strip()
title = each.find('h2',class_ = "title")
title = str(title)
# 這裡的title還需要進一步的處理,因為CSDN在這個h2标題下面還有兩個注釋:<!--####試讀--><!--####試讀-->這裡用正則把注釋去掉
re_comment = re.compile('<!--[^>]*-->')
title = re_comment.sub("",title)
# 去掉注釋之後我們在用正則來提取<h2></h2>之間的内容
# 這裡由于</h2>的标簽在下一行,中間有個\n,所裡這裡的結束标簽設定為了\n,大家可以根據實際情況進行修改
# 這樣最終的标題和連結就提取出來了
title_re = re.findall(r'<h2 class="title">(.*?)\n',title)
# 發現這時标題後面還跟着一堆空格,我們把空格去除一下
# 先把清單轉換為字元串,然後使用字元串的strip()函數即可去除頭尾的空格
mid = "".join(title_re)
title_f = mid.strip()
article['href'] = href
article['title'] = title_f
articles.append(article)
# 下面我們就來将處理好的這個articles清單按照Markdown本文超連結的格式儲存到我們的文本中
# 儲存檔案的位址
mylog = open('/Users/qiguan/article.txt',mode='a',encoding='utf-8')
for article in articles:
# 這裡我們在控制台也輸出一遍
print("[", article['title'], "]", "(", article['href'], ")",sep='', end='\n')
# 儲存到文本中
print("[",article['title'],"]","(",article['href'],")",sep='',end='\n',file = mylog)