Python 002- 爬虫爬取淘宝上耳机的信息
参照:https://mp.weixin.qq.com/s/gwzym3Za-qQAiEnVP2eYjQ
一般看源码就可以解决问题啦
#-*- coding:utf-8 -*-
import re
import time
import requests
import pandas as pd
from retrying import retry
from concurrent.futures import ThreadPoolExecutor start = time.clock() #计时-开始 #plist 为1-100页的URL的编号num
plist = []
for i in range(1,101):
#淘宝的页数都是以下面这种形式来结束的,所以使用44
#https://s.taobao.com/search?q=耳机&xxx&s=44
#https://s.taobao.com/search?q=耳机&xxx&s=88
j = 44*(i-1)
plist.append(j) listno = plist
datatmsp = pd.DataFrame(columns=[]) while True:
@retry(stop_max_attempt_number = 8) #设置最大重试次数
def network_programming(num):
#将耳机转换为汉字编码%E8%80%B3%E6%9C%BA
url='https://s.taobao.com/search?q=%E8%80%B3%E6%9C%BA&ssid=s5-e \
&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1 \
&ie=utf8&initiative_id=tbindexz_20170306&fs=1&filter_tianmao=tmall \
&sort=sale-desc&filter=reserve_price%5B50%2C%5D&bcoffset=0 \
&p4ppushleft=%2C44&s=' + str(num)
web = requests.get(url, headers=headers)
web.encoding = 'utf-8'
return web #多线程
def multithreading():
number = listno #每次爬取未爬取成功的页
event = [] with ThreadPoolExecutor(max_workers=10) as executor:
for result in executor.map(network_programming,
number, chunksize=10):
event.append(result)
return event #隐藏:修改headers参数
#因为淘宝可能会出现反爬虫,所以使用cookie,构建head是很有必要的。尽量把自己伪装成一个浏览器。
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) \
AppleWebKit/537.36(KHTML, like Gecko) \
Chrome/55.0.2883.87 Safari/537.36'} #多线程从json获取数据
listpg = []
event = multithreading()
for i in event:
json = re.findall('"auctions":(.*?),"recommendAuctions"', i.text)
if len(json):
table = pd.read_json(json[0])
datatmsp = pd.concat([datatmsp,table],axis=0,ignore_index=True) pg = re.findall('"pageNum":(.*?),"p4pbottom_up"',i.text)[0]
listpg.append(pg) #记入每一次爬取成功的页码 lists = []
for a in listpg:
b = 44*(int(a)-1)
lists.append(b) #将爬取成功的页码转为url中的num值 listn = listno #每次循环将爬取失败的数组清空
listno = [] #将本次爬取失败的页记入列表中 用于循环爬取
for p in listn:
if p not in lists:
listno.append(p) if len(listno) == 0: #当未爬取页数为0时 终止循环!
break datatmsp.to_excel('datatmsp1.xls', index=False) #导出数据为Excel end = time.clock() #计时-结束
print ("爬取完成 用时:", end - start,'s') '''
二、数据清洗、处理: (此步骤也可以在Excel中完成 再读入数据)
'''
datatmsp = pd.read_excel('datatmsp1.xls') #读取爬取的数据
#datatmsp.shape # 数据缺失值分析:
# 安装模块:pip3 install missingno
import missingno as msno
msno.bar(datatmsp.sample(len(datatmsp)),figsize=(10,4)) # 删除缺失值过半的列
half_count = len(datatmsp)/2
datatmsp = datatmsp.dropna(thresh = half_count, axis=1) # 删除重复行:
datatmsp = datatmsp.drop_duplicates() '''
说明:只取了 item_loc, raw_title, view_price, view_sales 这4列数据,
上面的item_loc, raw_title, view_price, view_sales 都是从网页源代码中获取的标签信息
主要对 标题、区域、价格、销量 进行分析,代码如下:
'''
# 取出这4列数据:
data = datatmsp[['item_loc','raw_title','view_price','view_sales']]
data.head() #默认查看前5行数据 # 对 item_loc 列的省份和城市 进行拆分 得出 province 和 city 两列:
# 生成province列:
# lambda表达式类似于一个没有声明的函数
data['province'] = data.item_loc.apply(lambda x: x.split()[0]) # 注:因直辖市的省份和城市相同 这里根据字符长度进行判断:
data['city'] = data.item_loc.apply(lambda x: x.split()[0] \
if len(x) < 4 else x.split()[1]) # 提取 view_sales 列中的数字,得到 sales 列:
#data['sales'] = data.view_sales.apply(lambda x: x.split('人')[0]) # 查看各列数据类型
data.dtypes # 将数据类型进行转换
#data['sales'] = data.sales.astype('int') list_col = ['province','city']
for i in list_col:
data[i] = data[i].astype('category') # 删除不用的列:
data = data.drop(['item_loc','view_sales'], axis=1) '''
三、数据挖掘与分析: 【1】. 对 raw_title 列标题进行文本分析:
使用结巴分词器,安装模块pip3 install jieba
'''
title = data.raw_title.values.tolist() #转为list # 对每个标题进行分词: 使用lcut函数
import jieba
title_s = []
for line in title:
title_cut = jieba.lcut(line)
title_s.append(title_cut) '''
对 title_s(list of list 格式)中的每个list的元素(str)进行过滤 剔除不需要的词语,
即 把停用词表stopwords中有的词语都剔除掉:
''' # 导入停用词表:
stopwords = pd.read_excel('stopwords.xlsx')
stopwords = stopwords.stopword.values.tolist() # 剔除停用词:
title_clean = []
for line in title_s:
line_clean = []
for word in line:
if word not in stopwords:
line_clean.append(word)
title_clean.append(line_clean) '''
因为下面要统计每个词语的个数,所以 为了准确性 这里对过滤后的数据 title_clean 中的每个list的元素进行去重,
即 每个标题被分割后的词语唯一。
'''
title_clean_dist = []
for line in title_clean:
line_dist = []
for word in line:
if word not in line_dist:
line_dist.append(word)
title_clean_dist.append(line_dist) # 将 title_clean_dist 转化为一个list: allwords_clean_dist
allwords_clean_dist = []
for line in title_clean_dist:
for word in line:
allwords_clean_dist.append(word) # 把列表 allwords_clean_dist 转为数据框:
df_allwords_clean_dist = pd.DataFrame({'allwords': allwords_clean_dist}) # 对过滤_去重的词语 进行分类汇总:
word_count = df_allwords_clean_dist.allwords.value_counts().reset_index()
word_count.columns = ['word','count'] #添加列名 '''
观察 word_count 表中的词语,发现jieba默认的词典 无法满足需求:
有的词语(如 可拆洗、不可拆洗等)却被cut,这里根据需求对词典加入新词
(也可以直接在词典dict.txt里面增删,然后载入修改过的dict.txt)
'''
add_words = pd.read_excel('add_words.xlsx') #导入整理好的待添加词语 # 添加词语:
for w in add_words.word:
jieba.add_word(w , freq=1000) #=======================================================================
# 注:再将上面的 分词_过滤_去重_汇总 等代码执行一遍,得到新的 word_count表
#======================================================================= #word_count.to_excel('word_count.xlsx', index=False) #导出数据 '''
词云可视化: 见下<图2>
安装模块 wordcloud
方法:pip3 install wordcloud
'''
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from scipy.misc import imread
plt.figure(figsize=(20,10)) pic = imread("shafa.png") #读取图片,自定义‘沙发’形状
w_c = WordCloud(font_path="semplice.ttf",background_color="white",
mask=pic, max_font_size=60, margin=1)
wc = w_c.fit_words({x[0]:x[1] for x in word_count.head(100).values}) plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
plt.show() '''
以上注释:
shafa.png 是透明背景图 将该图放在Python的项目路径下!
"./data/simhei.ttf" 设置字体
background_color 默认是黑色 这里设置成白色
head(100) 取前100个词进行可视化!
max_font_size 字体最大字号
interpolation='bilinear' 图优化
"off" 去除边框
''' '''
不同省份的商品数量分布:
'''
plt.figure(figsize=(8,4))
data.province.value_counts().plot(kind='bar',color='purple')
plt.xticks(rotation= 0)
plt.xlabel('省份')
plt.ylabel('数量')
plt.title('不同省份的商品数量分布')
plt.show()
得到的结果:
Python 002- 爬虫爬取淘宝上耳机的信息的更多相关文章
- 【Python3 爬虫】14_爬取淘宝上的手机图片
现在我们想要使用爬虫爬取淘宝上的手机图片,那么该如何爬取呢?该做些什么准备工作呢? 首先,我们需要分析网页,先看看网页有哪些规律 打开淘宝网站http://www.taobao.com/ 我们可以看到 ...
- 甜咸粽子党大战,Python爬取淘宝上的粽子数据并进行分析
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 爬虫 爬取淘宝数据,本次采用的方法是:Selenium控制Chrome浏览 ...
- 利用Python爬虫爬取淘宝商品做数据挖掘分析实战篇,超详细教程
项目内容 本案例选择>> 商品类目:沙发: 数量:共100页 4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 项目目的 1. 对商品标题进行文本分析 词云可视化 2. ...
- Python3爬虫爬取淘宝商品数据
这次的主要的目的是从淘宝的搜索页面获取商品的信息.其实分析页面找到信息很容易,页面信息的存放都是以静态的方式直接嵌套的页面上的,很容易找到.主要困难是将信息从HTML源码中剥离出来,数据和网页源码结合 ...
- Python网络爬虫 - 爬取中证网银行相关信息
最终版:07_中证网(Plus -Pro).py # coding=utf-8 import requests from bs4 import BeautifulSoup import io impo ...
- python爬虫学习(三):使用re库爬取"淘宝商品",并把结果写进txt文件
第二个例子是使用requests库+re库爬取淘宝搜索商品页面的商品信息 (1)分析网页源码 打开淘宝,输入关键字“python”,然后搜索,显示如下搜索结果 从url连接中可以得到搜索商品的关键字是 ...
- 使用Python爬取淘宝两千款套套
各位同学们,好久没写原创技术文章了,最近有些忙,所以进度很慢,给大家道个歉. 警告:本教程仅用作学习交流,请勿用作商业盈利,违者后果自负!如本文有侵犯任何组织集团公司的隐私或利益,请告知联系猪哥删除! ...
- Python 爬取淘宝商品数据挖掘分析实战
Python 爬取淘宝商品数据挖掘分析实战 项目内容 本案例选择>> 商品类目:沙发: 数量:共100页 4400个商品: 筛选条件:天猫.销量从高到低.价格500元以上. 爬取淘宝商品 ...
- python3编写网络爬虫16-使用selenium 爬取淘宝商品信息
一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...
随机推荐
- 【java基础 11】java集合框架学习
导读:本篇博客主要是从整体上了解java的集合框架,然后主要介绍几个自己在项目中用到的结构,比如说:hashtable.hashmap.hashset.arraylist等! 一.宏观预览 从宏观上看 ...
- 九度oj 题目1345:XXX定律之画X
题目描述: 给你一个n,然后让你输出F(n)规则是这样的,F(n)的输出结果是:F(n-1) F(n-1) F(n-1) F(n-1) F(n-1) F(1)的输出结果是 ...
- mysqli 封装
<?php //header header('content-type:text/html;charset=UTF-8'); class DB { //定义属性 private $host;// ...
- 【bzoj2597】[Wc2007]剪刀石头布 动态加边费用流
题目描述 在一些一对一游戏的比赛(如下棋.乒乓球和羽毛球的单打)中,我们经常会遇到A胜过B,B胜过C而C又胜过A的有趣情况,不妨形象的称之为剪刀石头布情况.有的时候,无聊的人们会津津乐道于统计有多少这 ...
- 干货 | Elasticsearch Nested类型深入详解
在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式,反映在ES中称为父子文档. 父子文档的实现,至少包含以下两种方式: 1)父子文档 父子文档在5.X版本中通过parent- ...
- CF dp 一句话解题
wyq说刚入门oi 或是遇到瓶颈的时候就刷DP吧,虽然觉得这么刷CF题有点浪费,但是还是挺爽的,按照solved排序做的,前面的题都挺水的(忘记记录了混蛋),就不写了,从5C开始写解题 CF5 C. ...
- ajax同步导致ajax上面的代码不执行?
js代码:环境:IE11要求:点击一个按钮后,页面xxx的地方立即显示"开始处理...",直到ajax处理结束后,xxx内容才更新为新的处理结果:点击事件执行代码如下:xxx.in ...
- hdu 4819 Mosaic 树套树 模板
The God of sheep decides to pixelate some pictures (i.e., change them into pictures with mosaic). He ...
- SpringBoot消失的Web.xml
Filter 过滤器作为web.xml中重要的一部分,有着相当高的出场率,SpringBoot会默认注册几个Filter ApplicationContextHeaderFilter Characte ...
- 【Git】Git 本地的撤销修改和删除操作
一:撤销操作 比如我现在在readme.txt文件里面增加一行 内容为555555555555,我们先通过命令查看如下: 在我未提交之前,我发现添加5555555555555内容有误,所以我得马上恢复 ...