假設(shè)各位老哥已經(jīng)安裝好了bs4 requests這些庫了
這個(gè)小說是隨便挑的,各位也就不用太介意(僅供各位學(xué)習(xí))
python3 實(shí)現(xiàn),網(wǎng)上用python2做爬蟲的太多了,但用python3的還是比較少
通過步驟四中 尋找到的那些url來對(duì)逐步訪問,獲取txt并寫入(這個(gè)在之前也都講過了)
沒有看過 步驟一 的朋友們可以點(diǎn)擊下面的鏈接看看步驟一先
點(diǎn)擊查看步驟一沒有看過 步驟二 的朋友們可以點(diǎn)擊下面的鏈接看看步驟二先
點(diǎn)擊查看步驟二沒有看過 步驟三 的朋友們可以點(diǎn)擊下面的鏈接看看步驟三先
點(diǎn)擊查看步驟三沒有看過 步驟四 的朋友們可以點(diǎn)擊下面的鏈接看看步驟四先
點(diǎn)擊查看步驟四本來代碼是會(huì)很簡(jiǎn)單的,但為了不被禁什么的。就加了模擬人的休息(sleep)
代碼會(huì)自動(dòng)下載到E:/txt/這個(gè)文件夾中(沒有的話,會(huì)自動(dòng)添加這個(gè)文件夾)
會(huì)自動(dòng)尋找到這個(gè)小說的名字(并存儲(chǔ)下來,以這個(gè)名字作為文件名)
通過步驟四的篩選使得這些鏈接都是包括有小說內(nèi)容的(一般會(huì)有作者發(fā)一些公告的章節(jié),對(duì)于這個(gè)進(jìn)行了一定的篩選)

下載過程的效果
import requests
from bs4 import BeautifulSoup
import os
import time
import random
urls = []
title = []
content_url = "http://www.biquge.com.tw/4_4038"
kv = {'user_agent': 'Mozilla/5.0'} # 表示是一個(gè)瀏覽器
root = 'E:/txt/' # 設(shè)置根目錄,將會(huì)把txt文件放到這個(gè)文件夾中的
book_name = '1.txt' # 設(shè)置一個(gè)Default書名(雖然在后來肯定是會(huì)找到一個(gè)名字的)
count = 0
try:
r = requests.get(content_url, headers=kv) # 表示自己是一個(gè)瀏覽器
r.raise_for_status() # 如果有問題就會(huì)raise一個(gè)問題
r.encoding = r.apparent_encoding # 根據(jù)網(wǎng)頁返回的編碼 進(jìn)行調(diào)整
soup = BeautifulSoup(r.text, 'html.parser')
content_list = soup.find(id='list')
chapter_list = soup.find_all('dd')
meta = soup.find('head').find(attrs={'property': "og:novel:book_name"})
book_name = meta['content'] + '.txt'
print(book_name[:book_name.index('.txt')] + '寫入中')
for chapter in chapter_list: # 整合得到所有跟內(nèi)容有關(guān)的鏈接(會(huì)有哪些跟內(nèi)容無關(guān)的章節(jié)的)
if '第' in chapter.find('a').text and '章' in chapter.find('a').text:
title.append(chapter.find('a').text)
urls.append(content_url[:content_url.rindex('/')] + chapter.find('a')['href'])
first = True
for i, url in enumerate(urls):
r = requests.get(url, headers=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
soup = BeautifulSoup(r.text, 'html.parser')
content = soup.find(id='content')
string = content.text.replace('\u3000', '').replace('『', '“').replace('』', '”').replace('\ufffd', '').replace('\u30fb', '') # 去除不相關(guān)字符
string = string.split('\xa0') # 編碼問題解決
string = list(filter(lambda x: x, string))
for ii in range(len(string)):
string[ii] = ' ' + string[ii]
if "本站重要通知" in string[ii]: # 去除文末尾注
t = string[ii].index('本站重要通知')
string[ii] = string[ii][:t]
string = '\n'.join(string)
string = '\n' + title[i] + '\n' + string + '\n'
string = string.replace('\ufffd', '').replace('\u30fb', '').replace('\u3000', '')
if not os.path.exists(root):
os.mkdir(root) # 如果沒有這個(gè)文件夾,就會(huì)創(chuàng)建一個(gè)
if first: # 如果是第一次寫入的話,會(huì)將原來的內(nèi)容清空,然后再寫入
first = False
with open(root + book_name, 'w') as f:
f.write(string)
f.close()
else: # 反之,則直接在文章末尾處添加
with open(root + book_name, 'a') as f:
f.write(string)
f.close()
print(title[i].replace('\ufffd', ''), '寫入成功') # 這是因?yàn)槲覔?dān)心這個(gè)字符是在title中的
ti = random.randint(0, 2)
if ti == 0:
count += 1
else:
count = 0
if count < 3:
time.sleep(ti)
else:
time.sleep(30)
except:
pass