1. 程式人生 > >python簡單爬蟲練習

python簡單爬蟲練習

開始學爬蟲了,記錄一下這兩天的瞎鼓搗

抓取一個網頁

先從最簡單的來,指定一個url,把整個網頁程式碼抓下來,這裡就拿csdn的主頁實驗

# -*- coding: UTF-8 -*-
from urllib import request

url = 'http://www.csdn.net/'
html = request.urlopen(url)
# 注意這裡要以utf-8編碼方式開啟
with open('123.txt', 'w', encoding='utf-8') as f:
    f.write(html.read().decode('utf-8'))
# 和讀檔案的操作類似的read()方法,開啟url後用read()方法整個頁面程式碼就抓下來了
# 抓下來後需要將編碼轉換為與所抓取頁面相同的utf-8編碼

爬到一個網頁後,可以找出網頁裡的連結,然後再繼續往下爬,大概就這個思路。先從簡單的來,給出我部落格的目錄連結,把第一頁我寫的博文全部爬下來。

利用部落格目錄爬取博文

先把部落格目錄網頁爬下來看看該怎麼找出博文的連結

# -*- coding: UTF-8 -*-
from urllib import request

url = 'http://blog.csdn.net/specter11235'
html = request.urlopen(url)
with open('123.txt', 'w', encoding='utf-8'
) as f: f.write(html.read().decode('utf-8'))

開啟爬出來的原始碼,可以看見每個文章的連結都是這種格式
這裡寫圖片描述

這裡寫圖片描述
於是就可以利用正則表示式來爬取a href=”“之間的連結了,但是由於在頁面中還有其他的連結,如果只是用正則寫成a href=”(.*)”,很容易抓到其他的連結去,我試了試發現連著前面span標籤裡的一大串一塊匹配,找到的連結都是文章的,於是程式碼就這麼寫

# -*- coding: UTF-8 -*-
from urllib import request
import re

# 部落格目錄的url
url = 'http://blog.csdn.net/specter11235'
html = request.urlopen(url) html = html.read().decode('utf-8') # 構造正則表示式,'.'表示匹配任意字元,'*'表示匹配前一個字元0或無限次 # '(.*)'總之這樣配合就是匹配兩邊字元,把中間的全部取出來 # 構造正則表示式 reurl = re.compile('<span class="link_title"><a href="(.*)">') # 將構造好的規則與抓取好的網頁原始碼html進行匹配並輸出結果 print(reurl.findall(html))

放上輸出結果
這裡寫圖片描述
可以看到,頁面上的文章連結都出來了,需要加上開頭的url處理一下,不過這都很簡單。
拿到了這些文章的url之後我們只要把這個url列表遍歷,把網址挨個抓取下來儲存到檔案中即可

# -*- coding: UTF-8 -*-
from urllib import request
import re
import os

url = 'http://blog.csdn.net/specter11235'
html = request.urlopen(url)
html = html.read().decode('utf-8')
reurl = re.compile('<span class="link_title"><a href="(.*)">')
# 判斷目錄是否存在與建立目錄
if not os.path.isdir('./htmltest'):
    os.mkdir('./htmltest')
# 遍歷url目錄
for i in reurl.findall(html):
    text_url = 'http://blog.csdn.net' + i
    print(text_url)
    html = request.urlopen(text_url)
    html = html.read().decode('utf-8')
    # 構造正則表示式獲取文章的標題
    rename = re.compile('%s">\s+(.+?)\s+</a>' % i)
    # findall()獲取到的是列表,需要把字串內容取出
    filename = rename.findall(html)[0]
    print(filename)
    # 將文章的標題作為檔名進行儲存
    with open('./htmltest/%s.html' % filename, 'w', encoding='utf-8') as f:
        f.write(html)

任意開啟一篇文章原始碼,發現標題格式跟上面目錄中是一樣的,根據剛剛,只需要用正則將文章連結與/a標籤之間的就是標題,中間的空白符可以用\s進行匹配,每篇文章的連結是變化的,不過我們已經儲存到i中了,用i進行匹配一下即可,於是就得到上面的程式碼。
執行後的結果
這裡寫圖片描述