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),內容來自北理課程