python爬蟲零基礎入門必會項目

前言

本文將以最簡單粗暴的方式讓你瞭解寫python爬蟲的基本流程【下載《筆趣閣》網絡小說《伏天氏》】,涉及到內庫或第三方庫的基本方法不會詳細講解,如有需要可關注留言(根據情況考慮專門寫一篇爬蟲常用庫的講解),也可自行查閱。【本文只針對未入門且想了解python爬蟲的小夥伴】

網絡爬蟲簡介

網絡爬蟲,也叫網絡蜘蛛(Web Spider)。它根據網頁地址(URL)爬取網頁內容,而網頁地址(URL)就是我們在瀏覽器中輸入的網址。
比如:https://www.baidu.com/,就是一個URL。在講爬蟲實戰之前,我們需要先了解寫爬蟲的必備技能:
審查元素(如果瞭解過HTML,可忽略這部分內容)。

準備工作

  1. python安裝(強烈推薦Anaconda,如果需要請關注微信公衆號機器學習與Python編程,後臺回覆Anaconda即可)
  2. urllib庫是python內置的,無需安裝,只要安裝了Python就可以使用這個庫。requests、Beautiful Soup庫是第三方庫,需要我們自己pip install requests、pip install Beautiful Soup4來安裝(這時候如果安裝Anaconda的好處就來了,這兩個庫都不需要單獨安裝!!)。

牛刀小試

  1. 第一步,獲取第一章的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標籤中提取出來呢?接着往下看。。。

  1. 第二步:提取正文
    仔細觀察網站源碼,我們可以發現: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爬蟲實例

  1. 分析:通過審查元素,我們發現可以發現,這些章節都存放在了class屬性爲panel panel-default的div標籤下。也就是說每章的鏈接放在了class屬性爲panel panel-default的div 標籤下的a標籤中。具體位置是html->body->div->dl->dd->a的href屬性中。先匹配class屬性爲panel panel-default的div標籤,再匹配a標籤。
  2. 有了前面的鋪墊,接下來我貼出完整的代碼,如果依然有不明白的地方,歡迎以任何方式聯繫我交流。
# -*- 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編程的文章。若覺得有那麼一點幫助,歡迎支持下下,謝謝!!
如有問題,歡迎留言。如有錯誤,歡迎指正,感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章