1. 程式人生 > >Python爬蟲入門實戰系列(一)--爬取網路小說並存放至txt檔案

Python爬蟲入門實戰系列(一)--爬取網路小說並存放至txt檔案

執行平臺: Windows 

Python版本: Python3.x 


一、庫檔案                                       

re 
sys
BeautifulSoup
urllib.request
time

二、實戰                                           

(1)背景介紹

從樂文小說網站上爬取小說相見歡,並存放至txt檔案中

URL: 相見歡


(2)Beautifu  Soup庫的簡介

  簡單來說,Beautiful Soup是python的一個庫,最主要的功能是從網頁抓取資料。官方解釋如下:

  • Beautiful Soup提供一些簡單的、python式的函式用來處理導航、搜尋、修改分析樹等功能。它是一個工具箱,通過解析文件為使用者提供需要抓取的資料,因為簡單,所以不需要多少程式碼就可以寫出一個完整的應用程式。

  • Beautiful Soup自動將輸入文件轉換為Unicode編碼,輸出文件轉換為utf-8編碼。你不需要考慮編碼方式,除非文件沒有指定一個編碼方式,這時,Beautiful Soup就不能自動識別編碼方式了。然後,你僅僅需要說明一下原始編碼方式就可以了。

  • Beautiful Soup已成為和lxml、html6lib一樣出色的python直譯器,為使用者靈活地提供不同的解析策略或強勁的速度。

詳細請戳這裡: Beautiful Soup 4.2.0文件



(3)實戰進行中……

【重要】:python想要使用漢字,需要在指令碼最前面新增 #coding:utf-8,漢字使用的編碼為utf-8,否則會出現錯誤

首先,我們引入我們需要的庫檔案

#coding:utf-8
import re
import sys
from bs4 import BeautifulSoup
import urllib.request
import time


接下來,我們進行爬蟲偽裝(偽裝報頭)

(本次教程的網站沒有反爬蟲機制,可以選擇跳過)

headers = ('User-Agent', 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1')
opener = urllib.request.build_opener()
opener.addheaders = {headers}
urllib.request.install_opener(opener)


我們從爬取單章開始,首先我們進入第一張的網址相見歡-第一章

url = "http://www.lewendu8.com/books/21/21335/6381842.html"
file = urllib.request.urlopen(url)
data = BeautifulSoup(file , from_encoding="utf8")   

data = BeautifulSoup(file , from_encoding="utf8")

from_encoding= "utf8" 我們需要將內容進行轉碼,否則中文將會以亂碼形式出現


我們首先獲取這章的名稱

section_name = data.title.string
print(section_name)

    執行結果:

   




section_name = data.title.string


我們利用這句話獲取文章的章名(我認為比較簡便的一種方法)


接下來我們需要獲取這章的內容!!(不然看什麼小說呢?)

我們按F12進入開發者功能,找出存放內容的標籤




按照父子順序細細劃分






於是,我們尋找到了存放內容的標籤

用下述語句將內容存放至section_text中

section_text = data.select( '#bgdiv .border_l_r #content p')[ 0].text

按照指定格式替換章節內容,運用正則表示式

section_text=re.sub( '\s+', '\r\n\t', section_text).strip( '\r\n')

執行結果


至此,我們單章爬取任務完成


接下來我們任務當然是獲取整本小說的內容了!


首先我們來比較一下每一章的網址



第一章:http://www.lewendu8.com/books/21/21335/6381842.html

第二章:http://www.lewendu8.com/books/21/21335/6381843.html

……


因此URL的構成:http://www.lewendu8.com/books/21/21335/章節序號.html

我們觀察網頁原始碼可以發現:


其中next_page = "6381843.html"便是下一章的章節序號

因此我們在每個網頁訪問結束時,便可以進行訪問下一章的網址

這裡我們使用正則匹配獲取下一章的章節序號

pt_nexturl = 'var next_page = "(.*?)"' nexturl_num = re.compile(pt_nexturl).findall(str(data)) nexturl_num = nexturl_num[ 0]

當我們訪問到相見歡最後一章時



當訪問到最後一章時,我們的小說已經全部爬取結束

此時正則匹配到的資訊為:"http://www.lewendu8.com/books/21/21335/"

於是我們可以通過這個判斷我們是否爬取結束

        if(nexturl == 'http://www.lewendu8.com/books/21/21335/'):  
            break  


當我們爬取到了內容當然要進行檔案讀寫進行存放

fp = open( '相見歡.txt', 'a') section_text = section_text fp.write(section_name+ "\n") fp.write(section_text+ "\n")


至此,本次爬取結束~您就可以將txt檔案存放到手機上,看小說嘍~


三、完整程式碼                                                                         

#coding:utf-8
#author:Ericam_
import re
import sys
from bs4 import BeautifulSoup
import urllib.request
import time
headers = ('User-Agent', 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1')
opener = urllib.request.build_opener()
opener.addheaders = {headers}
urllib.request.install_opener(opener)

def get_download(url):
    file = urllib.request.urlopen(url)
    data = BeautifulSoup(file , from_encoding="utf8")    
    section_name = data.title.string
    section_text = data.select('#bgdiv .border_l_r #content p')[0].text        
    section_text=re.sub( '\s+', '\r\n\t', section_text).strip('\r\n')   
    fp = open('2.txt','a')   
    fp.write(section_name+"\n")  
    fp.write(section_text+"\n")  
    fp.close() 
    pt_nexturl = 'var next_page = "(.*?)"'
    nexturl_num = re.compile(pt_nexturl).findall(str(data))
    nexturl_num = nexturl_num[0]
    return nexturl_num

if __name__ == '__main__':
    url = "http://www.lewendu8.com/books/21/21335/6381842.html"
    num = 228
    index = 1
    get_download(url)
    while(True):
        nexturl = get_download(url)
        index += 1
        sys.stdout.write("已下載:%.3f%%" % float(index/num*100) + '\n')
        sys.stdout.flush()
        url = "http://www.lewendu8.com/books/21/21335/"+nexturl
        if(nexturl == 'http://www.lewendu8.com/books/21/21335/'):
            break
    print(time.clock())