Python爬蟲,教你借一本慶餘年,裏面超詳細的喲!

爬蟲界裏我孔乙己,讀書人的事情能說偷嗎? 這叫借!那我們就講講怎麼借一本慶餘年來觀摩觀摩! 說笑了,這是魯迅筆下的一篇小說叫做孔乙己,裏面有這樣的一個橋段,那日,孔乙己偷拿了一本書,被衆人發現之後,孔乙己便漲紅了臉,額上的青筋條條綻出,爭辯道,“竊書不能算偷……竊書!……讀書人的事,能算偷麼?”接連便是難懂的話,什麼“君子固窮”,什麼“者乎”之類,引得衆人都鬨笑起來:店內外充滿了快活的空氣。

在這裏插入圖片描述

如果孔乙己也會爬蟲,那這當然不算偷咯!這叫技術,專業的!


因爲我也是剛學爬蟲的,很多不會還請指教指教,那下面我講講我是如何實現的我要的功能,我分爲三大步驟,爬蟲準備,爬蟲代碼,存放文件,其次,後面還有我遇到的巨坑,我會講講我是如何闖關的,最後是我的一點小心得,希望能對各位有幫助,覺得好的點個贊收藏關注一波,覺得不好的,評論區留言錘死博主😁

爬蟲準備:

  • 函數庫: requests , re, lxml, os
  • 工具: python 3.7 和 pycharm2019
  • 分析網站: 起點中文網
  • 查看網頁源代碼編寫xpath語法:

庫的下載:

這裏的第一步就是庫的下載,那我們開始吧,這幾個庫的安裝就簡單的pip安裝就可以了,相信大家都會的,我就不敢班門弄斧了😂😂😂

分析網站:

我們要分析的網站時起點中文網,裏面有很多小說,那這次我們就拿慶餘年來實例實例,思路如下,通過含有目錄的網址,獲得每個章節的網址,然後遍歷每個章節網址,從而獲得每個章節網址中的文本信息! 這裏不知道又有多少人矇蔽了,那我們給個圖看看吧!在這裏插入圖片描述

就是通過f12, 然後獲取指定位置的源代碼,這一章節的全部內容在第二個
div中的class="volume"標籤中,然後又在ul中的class=“cf” 裏面,最後又在li標籤中的a標籤的文本中,諤諤,,這聽着有點繞口,不過這確實要符合xpath的語法規格,這裏就將就的用我寫的xpath語法吧,//div[@class = "volume"][2]//ul[@class = "cf"]//li/a/text() , 如果這裏不會xpath的朋友們也可以試着用正則來寫下,都是差不多的,那下面給出源代碼:

def get_page_url(urls, headers):  # 給定目錄網址,獲得每個章節的網址

    r = requests.get(urls, headers=headers)
    html = etree.HTML(r.text)  # 形成xpath對象
    html = etree.tostring(html)  # 修改代碼
    html = etree.fromstring(html)  # 轉換格式 不加就會出錯
    result = html.xpath(
        '//div[@class = "volume"][2]//ul[@class = "cf"]//li/a/@href')  # 目前先確定第二個div標籤 獲得改標籤下網址
    result = ['http:' + i for i in result]  # 拼接網址
    name = html.xpath('//div[@class = "volume"][2]//ul[@class = "cf"]//li/a/text()')  # 確定第二個div標籤的文章標題

    return result, name

這裏我不光獲取了每個章節的網頁鏈接,還獲取了每個章節的標題,以便後續存入文件中使用!


編寫代碼:

那從上面的代碼中我們獲取了每個章節的網址鏈接和標題,那下面我們就進入下一個操作,獲取每個章節中的文本信息,這裏我們打開第一章來查看查看😕😝
在這裏插入圖片描述

這裏我們可以在右側看到文本信息了吧,據我分析,他是在一個div標籤中屬性爲class="read-content j_readContent"的下屬p標籤的文本中,那我也給出我的xpath語法出來
//div[@class="read-content j_readContent"]/p/text() , 哦哦, 這裏要說一句,xpath語法很簡單的,如果有人想讓我出一期xpath教學,就在下面評論區留言哦,那下面我也給出代碼:

def get_page_text(urls, headers):  # 根據每一頁的網址 獲得其中的文本信息 然後返回給主函數
    text = []  # 文本
    for i in urls:  # 遍歷這個列表
        r = requests.get(i, headers=headers)
        if r.status_code == 200:  # 如果請求正常
            s = re.sub(r':', '', r.text)
            page_html = etree.HTML(s)  # 形成xpath對象
            page_html = etree.tostring(page_html)  # 修改代碼規格
            # print(page_html.decode('utf-8'))
            page_html = etree.fromstring(page_html)  # 轉換格式
            page_text = page_html.xpath(
                '//div[@class="read-content j_readContent"]/p/text()')  # 尋找真實網址

            text.append(page_text)
    print(text)
    return text  # 該文本還需要修改碼片

代碼的註釋我在上面已經很詳細的寫了,可以看看哦 😘

存放文件:

因爲上面獲取了每個章節的文本和標題,那下面我們存放文件就很舒服了,直接寫入文本信息吧,利用os庫,創建我們的專屬文件夾,就像這樣

def write_page_text(text, title):  # 根據獲得的文本 和 標題 然後寫入文件夾中
    path = 'D://慶餘年//'
    if not os.path.exists(path):  # 如果目錄不存在的話
        os.mkdir(path)  # 創建這個目錄
        os.chdir(path)  # 進入這個目錄
    else:
        os.chdir(path)  # 進入這個目錄

    for i in zip(title, text):  # 形成拉鍊
        s = ''.join(i[1])
        with open('第' + str(count - 1) + '卷. ' + i[0] + '.txt', 'a+', encoding='utf-8') as fw:
            fw.write(i[0] + '\n')
            fw.write(s)
        print(f'{i[0]}: 已經下載完成!')

爬蟲巨坑:

巨坑一:


  • 請求失敗

剛開始啥都不是很懂,就直接用原始代碼區爬取了,導致一直不穩定很容易出錯,後面纔想起了要加一個請求頭,這樣我的第一個bug就修復好了

巨坑二:


  • xpath中AttributeError: ‘bytes’ object has no attribute ‘xpath’

這個問題也困擾了我很久很久,我上百度找了很久,終於在一個國外論壇上找到了,這裏需要加入一個函數etree.fromstring(html)這樣這個問題就弄好了

巨坑三:


  • 虛假網址:?????我是爬了一個寂寞吧?

從獲得章節網址的沾沾自喜,就被爬蟲啪啪打臉,怎麼頁獲取不了章節內容,我一致懷疑我的語法問題,一直修改修改,到後面從某本書上知道了,還有虛假網址一說,我瞬間明白了,原來從元素中的網址是要經過js渲染之後纔有的效果,所以我在網絡中找到了我的要的準確網址,從而獲取了正確的內容

小小心得:

爬蟲不是萬能的,但是是最爽的,哈哈哈,能做好多好多事情呢,雖然這次爬蟲遇到不少的坑,差點就讓我放棄了這個實例,但是經過圈內好友的提醒,還有網上的知識,我終於還是成功了,這是一個自學爬蟲不到一個禮拜的小萌新做的,那我相信你們也是可以的哈,所以,給我一個贊啦😥😥😥
😂


那今天就到這裏結束了哈! 下次再見!

在這裏插入圖片描述

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