【爬虫】shopXO 商城

获取到 shopXO商城 中 数码产品 中商品的 “产品名称”,“价格”,“浏览数”,“销量”,“库存”

#-*- coding = utf-8 -*-
#@Time:2020/7/18 17:11
#@Author:huxuehao
#@File:
#@Software:PyCharm
#@Theme:

import re   #正则表达式
import urllib.request,urllib.error   #指定url,获取网页数据
# import urllib
import xlwt     #进行Excel操作
import csv      #进行csv操作
from bs4 import BeautifulSoup   #网页解析

#注意下面路径中的必须是“start=”,因为我们通过手动添加start的值进行锁定爬取页面
src="https://guest.shopxo.net/goods-"
# src="www.huxuehaoshizuishuaide.hahahahahaha.com"
#获取网页源码
def gethtml(url):
    head={
            "User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 83.0.4103.116Safari / 537.36"
        }
    #User-Agent的信息为Chrome的信息,请将默认浏览器设置为Chrome浏览器
    req=urllib.request.Request(url,headers=head)
    response=urllib.request.urlopen(req)
    html=response.read().decode("utf-8","ignore")
    # print(html)
    soup=BeautifulSoup(html,"html.parser")
    # print(soup)
    return soup

#爬取信息的正则表达式
findName=re.compile(r'<h1 class="detail-title am-margin-bottom-xs">(.*?)<!',re.S)
findMoney=re.compile(r'<b class="goods-price" data-original-price="(.*?)">(.*?)</b>',re.S)
findXiangQing=re.compile(r'</span><span class="tm-count">(.*?)</span></div>',re.S)
findKuCun=re.compile(r'<span class="tb-hidden stock-tips">库存<span class="stock" data-max-limit="0" data-min-limit="1" data-original-stock="(.*?)" data',re.S)
findNokucun=re.compile(r'<p class="goods-not-buy-tips">(.*?)</p>',re.S)


#将得到的有效信息存放在list中
datalist=[]
def get_target_data():
    for i in range(0,12):  #对20个页面进行读取(一共读取1500条信息)
        urls=src+str(i+1)+".html"
        try:                   #异常处理,防止网址不存在的情况
            soup=gethtml(urls) #爬取的网址
        except Exception:      #当网址异常时,接收本次循环
            print(urls,"不能访问!")
            continue
        if "资源不存在或已被删除" in soup.text:  #若此页面中有资源不存在的字样,则跳过本次循环
            print("第%d页的资源不存在或已被删除..."%(i+1))
            continue
        else:
            for item in soup.find_all('div',class_="clearfix-right"):
                data=[] #用于接收每一条信息
                item=str(item)
                # print(item)
                # break
                name = re.findall(findName, item)  #找名字
                if len(name)==0:  #防止此信息为空
                    data.append("暂无信息")
                else:
                    name[0]=name[0].replace("\n","") #替换\n
                    name[0] = name[0].replace(" ", "") #替换空格
                    data.append(name[0])
                money = re.findall(findMoney, item)  #找价格
                if len(money)==0:   #防止此信息为空
                    data.append("暂无信息")
                else:
                    moneys=[]
                    moneys.append(money[0][0]) #因为money[0][0]不能直接使用.replace,所以将其替换成moneys=[]
                    moneys[0] = moneys[0].replace("\n", "")  # 替换\n
                    moneys[0] = moneys[0].replace(" ", "")  # 替换空格
                    data.append(moneys[0])
                xiangqing=re.findall(findXiangQing,item)
                if len(xiangqing)<3:
                    data.append("暂无信息")
                    data.append("暂无信息")
                    # data.append("暂无信息")
                else:
                    for m in range(0,2):
                        xiangqing[m] = xiangqing[m].replace("\n", "")  # 替换\n
                        xiangqing[m] = xiangqing[m].replace(" ", "")  # 替换空格
                    data.append(xiangqing[1])
                    data.append(xiangqing[0])
                ""
                # if "商品卖光了" in soup.text:
                Nokucun = re.findall(findNokucun, item)
                if len(Nokucun) == 1:
                    # data.append(Nokucun[0])
                    # data.append("商品卖光了")
                    print(Nokucun[0])
                    data.append("0")
                else:
                    kucun = re.findall(findKuCun, item)
                    if len(kucun) >0:  # 防止此信息为空
                        kucun[0] = kucun[0].replace("\n", "")  # 替换\n
                        kucun[0] = kucun[0].replace(" ", "")  # 替换空格
                        data.append(kucun[0])
                datalist.append(data)
            print("第%d页的资源爬取完毕..."% (i + 1))
    print("一共爬取了%d条有效数据"%len(datalist))  #打印一共有多少条信息
    print(datalist[10])
    for i in datalist:
        print(i)
#将list中的信息写入txt文档
def saveTxt(list):
    print("爬取的数据将保存在txt文件中..")
    f=open("shopXO.txt","w",encoding="utf-8")
    for i in list:
         # print("已写入第%d条" % (i + 1))
         for j in i:
             string=str(j) #转换成字符串
             f.write(string) #写入
             if(j==i[len(i)-1]): #保证每一行的末尾不加‘,’
                f.write(",") #用','进行隔开
         f.write("\n")
    f.close

#将list中的信息存到Excel中
def saveExcel(list):
    print("爬取的数据将保存在Excel文件中..")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建book对象
    sheet = book.add_sheet('shopXO',cell_overwrite_ok=True)  # 创建工作表
    # col=("产品名称","价格","浏览数","销量","库存")
    # for i in range(len(col)):
    #     sheet.write(0,i,col[i])
    for i in range(0,len(list)):
        data=list[i]
        for j in range(0,len(data)):
            sheet.write(i+1,j,data[j])
    book.save("shopXO.xls")

#将list中的数据存储到csv文件中
def saveCsv(list):
    print("爬取的数据将保存在csv文件中..")
    with open('shopXO.csv', 'w', encoding='utf-8',newline='') as csvfile:
        writer = csv.writer(csvfile, delimiter=',') # 这里在初始化写入对象时传入delimiter为',',此时输出结果的每一列就是以','分隔了
        writer.writerow(['产品名称','价格','浏览数','销量','库存'])
        for i in list: #将datalist中的列表循环写入
            writer.writerow(i)
if __name__ == '__main__':
    get_target_data()
    # saveCsv(datalist)
    # saveTxt(datalist)
    # saveExcel(datalist)
    print("爬取的数据已保存!")

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值