1. 程式人生 > >網路爬蟲:Python+requests+bs4+xlwt 爬取京東商品存入Excel表

網路爬蟲:Python+requests+bs4+xlwt 爬取京東商品存入Excel表

學了網路爬蟲兩週了,還是比較喜歡用網頁級庫requests,很靈活方便,scrapy網站級面向物件庫,還不熟悉,可能是原來c++學習面向物件就沒學好,對面向物件程式設計還沒理解好吧...兩週中爬了淘寶,京東,天貓(爬取失敗,反爬蟲把我這種新手難倒了,登入驗證就卡死),爬取搜狗批量下載輸入的型別圖片...用beautifulsoup,正則表示式的理解更加深入,慢慢有自己的認知和經驗。

進入正題。。。這次爬取的是京東商品價格和名稱。

一:老規矩分析京東方介面:開啟京東頁面,隨便搜尋一個東西,複製下圖的中紅色框裡面網址


第一頁:https://search.jd.com/Searchkeyword=%E8%8A%B1%E5%8D%89&enc=utf8

&wq=%E8%8A%B1%E5%8D%89&pvid=f25c9779fce841d6982ce59edcadab51

第二頁: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

&qrst=1&rt=1&stop=1&vt=2&wq=%E8%8A%B1%E5%8D%89&stock=1&page=5&s=107&click=0

可以發現搜尋介面是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()