网络爬虫: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的用法请点击传送门: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()

猜你喜欢

转载自blog.csdn.net/memory_qianxiao/article/details/81062557