淘宝口红爬虫入门+数据分析(超详细)
作者:互联网
起因:
刚好高中学金融同学遇到课程要对进行商品爬虫和分析的,自己实在没办法的情况下找到了我。自己对爬虫也是一头雾水,数据分析倒是有一定的基础,也只能硬着头皮上了。
开始
自己尝试先在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上下载就好了,因为还有涉及到图片和停词的文件。
最好推荐各位用jupyter notebook打开,这样看的效果更好一点。为了照顾我那个同学,我重新弄了一份py的代码,大家自取。
好了我的整个流程,首先是对读取数据
数据去重,还有对数据缺失值进行处理。在我这里我直接把含有缺失值的行给去掉了。
!!!注意呀,这里的去除掉之后,index就不是连续的,所以我们后面还要对index也就是索引进行重新的排序,不然后面循环会出现问题!!!
接着就是对付款人数字段的处理
因为我们看到得到的数据里面是包含‘+’还有汉字的
但我们只想要数字,就得里面进行处理。
(这里就对index进行了重新排序了)
最后得到效果是只含有数字。原本公众号里面的code我就是这里出问题,死活都不行,我就改用循环,而不是用函数。
处理好了付款人数,我们还有发货地址要处理
看!是不是我们看到爬到的数据里有些是省份+城市,有些就只有国家或城市。我们是不是得统一一下,就只有城市或者国家,不能出现两个地名。
处理完后,我们对发货地址进行统计,得到发货最多的十个地方。前三个是上海,深圳,广州。
在完成上一步之后我们对口红的牌子进行统计,因为我们得到的商品的信息是一大段的,没有得到具体的牌子,所以我们得先手动记录口红牌子(看代码第一句,因为我套了别人的代码所以就没改变量名字 哈哈哈哈太懒了 )
如果你们要对新的物品的进行品牌分析,得先自己手动加进去,在tar_cpu里修改。这个的策略主要是用品牌名字一一和商品信息对应,如果能对应上就给他归类成该牌子,如果没配对上最后就归类为 品牌不详。
(我傻了我也是第一次知道竟然有那么多牌子的口红,对男生来说实在是太难了)
来看看结果,okk我们进行下一步。
最后这部分主要是想通过商品的信息,制作词云。我们得先对商品信息进行处理,用jieba分词,可以看到我们的案例。
先分词,可以看到我们数据的最后一列就是分词后的结果。
统计词出现的频率。
好了这就是我们最后得到的词云,当然了,想换个背景图片自己看着代码修改名称就行了。
最后的最后
啊感觉时间过得好快,尤其是就只是在帮同学做这个项目就花了好几天,特别是后面还涉及到了我想把jupyter notebook输出成pdf,弄得我心态爆炸。算了算了,chrome是最好的浏览器不容反驳。
我写这篇blog的意义是希望可以帮到大家,同时提升下自己的水平。感觉看到了很多代码都对人很不友好,操作很不方便。
非常感谢公众号推文救了我自己,不然真就用那个京东爬的数据去分析了。
大家喜欢的话麻烦点个赞
标签:数据分析,get,口红,class,爬虫,find,browser,page,row 来源: https://blog.csdn.net/weixin_39459398/article/details/106959688