Python爬蟲之獲取小說

學這個之前請確保自己對http協議和html有些瞭解(不用全都會)

爬蟲是什麼?

爬蟲就是模擬瀏覽器去訪問鏈接,來幫助我們獲取想要的數據,可見即可爬(爬不到就是技術不夠)

瀏覽器是怎樣訪問網頁的呢?

瀏覽器會向一個網站發起一個請求,網站再作出響應,返回數據給瀏覽器,返回的數據就包含我們想要的東西。

不多嗶嗶,進入正文!

就拿起點中文網爲例,推薦使用Chrome瀏覽器,因爲火狐一次次讓我失望。

 

 

是不是很多小說?(雖然我一個也不看,全是一羣妄想家的白日夢,已經無藥可救   (艹皿艹 ))

點進第一本的目錄裏看看:

 

如果想把每一章的內容都保存下來的話,這他孃的也太多了吧,這擱誰誰受得了啊。。。。w(゚Д゚)w

橋豆麻袋!!!!我們還有爬蟲!管他有多少章節都得乖乖躺在朕的硬盤裏︿( ̄︶ ̄)︿

第一步:獲取書名的鏈接,按下F12鍵,鼠標定位到書名

 

每個書名都有對應的鏈接,我們需要拿到它,代碼裏會出現

Bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
Bigsrc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')

這個xpath超好用,不用我們寫正則表達式啦! (づ ̄3 ̄)づ╭❤~

 第一行用於獲取class="book-mid-info"這個div控件下的h4標籤下的a標籤的文本值

 第二行用於獲取class="book-mid-info"這個div控件下的h4標籤下的a標籤的鏈接值

 接下來出現的類似代碼也是類似的功能

 第二步:拿到書名和鏈接,我們訪問這個鏈接,就會到書的章節目錄裏面去,再按F12

 

 

 第三步:訪問每一個章節鏈接把每一章的內容保存下來

每一章的章節名也會有文本和鏈接,拿到每一章的鏈接就能看到每一章裏面的內容了

 

 

 

思路有了,代碼怎麼寫呢?需要以下三個模塊

requests(發起請求)
os(文件管理)
lxml 的 etree(處理頁面響應的html)

翠花,上代碼!

import requests
import os
from lxml import etree
class Spider(object):#面向對象式編程
    def start_request(self):#拿到小說名
        response=requests.get("https://www.qidian.com/all")#發起請求訪問鏈接
        html=etree.HTML(response.text)#將HTML代碼處理成樹狀結構
        Bigtit_list=html.xpath('//div[@class="book-mid-info"]/h4/a/text()')
        Bigsrc_list=html.xpath('//div[@class="book-mid-info"]/h4/a/@href')
        for Bigtit,Bigsrc in zip(Bigtit_list,Bigsrc_list):#遍歷所有書名和鏈接
            if os.path.exists(Bigtit)==False:
                os.mkdir(Bigtit)#創建書名文件夾
            self.file_data(Bigtit,Bigsrc)
    def file_data(self,Bigtit,Bigsrc):#訪問書名鏈接獲取章節
        url="http:"+Bigsrc;
        response=requests.get(url)
        print(url)
        html=etree.HTML(response.text)
        Littit_list=html.xpath('//ul[@class="cf"]/li/a/text()')
        Litsrc_list = html.xpath('//ul[@class="cf"]/li/a/@href')
        for Littit, Litsrc in zip(Littit_list, Litsrc_list):#遍歷所有章節
           self.file_save(Littit,Litsrc,Bigtit)
    def file_save(self,Littit,Litsrc,Big_tit):#訪問章節內容並保存
        response=requests.get("http:"+Litsrc)
        html=etree.HTML(response.text)
        content="\n".join(html.xpath('//div[@class="read-content j_readContent"]/p/text()'))
        file_name=Big_tit+"\\"+Littit+".txt"
        print(file_name)
        with open(file_name,"a",encoding="utf-8") as f:#保存章節內容
            f.write(content)

s=Spider()
s.start_request()

代碼到此就沒有了,也不長,但是初學的時候確實不知道怎麼弄,還掰着正則表達式看了一通,不知道原來xpath這麼香。

小說這麼幹就能幹完了,想獲取其他的文本也是類似的,但是網站的反爬蟲機制可能會導致失敗,我這個沒有加request 的請求頭,加了可能也會失敗,比如這個代碼爬不到VIP章節內容,還可能封了我的IP,所以對抗反爬蟲的路也是很長的,學這麼點東西還遠遠不夠肆意妄爲的。

可以試試用這個獲取某些**網站的圖片和文字,看明白上邊的東西之後就不難了,不說了,大家保重身體 ┗|`O′|┛ 嗷~~

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