python爬蟲實例之淘寶商品比價定向爬取(雖然網站已經改變,不能爬取,但是,我還是分析了一下)

python爬蟲實例之淘寶商品比價定向爬取

這次就模仿之前做的總結進行初次嘗試

  • 目標:獲取淘寶搜索頁面的信息,提取其中的商品名稱和價格
  • 理解:
    • 獲取淘寶的搜索接口
    • 淘寶頁面的翻頁處理
  • 技術路線:requests——re
準備工作
  • 獲取淘寶搜索商品的關鍵字接口

如下圖,自然而然地看見網址中地keyword後面,赫然地跟着“海賊王手辦”,幾個大字

舊版是 q= 後面連接關鍵字,這裏只是教你怎麼看
在這裏插入圖片描述

  • 獲取翻頁的關鍵字接口

嘗試翻頁之後,發現page後面對應的頁碼變爲2,所以改變page的就翻頁了

這個是新版的,舊版的是s作爲關鍵字,44的倍數一頁
在這裏插入圖片描述

  • 查看robots協議,查看是否允許進行爬取

如下圖,好吧,這個我也忘記了,看一下什麼意思
在這裏插入圖片描述
根據基本語法知道,淘寶是不允許所有的爬蟲對根目錄進行爬取的,但是用於技術探討應該是可以的
在這裏插入圖片描述

  • 如果要獲取商品信息的提取範式,需要查看商品信息的表達式形式,於是我打開了網頁

如下圖,好吧,搜索之下並沒有任何發現,似乎沒有將信息保存在網頁

在這裏插入圖片描述
於是乎我打開某個商品的頁面,並查看源代碼
好吧,所有的信息都是寫在標籤裏面的,教程裏面的信息並沒有出現

在這裏插入圖片描述
在這裏插入圖片描述
由此發現,淘寶已經有了改良,商品的信息已經不寫在html頁面中,沒有辦法直接爬取

但是作爲一個練手的項目,可以參照視頻裏面的版本進行一下分析和講解,如下圖

價格的圖片段,“view_price”:“127.00”

分析爲正則表達式:“view_price”:"[\d.]*"
在這裏插入圖片描述
名稱段,“raw_title”:“超牛娜娜包”

分析成正則表達式:“raw_title”:"[.]*"
在這裏插入圖片描述

程序編寫
  • 第一步,確定步驟,並將所有的步驟

    • 提交商品的搜索請求,獲取頁面 getHTMLText()
    • 對於每個頁面,提取商品的名稱和價格信息 parsePage()
    • 將信息輸出到屏幕上 printGoodList()
    • 採用main函數將所有的函數連接起來

代碼:

# 獲取相關的HTML頁面信息
# url是網頁的連接
def getHTMLtext(url):
     return''

# 獲取各個商品的信息
# html是爬取到本地的HTML內容
# ilt是用來存放商品信息的html頁面
def parsePage(ilt,html):
     print('')


# 將商品輸入到屏幕上
# ilt是容納對應的商品的信息的列表
def printMessage(ilt):
    print()

# 用main函數將所有的網頁鏈接起來
# 重點在於翻頁的方式,獲取翻頁的關鍵字
def main():
    goods = '書包'
    depth = 2
    start_url = 'http://a.taobao.com/search?q=' + goods
    infolist = []
    for i in range(2):
        try:
            url = start_url+'&s=' + str(44*i)
            html = getHTMLtext(url)
            parsePage(infolist,html)
        except:
            continue
        printMessage(infolist)

main()
  • 第二步,完善各個步驟的方法

逐步完善各個部分的代碼

  • 第一部分完善getHTMLtext(url),常規的爬取頁面的方式,基本上不變
# 獲取相關的HTML頁面信息
def getHTMLtext(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return''
  • 第二部分,完善parsePage()分析爬取頁面(parse描述),不同於以往的BeautifulSoup庫查找標籤,這裏用正則表達式
# 獲取各個商品的信息
def parsePage(ilt,html):
    try:
        plt = re.findall(r'\"view_price\"\:\"[\d.]*\"',html)
        tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
        //根據很久以前的網頁得到的信息格式
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            # eval()函數,將對應的數據外層的雙引號或者是單引號去掉
            # 注意,提取之後是作爲字符串存在的,然後用”:“將之拆分,僅僅只取後面的值
            title = eval(tlt[i].split(':')[1])
            ilt.append([price.title])
    except:
        print('')
  • 第三部分,採用格式輸出的方式,用format函數,先規定輸出的格式,然後逐個輸出
# 將商品輸入到屏幕上
def printMessage(ilt):
    tplt = '{:4}\t{:8}\t{:16}'
    # 定義輸出的模板
    print(tplt.format("序號","價格","商品名稱"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count,g[0],g[1]))

代碼總結

import re
import requests

# 獲取相關的HTML頁面信息
def getHTMLtext(url):
    try:
        r = requests.get(url,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return''

# 獲取各個商品的信息
def parsePage(ilt,html):
    try:
        plt = re.findall(r'\"view_price\"\:\"[\d.]*\"',html)
        tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            # eval()函數,將對應的數據外層的雙引號或者是單引號去掉
            title = eval(tlt[i].split(':')[1])
            ilt.append([price.title])
    except:
        print('')


# 將商品輸入到屏幕上
def printMessage(ilt):
    tplt = '{:4}\t{:8}\t{:16}'
    # 定義輸出的模板
    print(tplt.format("序號","價格","商品名稱"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count,g[0],g[1]))

# 用main函數將所有的網頁鏈接起來
def main():
    goods = '書包'
    depth = 2
    start_url = 'http://a.taobao.com/search?q=' + goods
    infolist = []
    for i in range(2):
        try:
            url = start_url+'&s=' + str(44*i)
            html = getHTMLtext(url)
            parsePage(infolist,html)
        except:
            continue
        printMessage(infolist)

main()

總結

  • 我們平常在瀏覽網頁的時候,發現很多的頁面是需要登錄才能使用,那麼爬蟲怎麼爬取?其實我也不知道,但是我想攻克,在下一篇博客我一定會寫這方面的信息

  • 現今爲止,篩選網上的信息,我們有兩種方式

    • 方式一:使用BeautifulSoup庫,信息包含在標籤中
    • 方式二:使用正則表達式,整個頁面中進行爬取
  • 現今爲止,我們常用的輸出方式,使用format函數,先是寫出對應的輸出格式,然後再分佈填入其中

  • 對於關鍵字,通過之前的幾個例子發現,無論是翻頁,還是搜索都會映射到網址中的對應的關鍵字,所以要回看關鍵字

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