更多教程請(qǐng)移步至:洛涼博客
求助請(qǐng)移步至:Python自學(xué)技術(shù)交流
我感覺(jué)自己有個(gè)缺點(diǎn)挺不好的韧拒。不愛(ài)做筆記和總結(jié)。
自從工作之后發(fā)現(xiàn)不會(huì)做總結(jié)是多么沒(méi)有優(yōu)勢(shì)贞谓。
例如:寫個(gè)項(xiàng)目總結(jié)躺屁、工作總結(jié)、年中经宏,年終總結(jié)犀暑。
不百度或者谷歌下發(fā)現(xiàn)很難寫出點(diǎn)像樣的總結(jié)報(bào)告。
我希望自己能好好改掉這個(gè)缺點(diǎn)烁兰。以后對(duì)自己的所做所學(xué)加以記錄耐亏,方便以后查閱或溫習(xí)。
昨天一直在看中國(guó)大學(xué)MOOC大學(xué)沪斟,北京理工大學(xué)广辰,嵩教授主講的:Python網(wǎng)絡(luò)爬蟲(chóng)與信息提取暇矫。
(這里多說(shuō)一句【并非打廣告】,嵩教授講的確實(shí)不錯(cuò)择吊,思路和代碼書(shū)寫都很謹(jǐn)慎李根,每次都會(huì)強(qiáng)調(diào)代碼的穩(wěn)定性,有爬蟲(chóng)意向的朋友可以看看)
昨晚看的主要內(nèi)容為定向獲取某類商品的價(jià)格几睛,標(biāo)題房轿。
看完后自己按照思路敲了一遍。額外多獲取了一個(gè)商品屬性所森。
這個(gè)淘寶搜索后的商品信息好像是以JSON的形式存儲(chǔ)在源碼里面囱持。
PS:目前為止我好想還沒(méi)搞明白JSON和AJAX有沒(méi)有聯(lián)系。(以后對(duì)這方面知識(shí)進(jìn)行補(bǔ)充)
敲完代碼運(yùn)行后好像不成功焕济。
自己找了下原因纷妆,我查找的商品類型和嵩教授示例代碼里的商品類型不一致。
由于是通過(guò)正則進(jìn)行匹配的數(shù)據(jù)晴弃。(如需獲取還需改下正則表達(dá)式)
導(dǎo)致數(shù)據(jù)存儲(chǔ)對(duì)應(yīng)的鍵不一致掩幢。下面大家可以看下區(qū)別。
其實(shí)如果用嵩教授的商品進(jìn)行獲取上鞠,可以獲取到更多的商品信息粒蜈。
例如商品的ID,其實(shí)獲取到了ID就可以進(jìn)行商品鏈接拼接旗国。
這張截圖是通過(guò)URL鏈接里的ID在頁(yè)面源碼找的到枯怖。
然后可以拼接成:天貓店鋪:https://detail.tmall.com/item.htm?id=42252465037,淘寶店鋪:https://item.taobao.com/item.htm?id=537105758663的方式進(jìn)行獲取商品鏈接能曾。
有興趣的可以嘗試下獲取更多商品信息度硝。
好了,其實(shí)爬蟲(chóng)需要的是思路寿冕,思路清晰蕊程,代碼就好寫了。
我寫的可以查找數(shù)碼這一類商品驼唱,例如藻茂,某品牌電腦,鍵盤玫恳,鼠標(biāo)辨赐,手機(jī)
如果失敗大家可以看下源碼里面價(jià)格和商品名稱對(duì)應(yīng)的數(shù)據(jù),相應(yīng)修改后就能正常京办。
下面直接貼我看完后以老師的思路進(jìn)行編寫的代碼掀序。
import requests
import re
def geturl(page,key):
'''獲取搜索商品后的頁(yè)面源碼'''
data = {
'q':key,
's':page*44
}
url = 'https://s.taobao.com/search?'
try:
html = requests.get(url,params=data)
html.raise_for_status()
except:
print('-----初始鏈接獲取失敗-----')
return html.text
def gethtml(html):
'''匹配源碼里需要的數(shù)據(jù)'''
try:
goods = []
#商品標(biāo)題,價(jià)格惭婿,付款人數(shù)正則表達(dá)式
pat1 = r'\"price\":\"\d{1,5}\"'
pat2 = r'\"title\":\".*?\"'
pat3 = r'\"month_sales\":\"\d{1,9}\"'
prices = re.findall(pat1,html)
titles = re.findall(pat2,html)
sales = re.findall(pat3,html)
for i in range(len(titles)):
#eval去掉字符串兩邊雙引號(hào)不恭,以分好切片獲取后面要的信息
price = eval(prices[i].split(':')[1])
title = eval(titles[i].split(':')[1])
sale = eval(sales[i].split(':')[1])
#將每個(gè)商品的價(jià)格叶雹,標(biāo)題,付款人數(shù)以表格形式存入到一個(gè)空列表
goods.append([title,sale,price])
except:
print('-----信息獲取失敗-----')
return goods
def printinfo(slist):
'''打印獲取到的商品信息'''
#format打印格式
law = '{:^4}\t{:^8}\t{:^8}\t{:^16}'
print(law.format('序號(hào)','商品價(jià)格','已付款人數(shù)','商品名稱'))
num = 0 #初始化序號(hào)
for x in slist:
num+=1
print(law.format(num,x[2],x[1],x[0]))
def main():
'''程序運(yùn)行入口'''
pages = int(input('請(qǐng)輸入要查詢的頁(yè)數(shù):'))
good_name = input('請(qǐng)輸入需要查找的商品類型:')
for page in range(pages):
try:
html = geturl(page,good_name)
slist = gethtml(html)
printinfo(slist)
except:
print('-----程序運(yùn)行出錯(cuò)-----')
if __name__ == '__main__':
main()
下面我也把嵩老師代碼貼一下换吧,大家不要直接復(fù)制運(yùn)行折晦。會(huì)報(bào)錯(cuò)。
要試的自己按照代碼敲一遍沾瓦。
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 = '書(shū)包'
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()