網路爬蟲:Python+requests+bs4+xlwt 爬取京東商品存入Excel表
學了網路爬蟲兩週了,還是比較喜歡用網頁級庫requests,很靈活方便,scrapy網站級面向物件庫,還不熟悉,可能是原來c++學習面向物件就沒學好,對面向物件程式設計還沒理解好吧...兩週中爬了淘寶,京東,天貓(爬取失敗,反爬蟲把我這種新手難倒了,登入驗證就卡死),爬取搜狗批量下載輸入的型別圖片...用beautifulsoup,正則表示式的理解更加深入,慢慢有自己的認知和經驗。
進入正題。。。這次爬取的是京東商品價格和名稱。
一:老規矩分析京東方介面:開啟京東頁面,隨便搜尋一個東西,複製下圖的中紅色框裡面網址
第一頁:https://search.jd.com/Searchkeyword=%E8%8A%B1%E5%8D%89&enc=utf8
第二頁:https://search.jd.com/Search?keyword=%E8%8A%B1%E5%8D%89&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E8%8A%B1%E5%8D%89&stock=1&page=3&s=54&click=0
第三頁:https://search.jd.com/Search?keyword=%E8%8A%B1%E5%8D%89&enc=utf-8
可以發現搜尋介面是:https://search.jd.com/Search?keyword= 翻頁是&page= 可以發現京東的頁面是按照2的遞增的,第一頁就是1,第二頁3,第三頁5....經筆者嘗試,還需要向網址中增加&enc-utf-8也就是上面網址標紅髮地方,才能進入成功。不像淘寶可以直接介面加翻頁就可以。
所以最終的介面方式是:
https://search.jd.com/Search?keyword=(輸入關鍵詞)+&enc-utf-8+&page=(頁面號)
然後定義4個函式:分別是獲取每一頁品,返回Text,然後解析網頁,提取我們需要的東西,然後存excel,主函式
def getHtmlText(url,headers):
def parserPage(infoList,html):
def Write_Excel(ls,name):
def main():
接下來就說其中一些爬取過程中重點吧,分析網頁按住F12我們可以發現,把滑鼠對著每個li標籤,發現陰影都對著每個商品,說明,每個商品都對應li標籤
然後分析網頁:可以發現商品名稱在a標籤中的 title屬性中,價格是div 標籤中i標籤的string型別。
因為是新手,提取不太熟練,所以也是經過不斷嘗試,網頁解析提取的程式碼是:
def parserPage(infoList,html):
soup=BeautifulSoup(html,"html.parser")
goods=soup.find_all('li','gl-item')
try:
for good in goods:
name=good.a["title"]
price=good.find('div','p-price').i.string[:15]
infoList.append([price,name])
print("網頁解析成功!")
except:
print("網頁解析失敗")
接下來就說下存入Excel表,,需要用第三方庫xlwt,沒有的可以直接通過pip install xlwt。
我們需要先把頭標題存進去,表格也是按照矩陣從0,0開始的。然後在一行一行的存入資料。xlwt的用法請點選傳送門:
def Write_Excel(ls,name):
print("正在寫入Exce表:")
workbook=xlwt.Workbook(encoding='utf-8')
name="京東"+name+"商品資訊"
table=workbook.add_sheet(name)
# table.col(3).width=256*20
value=["序號","價格","商品名稱"]
for i in range(len(value)):
table.write(0,i+1,value[i])
for i in range(len(ls)):
value=[i+1,float(ls[i][0]),ls[i][1]]
for j in range(3):
table.write(i+1,j+1,value[j])
workbook.save(name+'.xls')
print("寫入Excel表成功!請在本程式下同一路徑下尋找excle")
因為我們我們列表是二維資料,所以存入excel是一行一行的存,先行後列,學過c語言估計就更能明白了。
我們來看下效果。
我用是pythonIDLE,IDLE是不能看到excel表的,所以複製執行程式碼的idle路徑,在我的電腦裡面貼上路徑,就會發現excel。
我們就看看我們抓取的成果吧!
很成功!
idle檢視excel要複製路徑有點麻煩,我們可以直接打包成無需環境的exe檔案,儲存的excel就會在執行excel 的地方,很方便!
接下來就放一份原始碼:供大家學習參考!切記超大量爬取資料。
#https://search.jd.com/Search?keyword=花卉&enc=utf-8&page=7
import requests,re,xlwt,datetime
from bs4 import BeautifulSoup
def getHtmlText(url,headers):
try:
r=requests.get(url,headers=headers,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
print("網頁請求成功!")
return r.text
except:
print("網頁請求失敗")
def parserPage(infoList,html):
soup=BeautifulSoup(html,"html.parser")
goods=soup.find_all('li','gl-item')
try:
for good in goods:
name=good.a["title"]
price=good.find('div','p-price').i.string[:15]
infoList.append([price,name])
print("網頁解析成功!")
except:
print("網頁解析失敗")
def Write_Excel(ls,name):
print("正在寫入Exce表:")
workbook=xlwt.Workbook(encoding='utf-8')
name="京東"+name+"商品資訊"
table=workbook.add_sheet(name)
# table.col(3).width=256*20
value=["序號","價格","商品名稱"]
for i in range(len(value)):
table.write(0,i+1,value[i])
for i in range(len(ls)):
value=[i+1,float(ls[i][0]),ls[i][1]]
for j in range(3):
table.write(i+1,j+1,value[j])
workbook.save(name+'.xls')
print("寫入Excel表成功!請在本程式下同一路徑下尋找excle")
def main():
print("當前系統時間為:",datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
start_url="https://search.jd.com/Search?keyword="
goods=input("請輸入需要爬取的京東商品名稱:")
num=int(input("請輸入需要爬取的頁面數量:"))
infoList=[]
headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5514.400 QQBrowser/10.1.1660.400"}
for i in range(1,num+1):
try:
url=start_url+goods+"&enc=utf-8&page="+str(i*2)
print("*****正在請求京東第%d頁網頁..loading.....*****"%i)
html=getHtmlText(url,headers)
print("*****正在解析京東第%d頁網頁..loading.....*****"%i)
parserPage(infoList,html)
except:
continue
#print(infoList)
Write_Excel(infoList,goods)
main()