前言
本文將以最簡單粗暴的方式讓你瞭解寫python爬蟲的基本流程【下載《筆趣閣》網絡小說《伏天氏》
】,涉及到內庫或第三方庫的基本方法不會詳細講解,如有需要可關注留言(根據情況考慮專門寫一篇爬蟲常用庫的講解),也可自行查閱。【本文只針對未入門且想了解python爬蟲的小夥伴】
網絡爬蟲簡介
網絡爬蟲
,也叫網絡蜘蛛(Web Spider)。它根據網頁地址(URL)爬取網頁內容,而網頁地址(URL)就是我們在瀏覽器中輸入的網址。
比如:https://www.baidu.com/,就是一個URL。在講爬蟲實戰之前,我們需要先了解寫爬蟲的必備技能:
審查元素(如果瞭解過HTML,可忽略這部分內容)。
準備工作
- python安裝(強烈推薦Anaconda,如果需要請關注微信公衆號:機器學習與Python編程,後臺回覆Anaconda即可)
- urllib庫是python內置的,無需安裝,只要安裝了Python就可以使用這個庫。requests、Beautiful Soup庫是第三方庫,需要我們自己pip install requests、pip install Beautiful Soup4來安裝(這時候如果安裝Anaconda的好處就來了,這兩個庫都不需要單獨安裝!!)。
牛刀小試
- 第一步,獲取第一章的HTML信息。URL:https://www.jupindai.com/book/87/27486785.html
代碼如下
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 14:57:15 2020
@author: Acc²
"""
import requests
if __name__ == "__main__":
#爬取<伏天氏>第一章
url = "https://www.jupindai.com/book/87/27486785.html"
req = requests.get(url)
req.encoding = req.apparent_encoding #避免中文亂碼
print(req.text)
以下是運行結果:
這就是第一章的html信息了。如何把我們需要的內容從這些衆多的html標籤中提取出來呢?接着往下看。。。
- 第二步:提取正文
仔細觀察網站源碼,我們可以發現:class屬性爲panel-body的div標籤唯一。這個標籤裏面存放的內容,是我們需要的部分。這樣,我們就可以使用Beautiful Soup提取我們需要的內容了,代碼如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 14:57:15 2020
@author: Acc²
"""
import requests
from bs4 import BeautifulSoup
if __name__ == "__main__":
#爬取<伏天氏>第一章
url = "https://www.jupindai.com/book/87/27486785.html"
req = requests.get(url)
req.encoding = req.apparent_encoding #避免中文亂碼
html = req.text
bf = BeautifulSoup(html)
#獲得html信息中所有class屬性爲panel-body的div標籤
texts = bf.find_all('div', class_ = 'panel-body')
#提取匹配結果後,使用text屬性,提取文本內容,濾除br標籤。隨後使用replace方法,剔除空格,替換爲回車進行分段。
#在html中是用來表示空格的。replace('\xa0'*8,'\n\n')就是去掉八個空格符號,並用回車代替
print(texts[0].text.replace('\xa0'*8,'\n\n')) # find_all匹配的返回的結果是一個列表
運行結果如下:
可以看到,我們已經匹配到了所有正文內容,並進行了分段。而要想下載整本小說,就需要獲取每個章節的鏈接,下面我們繼續。。。。
Python爬蟲實例
- 分析:通過審查元素,我們發現可以發現,這些章節都存放在了class屬性爲panel panel-default的div標籤下。也就是說每章的鏈接放在了class屬性爲panel panel-default的div 標籤下的a標籤中。具體位置是html->body->div->dl->dd->a的href屬性中。先匹配class屬性爲panel panel-default的div標籤,再匹配a標籤。
- 有了前面的鋪墊,接下來我貼出完整的代碼,如果依然有不明白的地方,歡迎以任何方式聯繫我交流。
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests, sys
"""
類說明:下載《筆趣閣》網絡小說《伏天氏》
"""
class downloader(object):
def __init__(self):
self.server = 'https://www.jupindai.com/'
self.target = 'https://www.jupindai.com/book/87.html'
self.names = [] #章節名
self.urls = [] #章節鏈接
self.nums = 0 #章節數
"""
函數說明:獲取下載鏈接
"""
def get_download_url(self):
req = requests.get(url = self.target)
req.encoding = req.apparent_encoding #轉爲utf-8編碼
html = req.text
div_bf = BeautifulSoup(html)
div = div_bf.find_all('div', class_ = 'panel panel-default')
a_bf = BeautifulSoup(str(div))
a = a_bf.find_all('a')
self.nums = len(a[4:]) #剔除不必要的章節,並統計章節數(根據需要修改)
for each in a[4:]:
self.names.append(each.string)
self.urls.append(self.server + each.get('href')) """
函數說明:獲取章節內容
Parameters:
target - 下載連接(string)
Returns:
texts - 章節內容(string)
"""
def get_contents(self, target):
req = requests.get(url = target)
req.encoding = req.apparent_encoding #轉爲utf-8編碼
html = req.text
bf = BeautifulSoup(html)
texts = bf.find_all('div', class_ = 'panel-body')
texts = texts[0].text.replace('\xa0'*8,'\n\n')
return texts
"""
函數說明:將爬取的文章內容寫入文件
Parameters:
name - 章節名稱(string)
path - 當前路徑下,小說保存名稱(string)
text - 章節內容(string)
"""
def writer(self, name, path, text):
write_flag = True
with open(path, 'a', encoding='utf-8') as f:
f.write(name + '\n')
f.writelines(text)
f.write('\n\n')if __name__ == "__main__":
dl = downloader()
dl.get_download_url()
print('《伏天氏》開始下載:')
for i in range(dl.nums):
dl.writer(dl.names[i], '伏天氏.txt', dl.get_contents(dl.urls[i]))
sys.stdout.write(" 已下載:%.3f%%" % float(i/dl.nums*100) + '\r')
sys.stdout.flush()
print('《伏天氏》下載完成。歡迎關注微信公衆:機器學習與Python編程')
接下來等着下載完就好了。如果只是爲了學習,那麼下載個幾章看看效果也就OK了。
希望這篇文章能對你入門爬蟲有一定的幫助,後面也會繼續在公衆號和博客上更新一些關於機器學習與Python編程的文章。若覺得有那麼一點幫助,歡迎支持下下,謝謝!!
如有問題,歡迎留言。如有錯誤,歡迎指正,感謝!