天天看點

如何爬取部落格中分欄的所有文章的标題和連結

如何爬取部落格中分欄的所有文章的标題和連結

今天在寫一個自己部落格的一個部落格文章導航的文章,想把各個分欄的文章做一個彙總導航,前面幾個分欄還好,文章不多,等到整理算法題目的文章的時候,瞬間就發現問題不對勁了,雖說寫的時間不長,但是也有100篇左右的算法題了,這要是手寫得寫多久啊。這時候就想到能不能爬取一下自己分欄的文章标題和連結呢?

為了嚴謹起見,部落客還是先去看了下CSDN的robots.txt檔案也就是爬蟲協定,畢竟部落客也不想牢底坐穿啊~~

CSDN的爬蟲協定如下:

如何爬取部落格中分欄的所有文章的标題和連結
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)