更多教程請移步至:洛涼博客
求助請移步至:Python自學技術交流
我感覺自己有個缺點挺不好的。不愛做筆記和總結。
自從工作之后發現不會做總結是多么沒有優勢。
例如:寫個項目總結、工作總結、年中,年終總結。
不百度或者谷歌下發現很難寫出點像樣的總結報告。
我希望自己能好好改掉這個缺點。以后對自己的所做所學加以記錄,方便以后查閱或溫習。
昨天一直在看中國大學MOOC大學,北京理工大學,嵩教授主講的:Python網絡爬蟲與信息提取。
(這里多說一句【并非打廣告】,嵩教授講的確實不錯,思路和代碼書寫都很謹慎,每次都會強調代碼的穩定性,有爬蟲意向的朋友可以看看)
昨晚看的主要內容為定向獲取某類商品的價格,標題。
看完后自己按照思路敲了一遍。額外多獲取了一個商品屬性。
這個淘寶搜索后的商品信息好像是以JSON的形式存儲在源碼里面。
PS:目前為止我好想還沒搞明白JSON和AJAX有沒有聯系。(以后對這方面知識進行補充)
敲完代碼運行后好像不成功。
自己找了下原因,我查找的商品類型和嵩教授示例代碼里的商品類型不一致。
由于是通過正則進行匹配的數據。(如需獲取還需改下正則表達式)
導致數據存儲對應的鍵不一致。下面大家可以看下區別。
電腦價格.png
書包價格.png
其實如果用嵩教授的商品進行獲取,可以獲取到更多的商品信息。
例如商品的ID,其實獲取到了ID就可以進行商品鏈接拼接。
這張截圖是通過URL鏈接里的ID在頁面源碼找的到。
然后可以拼接成:天貓店鋪:https://detail.tmall.com/item.htm?id=42252465037,淘寶店鋪:https://item.taobao.com/item.htm?id=537105758663的方式進行獲取商品鏈接。
有興趣的可以嘗試下獲取更多商品信息。
image.png
好了,其實爬蟲需要的是思路,思路清晰,代碼就好寫了。
我寫的可以查找數碼這一類商品,例如,某品牌電腦,鍵盤,鼠標,手機
如果失敗大家可以看下源碼里面價格和商品名稱對應的數據,相應修改后就能正常。
下面直接貼我看完后以老師的思路進行編寫的代碼。
import requests
import re
def geturl(page,key):
'''獲取搜索商品后的頁面源碼'''
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):
'''匹配源碼里需要的數據'''
try:
goods = []
#商品標題,價格,付款人數正則表達式
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去掉字符串兩邊雙引號,以分好切片獲取后面要的信息
price = eval(prices[i].split(':')[1])
title = eval(titles[i].split(':')[1])
sale = eval(sales[i].split(':')[1])
#將每個商品的價格,標題,付款人數以表格形式存入到一個空列表
goods.append([title,sale,price])
except:
print('-----信息獲取失敗-----')
return goods
def printinfo(slist):
'''打印獲取到的商品信息'''
#format打印格式
law = '{:^4}\t{:^8}\t{:^8}\t{:^16}'
print(law.format('序號','商品價格','已付款人數','商品名稱'))
num = 0 #初始化序號
for x in slist:
num+=1
print(law.format(num,x[2],x[1],x[0]))
def main():
'''程序運行入口'''
pages = int(input('請輸入要查詢的頁數:'))
good_name = input('請輸入需要查找的商品類型:')
for page in range(pages):
try:
html = geturl(page,good_name)
slist = gethtml(html)
printinfo(slist)
except:
print('-----程序運行出錯-----')
if __name__ == '__main__':
main()
運行后打印效果.png
下面我也把嵩老師代碼貼一下,大家不要直接復制運行。會報錯。
要試的自己按照代碼敲一遍。
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("序號", "價格", "商品名稱"))
count = 0
for g in ilt:
count = count + 1
print(tplt.format(count, g[0], g[1]))
def main():
goods = '書包'
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()