由于近年来淘宝的反爬措施逐渐完善,爬取难度变大,在爬取时必须要登录之后才能查看相关的商品信息,淘宝数据是通过动态加载的方式显示的,所以本文使用selenium模拟浏览器操作爬取商品页详情信息。
需要提取安装和selenuim和浏览器驱动chromedriver,由于chorme浏览器的自动更新,所以导致我的chrome浏览器版本和chromedriver版本不一致,所以使用了
chromedriver_path=r’C:\ProgramFiles\Google\Chrome\Application\chromedriver.exe’
browser = webdriver.Chrome(executable_path=chromedriver_path) 的方法成功加载了浏览器,在爬取淘宝美食的时候需要手动扫码等陆才可以保证爬取的顺利进行,最终成功爬取2733条记录。
import re
import time
import pymongo
from selenium import webdriver
from pyquery import PyQuery as pq
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
KEYWORD ='美食'
MONGO_TABLE = 'meishi'
chromedriver_path=r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
browser = webdriver.Chrome(executable_path=chromedriver_path)
wait = WebDriverWait(browser, 10)
client = pymongo.MongoClient('localhost',27017)
cilen = client['taobao']
db = cilen['food']
def search_page():
print('正在搜索')
try:
browser.get('https://www.taobao.com')
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
)
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
input.send_keys(KEYWORD)
submit.click()
total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
get_products()
return total.text
except TimeoutException:
return search_page()
def next_page(page_number):
print('翻页中',page_number)
try:
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
)
submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
input.clear()
input.send_keys(page_number)
submit.click()
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))
get_products()
except TimeoutException:
next_page(page_number)
def get_products():
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
html = browser.page_source
doc = pq(html)
items = doc('#mainsrp-itemlist .items .item').items()
for item in items:
product = {
'price':item.find('.price').text(),
'deal':item.find('.deal-cnt').text()[:-3],
'title':item.find('.title').text(),
'shop':item.find('.shop').text(),
'location':item.find('.location').text()
}
print(product)
save_to_mongo(product)
def save_to_mongo(result):
try:
if db[MONGO_TABLE].insert(result):
print('存储成功',result)
except Exception:
print('存储失败',result)
def main():
try:
total = search_page()
total = int(re.compile('(\d+)').search(total).group(1))
for i in range(2,total+1):
time.sleep(3)
next_page(i)
except Exception:
print('爬取错误')
finally:
browser.close()
if __name__ == '__main__':
main()
在mongodb Compass看到以下数据:
在mongodb的bin目录下使用命令:mongoexport -d taobao -c meishi.food -f _id,price,deal,title,shop,location–csv -o ./D:/kesci.淘宝美食.csv
得到下表:
使用jupyter notebook读取数据
具体的清洗目标,这里以第一列数据为例:
初始值 | 清洗后的值 |
---|---|
¥24.90 | 24.90 |
5.5万+ | 5.5 |
湖北 荆州 | province:湖北,city:荆州 |
import re
import pandas as pd
data=pd.read_csv("D:/kesci/淘宝食物.csv")
#处理price、deal
data['price']=data['price'].map(lambda x:x.replace('¥',""))
data['deal']= data['deal'].map(lambda x: float(x.split("万")[0])*10000 if '万' in x else float(str(x).replace('+','')))
#处理location
data['province']=data['location'].map(lambda x:x.split(" ")[0])
for i in range(len(data)):
location=data.loc[i,'location'].split(" ")
if len(location)>1:
data.loc[i,'city']=location[1]
else:
data.loc[i,'city']=location[0]
data.drop('location',axis=1,inplace=True)
data.head()
下图是销售额在300000以上的店铺的销售和商品的平均单价:
小胡鸭食品旗舰店销售额远超其他店铺,但其店铺内商品的平均单价处于偏低的水平,这表明大部分消费者面对商品单价低一点的商品表现出更强的兴趣,大多数消费者还是更能接收单次较低的消费。
以下是各省的销售额排行:
可以看出,湖北省基本是处于一家独大的地位,其销售额甚至是第二名浙江的四倍之多,甚至是其他省数十背,可见湖北人民对于淘宝上的美食非常感兴趣,可谓是‘吃货’最多的一个省了。
销售额超过三百万的省份有湖北、浙江、上海、四川、广西、福建、江苏、湖南,中国的淘宝美食销售基本就集中在这些地区。
最后:
对各商品title进行文本分析,观察各种的美食关键词的出现频率,商品标题进行词频分析及可视化,使用jieba库以及一个中文常用停用词的文件用来排除一些无意义的常见词(例如:的、了之类的词)。
import jieba
from collections import Counter
stopwords = [line.strip() for line in open(r"中文停用词.txt", 'r', encoding='utf-8').readlines()]
word=Counter(jieba.cut_for_search(",".join(data['title'].values)))
new_word={}
for i,j in word.items():
if i not in stopwords:
new_word[i]=j
word=Counter(new_word)
零食、小吃和特产这三个关键词排名前三,这表面消费者在淘宝网进行购买美食是大部分的需求是当作零食来食用,而不是当做正餐进行食用,淘宝卖家应重点关注零食市场。人们的需求集中在便捷和速食上,因此可以方便食用的早餐也是一大可以挖掘的市场。