網站商品信息爬蟲代碼及詳細註釋

import re          #正則表達式庫是爲了查找
import requests   #requests庫是爲了獲取網頁

def getHTMLText(url):  #獲取頁面,若用bs4解析,就是html格式文本,若不解析,就是一大串字符串
    try:
        r = requests.get(url, timeout = 30) #獲得response對象,r是對象
        r.raise_for_status()          #這就是檢查是不是很夠返回對象
        r.encoding = r.apparent_encoding  #這裏改變編碼格式,編碼格式不一定支持中文,這裏讓它支持中文
        return r.text  #返回的html頁面,是字符串
    except:
        print('wrong!!')

def parserPage(ilt,html):#解析頁面。這裏可以利用bs4直接解析,也可以利用re庫直接查找
    try:
        plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html) #查看網頁源碼可以看到價格與名字的鍵值對
        tlt = re.findall(r'\"raw_title\":\".*?\"',html)       #正則表達式類型,可以自己查看下正則表達式
        for i in range(len(plt)): #利用for循環把獲得的內容寫到列表中去
            price = eval(plt[i].split(':')[1]) #eval函數作用是去掉字符中兩端的單引號和雙引號
            title = eval(tlt[i].split(':')[1]) #split函數利用冒號來分割字符串(去掉冒號,剩下的形成兩個字符串在列表中),並取出第二個
            ilt.append([price,title])     #利用append函數把信息加載到我們所用的列表中去
    except:
        print('')

def PrintGoodslist(ilt):     #打印格式輸出 輸出格式在網上的print.format()中會有詳細介紹
    tplt = "{:4}\t{:8}\t{:16}" #輸出的格式默認是左對齊
    print(tplt.format('序號','價格','商品名稱'))
    count = 0                 #定義的count是爲了輸出有序號
    for g in ilt:
        count = count + 1
        print(tplt.format(count ,g[0] ,g[1])) #輸出爲三列

def main():
    goods = "書包"
    depth = 2
    start_url = "https://s.taobao.com/search?q=" + goods
    infolist = []
    for i in range(depth):    #depth是頁數的函數,這裏可以利用imput函數來書寫
        try:
            url = start_url + '&s=' + str(44*i) #這是每一頁的url
            html = getHTMLText(url)       #返回每一頁的html,這裏是字符串
            parserPage(infolist,html)     #解析頁面,也就是提取信息
        except:
            continue
    PrintGoodslist(infolist)      #打印函數,注意格式

if __name__ == '__main__':
    main()

注:
(1),希望準守網站robots協議進行爬取信息。
(2),內容來自北理課程

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