爬蟲(4)_代碼分析

[後續會整理 出PPT,將放置源碼素材內以供下載~]html

[任何爬蟲均只爲學習,不用於商業及其餘目的,侵權刪]前端

[若是你有其餘測試領域的想法,也能夠私信我發稿給我在公衆號上展現哦]python


一.演示數據庫


首先,咱們先觀看下效果,這個效果爲後端執行爬取的動做;暫時不涉及入庫及前端展現。[虛機centos網絡很差,我切換到了window演示]django

[請關注公衆號觀看]後端

我將爬取的內容存入了html文件,並保留了html文件的樣式,樣式地址來源於官網樣式,沒有繼續爬取官網的樣式centos

二.安裝數組


在前兩節中,咱們安裝了python+django。基於第三節網站分析,咱們須要再安裝兩個庫:網絡

pip install requestspip install PyQuery

requests: 請求網頁的時候須要使用到;app

PyQuery: 對網頁解析的時候須要使用到,這個語法相似jQuery。

三.代碼編寫分析


 

1)首頁的解析代碼分析

$(".PagedList-skipToPage")

咱們在首頁分析的時候,有展現使用這個代碼在console敲出的效果,能夠返回去觀看下上節《爬蟲(3)_對網站的分析

以上的這個代碼,其實是獲取全部的頁面數值,統計總共有多少頁請求,即免費書籍的總數額,這項的做用在於發送請求的參數kw的值,參考以下:

def FreeComputerBook():
    url="http://www.ituring.com.cn/book"
    kw="tab=free&sort=vote"
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
    response=requests.get(url,params=kw,headers=headers)
    htmlResult=pq(response.text)
    
    pageCount=htmlResult(".PagedList-skipToPage").items()
    pageNum=0
    bookCount=0
    books=[]
    for page in pageCount:
        kw="tab=free&sort=vote&page="+str(pageNum)
        pageNum=pageNum+1
        response=requests.get(url,params=kw,headers=headers)
        htmlResult=pq(response.text)
        books.append(allBookDetails(htmlResult,bookCount,headers))
    print(books)

經過kw的值,進行遍歷發送獲取書籍的請求URL:(參數page的變化)

http://www.ituring.com.cn/book?tab=free&sort=vote&page=1

2)書籍總數肯定後,要開始獲取書籍進入詳細介紹頁的URL等信息,一樣的請參考第三節以前的輸入值:

$(".block-books li")

這個代碼主要是獲取全部書籍的列表信息,單個列表裏包括了一本書的URL地址,做者,書名等信息。返回的值是一組數組,這塊咱們要對返回的數組進行遍歷獲取單本書的信息,以下:使用for循環獲取單本書籍信息

def allBookDetails(htmlResult,bookCount,headers):
    books=[]
    bookItems=htmlResult(".block-books li").items()
    for bookitem in bookItems:
        book={}
        bookCount=bookCount+1
        bookUrl=bookitem.find(".book-img a").attr("href")
        bookName=bookitem.find(".book-img a").attr("title")
        bookAuthor=bookitem.find(".book-info a").text()
        book["url"]="http://www.ituring.com.cn"+bookUrl
        book["name"]=bookName
        book["author"]=bookAuthor
        book["catalogue"]=BookCatalogue(book["url"],headers,bookName)
        books.append(book)
        print("the "+str(bookCount)+"book is crawling over.")
    return books

咱們將獲取到的信息存入字典,再將字典最後存入數組,這塊的參數主要是爲了入庫作準備的

 

3)獲取書籍的目錄信息(由網站觀察發現目錄進入內容頁的URL會根據目錄的id不一樣而看到目錄對應的內容)因此這個URL的id是必須獲取的,參考第三節輸入的代碼:

$(".table tr")

觀察網站發現整個目錄是展現在一個表格內的,因此咱們須要獲取表格的每行內的對應的URL信息,代碼的編寫以下:

def BookCatalogue(url,headers,bookName):
    bookCatalogue={}
    response=requests.get(url)
    htmlResult=pq(response.text)
    contents=""
    catalogues=htmlResult(".table tr").items()
    
    for catalogue in catalogues:
        catalogueUrl=catalogue.eq(0).find("a").attr("href")
        catalogueName=catalogue.eq(0).find("a").text()
        bookCatalogue["catalogueUrl"]="http://www.ituring.com.cn"+catalogueUrl
        bookCatalogue["catalogueName"]=catalogueName

一樣的我也將獲取的信息存入字典,以備入庫使用~

 

4)目錄獲取以後,須要獲取目錄對應的內容數據,也請參考第三節內容~

$(".article-detail").html()

這個代碼是獲取內容頁的內容,包含了樣式信息,代碼解析以下:

def BookContent(url,headers):
    response=requests.get(url) 
    htmlResult=pq(response.text)
    #contents=htmlResult(".article-detail").text().encode('UTF-8')
    content=htmlResult(".article-detail").html().encode('UTF-8')
    return content

四.END


以上就是整個爬取頁面信息的所有過程,後續咱們須要將這些信息所有存入數據庫;一樣的,你在觀看演示的時候會發現性能很差,執行時間過長,這項後續也會講解優化過程~

相關文章
相關標籤/搜索