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直譯器,為使用者靈活地提供不同的解析策略或強勁的速度。
(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)
執行結果:
我們利用這句話獲取文章的章名(我認為比較簡便的一種方法)
接下來我們需要獲取這章的內容!!(不然看什麼小說呢?)
我們按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())