1.開始前準(zhǔn)備
1.1?python3淹禾,本文代碼使用Python3來寫雪标。沒有安裝Python3的童鞋請(qǐng)先安裝Python3哦
1.2?requests庫筷狼,Requests 是用Python語言編寫动看,基于 urllib,采用 Apache2 Licensed 開源協(xié)議的 HTTP 庫洞慎。它比 urllib 更加方便痛单,可以節(jié)約我們大量的工作,完全滿足 HTTP 測(cè)試需求劲腿。
下載方法:
pip install requests
1.3 pycharm旭绒,一款功能強(qiáng)大的PythonIDE!下載官方版本后焦人,使用license sever免費(fèi)使用(同系列產(chǎn)品類似)挥吵,具體參照http://www.cnblogs.com/hanggegege/p/6763329.html。
2.爬取分析
我們的目標(biāo)是實(shí)現(xiàn)一個(gè)能夠代替淘寶搜索獲取商品信息的腳本花椭,那么我們先來分析分析具體應(yīng)該如何實(shí)現(xiàn)吧忽匈!
我們嘗試一下通過網(wǎng)頁上的“搜索”按鈕來獲取一些信息。我們隨便輸入一個(gè)商品名稱:電腦
重復(fù)幾次相同操作查詢不同名稱商品后矿辽,我們發(fā)現(xiàn)了一些規(guī)律丹允,通過觀察url參數(shù)我們發(fā)現(xiàn),只要在https://s.taobao.com/search?q=后面加上你需要查詢的商品名稱就能獲取你想要的淘寶商品信息了袋倔!我們就以這個(gè)為突破口嫌松,去寫目標(biāo)腳本吧!
3.代碼過程分析與演示
首先我們導(dǎo)入所需要的庫:
import requests
import re
我們先來看看電腦信息頁面的源代碼奕污,去發(fā)現(xiàn)其中商品信息的規(guī)律,再用正則表達(dá)式去實(shí)施全局匹配液走,右鍵上圖頁面查看源代碼:
仔細(xì)觀察這段代碼碳默,通過對(duì)一組數(shù)據(jù)的分析得到:商品名稱在raw_title當(dāng)中,商品價(jià)格view_price當(dāng)中缘眶,通過這個(gè)規(guī)律 嘱根,我們來寫兩個(gè)正則表達(dá)式,匹配頁面上的所有商品價(jià)格與名稱巷懈!
我們先來寫個(gè)函數(shù)獲取網(wǎng)頁代碼信息:
def getHTMLText(url):
? ? try:
? ? ? ? r = requests.get(url)
? ? ? ? r.raise_for_status()
? ? ? ? r.encoding = r.apparent_encoding
? ? ? ? return r.text #這幾行不懂的可以去查查requests庫的文檔哦
? ? except:
? ? ? ? return ""
接著该抒,我們?cè)賹憘€(gè)函數(shù)把獲取商品信息:
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])
? ? ? ? ? ? title = eval(tlt[i].split(':')[1])
? ? ? ? ? ? ilt.append([price, title])
? ? except:
? ? ? ? print("")
最后,我們需要寫個(gè)函數(shù)把商品信息列出來:
def printGoodsList(ilt):
? ? tplt = "{:4}\t{:8}\t{:16}"
? ? print(tplt.format("序號(hào)", "價(jià)格", "商品名稱"))
? ? count = 0
? ? for g in ilt:
? ? ? ? count = count + 1
? ? ? ? print(tplt.format(count, g[0], g[1]))
現(xiàn)在我們來寫個(gè)main()函數(shù)來測(cè)試我們的代碼吧顶燕!
def main():
? ? goods = input('請(qǐng)輸入要查找的商品名稱:')
? ? depth = 3? ? ? ? ? ? #爬取的頁碼深度凑保,可以自己調(diào)哦
? ? start_url = 'https://s.taobao.com/search?q=' + goods
? ? infoList = []
? ? for i in range(depth):
? ? ? ? try:
? ? ? ? ? ? url = start_url + '&s=' + str(44 * i)? #去翻頁看看url的變化就知道為什么這么些了
? ? ? ? ? ? html = getHTMLText(url)
? ? ? ? ? ? parsePage(infoList, html)
? ? ? ? except:
? ? ? ? ? ? continue
? ? printGoodsList(infoList)
項(xiàng)目完整代碼:
import requests
import re
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])
? ? ? ? ? ? title = eval(tlt[i].split(':')[1])
? ? ? ? ? ? ilt.append([price, title])
? ? except:
? ? ? ? print("")
def printGoodsList(ilt):
? ? tplt = "{:4}\t{:8}\t{:16}"
? ? print(tplt.format("序號(hào)", "價(jià)格", "商品名稱"))
? ? count = 0
? ? for g in ilt:
? ? ? ? count = count + 1
? ? ? ? print(tplt.format(count, g[0], g[1]))
def main():
? ? goods = input('請(qǐng)輸入要查找的商品名稱:')
? ? depth = 3
? ? start_url = 'https://s.taobao.com/search?q=
' + goods
? ? infoList = []
? ? for i in range(depth):
? ? ? ? try:
? ? ? ? ? ? url = start_url + '&s=' + str(44 * i)
? ? ? ? ? ? html = getHTMLText(url)
? ? ? ? ? ? parsePage(infoList, html)
? ? ? ? except:
? ? ? ? ? ? continue
? ? printGoodsList(infoList)
main()
我們來看看運(yùn)行效果圖:
大功告成冈爹!
(ps:本文代碼參照中國慕課網(wǎng)課程)
謝謝觀看!