淘宝口红爬虫入门+数据分析(超详细)

大家可以先下载代码,这是我的github地址

起因:

刚好高中学金融同学遇到课程要对进行商品爬虫和分析的,自己实在没办法的情况下找到了我。自己对爬虫也是一头雾水,数据分析倒是有一定的基础,也只能硬着头皮上了。

开始

自己尝试先在csdn和github找能够爬虫的代码,好像都碰到挺多问题的,大多数都不能跑,要不就是代码太多人跑了链接被封了,要不就是环境问题。能找到要不就是爬的数据太简陋了,只有商品名称和价格。

import requests
from bs4 import BeautifulSoup
import urllib
import xlsxwriter

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
}


def get_good_urls(word):
    url_str = urllib.parse.quote(word)
    urls = (
    "https://search.jd.com/Search?keyword={}&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&offset=4&page={}&s=1&click=0".format(
        url_str, i) for i in range(1, 12, 2))
    return urls


def get_html(url):
    html = requests.get(url, headers=headers)
    html.encoding = html.apparent_encoding
    soup = BeautifulSoup(html.text, 'lxml')
    return soup


def get_info(soup):
    all_titles = soup.find_all(class_="p-name p-name-type-2")
    all_prices = soup.find_all(class_="p-price")

    titles = []
    prices = []

    for title in all_titles:
        titles.append(title.text.strip())

    for price in all_prices:
        prices.append(price.text.strip())


    return titles, prices,


if __name__ == '__main__':
    good = input("请输入你要查询的商品\n")
    links = get_good_urls(good)

    workbook = xlsxwriter.Workbook(good + '.xlsx')  # 创建新表
    worksheet = workbook.add_worksheet()

    bold = workbook.add_format({'bold': True})  # 建立粗体格式

    worksheet.write('A1', 'Title', bold)  # 写入标题,粗体
    worksheet.write('B1', 'Price', bold)

    worksheet.set_column('A:A', 100)  # 改变列宽度
    worksheet.set_column('B:B', 10)

    all_row = 1
    col = 0

    for link in links:
        html = get_html(link)
        ti, pr = get_info(html)

        row = all_row
        for t in ti:
            worksheet.write(row, col, t)
            row += 1

        row = all_row
        for p in pr:
            worksheet.write(row, col + 1, p)
            row += 1

        all_row += len(ti)
        print('Done One page')
    workbook.close()

最后爬出来的数据格式是这样的
在这里插入图片描述

好吧,我嫌他数据的属性太少了。

在一筹莫展时刚好看到公众号分享的推文里有类似的项目,公众号推文大家可以去看看,我的主要是思路都是这个推文的,不过他的数据清洗代码有点问题,我对他的代码进行重新修改。

冲了-第一部分淘宝爬虫

#!/usr/bin/env python
# coding: utf-8

# In[1]:


from selenium import webdriver
import time


from selenium import webdriver
import time
import csv

# 搜索商品,获取商品页码
def search_product(key_word):
    # 定位输入框
    browser.find_element_by_id("q").send_keys(key_word)
    # 定义点击按钮,并点击
    browser.find_element_by_class_name('btn-search').click()
    # 最大化窗口:为了方便我们扫码
    browser.maximize_window()
    # 等待15秒,给足时间我们扫码
    time.sleep(15)
    # 定位这个“页码”,获取“共100页这个文本”
    page_info = browser.find_element_by_xpath('//div[@class="total"]').text
    # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。
    page = re.findall("(\d+)",page_info)[0]
    return page

# 获取数据
def get_data():
    # 通过页面分析发现:所有的信息都在items节点下
    items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
    for item in items:
        # 参数信息
        pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
        # 价格
        pro_price = item.find_element_by_xpath('.//strong').text
        # 付款人数
        buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text
        # 旗舰店
        shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text
        # 发货地
        address = item.find_element_by_xpath('.//div[@class="location"]').text
        #print(pro_desc, pro_price, buy_num, shop, address)
        with open('{}.csv'.format(key_word), mode='a', newline='', encoding='utf-8-sig') as f:
            csv_writer = csv.writer(f, delimiter=',')
            csv_writer.writerow([pro_desc, pro_price, buy_num, shop, address])

def main():
    browser.get('https://www.taobao.com/')
    page = search_product(key_word)
    print(page)
    get_data()
    page_num = 1
    while int(page) != page_num:
        print("*" * 100)
        print("正在爬取第{}页".format(page_num + 1))
        browser.get('https://s.taobao.com/search?q={}&s={}'.format(key_word, page_num*44))
        browser.implicitly_wait(15)
        get_data()
        page_num += 1
    print("数据爬取完毕!")

if __name__ == '__main__':
    key_word = input("请输入你要搜索的商品:")
    browser = webdriver.Chrome()
    main()


这部分代码把要pip的包pip好,再把webdriver配置好基本上就ok了。

运行的时候需要自己二维码扫码登陆,然后就等着它爬完100页。代码最后会输出一个 .csv的文件

例如: 我一开始输入搜索物品 口红
最后会得到一个 口红.csv

最后得到的效果是这样的,可以看到爬到的数据有商品信息,价格,付款人数,网店名字,发货地点。比之前那份京东代码得到的信息要丰富很多。
在这里插入图片描述

冲了-第二部分数据分析

这部分代码就不放了,大家去我github上下载就好了,因为还有涉及到图片和停词的文件。

我的github地址

最好推荐各位用jupyter notebook打开,这样看的效果更好一点。为了照顾我那个同学,我重新弄了一份py的代码,大家自取。

好了我的整个流程,首先是对读取数据
在这里插入图片描述
数据去重,还有对数据缺失值进行处理。在我这里我直接把含有缺失值的行给去掉了。

!!!注意呀,这里的去除掉之后,index就不是连续的,所以我们后面还要对index也就是索引进行重新的排序,不然后面循环会出现问题!!!
在这里插入图片描述
接着就是对付款人数字段的处理
因为我们看到得到的数据里面是包含‘+’还有汉字的
但我们只想要数字,就得里面进行处理。
(这里就对index进行了重新排序了)
在这里插入图片描述
最后得到效果是只含有数字。原本公众号里面的code我就是这里出问题,死活都不行,我就改用循环,而不是用函数。
在这里插入图片描述
处理好了付款人数,我们还有发货地址要处理
看!是不是我们看到爬到的数据里有些是省份+城市,有些就只有国家或城市。我们是不是得统一一下,就只有城市或者国家,不能出现两个地名。
在这里插入图片描述
处理完后,我们对发货地址进行统计,得到发货最多的十个地方。前三个是上海,深圳,广州。
在这里插入图片描述

在完成上一步之后我们对口红的牌子进行统计,因为我们得到的商品的信息是一大段的,没有得到具体的牌子,所以我们得先手动记录口红牌子(看代码第一句,因为我套了别人的代码所以就没改变量名字 哈哈哈哈太懒了 )

如果你们要对新的物品的进行品牌分析,得先自己手动加进去,在tar_cpu里修改。这个的策略主要是用品牌名字一一和商品信息对应,如果能对应上就给他归类成该牌子,如果没配对上最后就归类为 品牌不详。

(我傻了我也是第一次知道竟然有那么多牌子的口红,对男生来说实在是太难了)
在这里插入图片描述
来看看结果,okk我们进行下一步。
在这里插入图片描述
最后这部分主要是想通过商品的信息,制作词云。我们得先对商品信息进行处理,用jieba分词,可以看到我们的案例。
在这里插入图片描述
先分词,可以看到我们数据的最后一列就是分词后的结果。
在这里插入图片描述
统计词出现的频率。
在这里插入图片描述
好了这就是我们最后得到的词云,当然了,想换个背景图片自己看着代码修改名称就行了。
在这里插入图片描述

最后的最后

啊感觉时间过得好快,尤其是就只是在帮同学做这个项目就花了好几天,特别是后面还涉及到了我想把jupyter notebook输出成pdf,弄得我心态爆炸。算了算了,chrome是最好的浏览器不容反驳。

我写这篇blog的意义是希望可以帮到大家,同时提升下自己的水平。感觉看到了很多代码都对人很不友好,操作很不方便。

非常感谢公众号推文救了我自己,不然真就用那个京东爬的数据去分析了。

大家喜欢的话麻烦点个赞👍,你的一点点支持对我来说意味着很多,当然了别忘了给我github上star一下!超级谢谢,有什么问题在下面私信评论我就好了。

  • 34
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值