简介

最近想了解一下机械键盘,因此使用scrapy抓取了京东机械键盘
并使用python根据店铺名和评论量进行图片分析。

分析

在写爬虫前,我们需要先分析下京东机械键盘的是怎么访问的。
1.进入京东,搜索机械键盘

#页面url
https://search.jd.com/Search?keyword=机械键盘&enc=utf-8&wq=机械键盘&pvid=fdac35af19ef4c7bbe23defb205b1b59

2.查看网页源代码

通过源代码发现,默认情况下只显示30条信息,但是在浏览器中向下滚动到30条以后,页面通过ajax会自动加载后30条信息,
通过开发者工具查看:

通过上图可发现,页面通过ajax异步加载的url:

#后30条
https://search.jd.com/s_new.php?keyword=机械键盘&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=机械键盘&page=2&s=27&scrolling=y&log_id=1517196404.59517&tpl=1_M&show_items=3378484,6218105,3204859,2629440,3491212,2991278,1832316,4103095,5028795,2694404,3034311,1543721098,3606368,1792545,4911552,10494209225,2818591,2155852,1882111,3491218,584773,2942614,4285176,4873773,4106737,3204891,1495945,5259880,12039586866,3093295

注意:
url中的”page=2”
url中的show_items值为源代码中前30条信息的”data-sku”

待ajax异步加载后30条内容后,此页的全部内容则全部加载完毕。

3.分析翻页
点击第二页查看url

#第二页,前30条
https://search.jd.com/Search?keyword=机械键盘&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=机械键盘&page=3&s=57&click=0
#第二页,后30条
https://search.jd.com/s_new.php?keyword=机械键盘&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=机械键盘&page=4&s=84&scrolling=y&log_id=1517225828.64245&tpl=1_M&show_items=14689611523,1365181,3890366,3086129,5455802,4237668,3931658,3491228,1654797409,2361918,5442762,4237678,5225170,4960228,4237662,3931616,3491188,5009394,10151123711,4838698,4911578,1543721097,3093301,4838762,1836476,5910288,1135833,4277018,5028785,1324969

点击第三页查看url

#第三页,前30条
https://search.jd.com/Search?keyword=机械键盘&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=机械键盘&page=5&s=110&click=0
#第三页,后30条
https://search.jd.com/s_new.php?keyword=机械键盘&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=机械键盘&page=6&s=137&scrolling=y&log_id=1517225931.50937&tpl=1_M&show_items=5965870,3093297,14758401114,4825074,1247140,4911566,3634890,3212216,2329142,5155156,5225170,1812788,613970,5391428,1836460,1771658520,1308971,2512327,15428123588,2512333,3176567,6039820,10048750474,3093303,3724961,338871,10235508261,2144773,1939376,1543721095

通过以上我们可以看到,page是按3、5奇数方式增长的,而ajax加载的后30条信息中page是按2、4、6偶数方式增长的。

通过以上,我们的爬虫方案也就有了,先爬取当前页的前30条item,然后获取data-sku,模拟ajax请求异步加载获取后30条item;当前页全部抓取完毕后,翻页俺上面的方式继续爬取,直至最后。

实现

1.定义item

vim items.py
#将评论量转化由字符串为float,并将万按单位计算,便于后续分析计算
def filter_comment(x):str = x.strip('+')if str[-1] == u'万':return float(str[:-1])*10000else:return float(str)class KeyboardItem(scrapy.Item):#店铺名shopname = scrapy.Field(input_processor=MapCompose(unicode.strip),output_processor=TakeFirst())#产品名band = scrapy.Field(output_processor=TakeFirst())#价格price = scrapy.Field(output_processor=TakeFirst())#评价量comment = scrapy.Field(input_processor=MapCompose(filter_comment),output_processor=TakeFirst())

其中:
filter_comment函数,是将评论量转化由字符串为float,并将万按单位计算,便于后续分析计算。因为评论量有的以万为单位,如1.5万。
MapCompose(unicode.strip),去掉空格
output_processor=TakeFirst(),获取shopname的第一个字段,否则我们获得的shopname、price、band、comment都为列表。

如果不经过已经处理,我们最终生成的json文件为一下:

[
{"comment": [1.2万+], "band": ["新盟游戏", "机械键盘"], "price": ["129.00"], "shopname": [罗技G官方旗舰店"]},
......
]

经过处理后

[
{"comment": 120000.0, "band": "新盟游戏", "price": "129.00", "shopname": 罗技G官方旗舰店"},
......
]

这种格式更方便我们通过python的pandas进行科学计算。

爬虫实现

1.编写爬虫

vim keyboard.py
# -*- coding: utf-8 -*-
#京东搜索机械键盘
import scrapy
from jingdong.items import KeyboardItem
from scrapy.loader import ItemLoaderclass KeyboardSpider(scrapy.Spider):name = 'keyboard'allowed_domains = ['jd.com']#start_urls = ['https://search.jd.com/Search?keyword=机械键盘&enc=utf-8&wq=机械键盘&pvid=361c7116408b4a10b5e769e3fd25bbbf']headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}def start_requests(self):#重写,增加headersyield scrapy.Request(url='https://search.jd.com/Search?keyword=机械键盘&enc=utf-8&wq=机械键盘&pvid=361c7116408b4a10b5e769e3fd25bbbf', meta={'pagenum':1}, headers=self.headers, callback=self.parse_first30)def parse_first30(self, response):#爬取前30条  pagenum = response.meta['pagenum']print '进入机械键盘第' + str(pagenum) + '页,显示前30条'for eachitem in response.xpath('//li[@class="gl-item"]'): load = ItemLoader(item=KeyboardItem(),selector=eachitem)info = load.nested_xpath('div')info.add_xpath('shopname', 'div[@class="p-shop"]/span/a/@title')info.add_xpath('band', 'div[@class="p-name p-name-type-2"]/a/em/text()')info.add_xpath('price', 'div[@class="p-price"]/strong/i/text()')info.add_xpath('comment', 'div[@class="p-commit"]/strong/a/text()')yield  load.load_item()#获取前30条记录的skuskulist = response.xpath('//li[@class="gl-item"]/@data-sku').extract()skustring = ','.join(skulist)#后30条为偶数页pagenum_more = pagenum*2baseurl = 'https://search.jd.com/s_new.php?keyword=机械键盘&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=机械键盘&&s=28&scrolling=y&log_id=1517052655.49883&tpl=1_M&' #ajax加载的后30条urlajaxurl = baseurl + 'page=' + str(pagenum_more) + '&show_items'+ skustring.encode('utf-8')yield scrapy.Request(ajaxurl, meta={'pagenum':pagenum},headers=self.headers, callback=self.parse_next30)def parse_next30(self, response):#爬取后30条pagenum = response.meta['pagenum']print '进入机械键盘第' + str(pagenum) + '页,显示后30条'for eachitem in response.xpath('//li[@class="gl-item"]'): load = ItemLoader(item=KeyboardItem(),selector=eachitem)info = load.nested_xpath('div')info.add_xpath('shopname', 'div[@class="p-shop"]/span/a/@title')info.add_xpath('band', 'div[@class="p-name p-name-type-2"]/a/em/text()')info.add_xpath('price', 'div[@class="p-price"]/strong/i/text()')info.add_xpath('comment', 'div[@class="p-commit"]/strong/a/text()')yield  load.load_item()#获取后30条记录的skuskulist = response.xpath('//li[@class="gl-item"]/@data-sku').extract()pagenum = pagenum+1#下一页的实际数字nextreal_num = pagenum*2-1#下一页urlnext_page = 'https://search.jd.com/Search?keyword=机械键盘&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=机械键盘&s=56&click=0&page=' + str(nextreal_num)yield scrapy.Request(next_page, meta={'pagenum':pagenum}, headers=self.headers, callback=self.parse_first30)

注意:我们将访问的第n页通过meta进行传递。例如:

第一页,pagenum=1,只显示前30条
pagenum_more = pagenum*2=2 ,ajax加载的后30条url中的page值
第二页nextreal_num = pagenum*2-1=3,下一页url中的page值

2.运行

scrapy crawl keyboard -o keyboard.json
[
{"comment": 120000.0, "band": "新盟游戏", "price": "129.00"},
{},
{},
{"comment": 15000.0, "band": "罗技(Logitech)G610 Cherry轴全尺寸背光", "price": "599.00", "shopname": "罗技G官方旗舰店"},
{"comment": 9900.0, "band": "ikbc c104 樱桃轴", "price": "389.00", "shopname": "ikbc京东自营旗舰店"},
{"comment": 11000.0, "band": "美商海盗船(USCorsair)Gaming系列 K70 LUX RGB 幻彩背光", "price": "1299.00", "shopname": "美商海盗船京东自营旗舰店"},
{"comment": 34000.0, "band": "达尔优(dareu)108键", "price": "199.00", "shopname": "达尔优京东自营旗舰店"},
{"comment": 74000.0, "band": "雷柏(Rapoo) V700S合金版 混光", "price": "189.00", "shopname": "雷柏京东自营官方旗舰店"},
{"comment": 8100.0, "band": "罗技(Logitech)G610 Cherry轴全尺寸背光", "price": "599.00", "shopname": "罗技G官方旗舰店"},
{"comment": 26000.0, "band": "雷蛇(Razer)BlackWidow X 黑寡妇蜘蛛X幻彩版 悬浮式游戏", "price": "799.00", "shopname": "雷蛇RAZER京东自营旗舰店"},
{"comment": 74000.0, "band": "雷柏(Rapoo) V500PRO 混光", "price": "169.00", "shopname": "雷柏京东自营官方旗舰店"},
{"comment": 150000.0, "band": "前行者游戏背光发光牧马人", "price": "65.00", "shopname": "敏涛数码专营店"},
{"comment": 11000.0, "band": "樱桃(Cherry)MX-BOARD 2.0 G80-3800 游戏办", "price": "389.00"},
{"comment": 12000.0, "band": "美商海盗船(USCorsair)STRAFE 惩戒者 ", "price": "699.00", "shopname": "美商海盗船京东自营旗舰店"},
{"comment": 6700.0, "band": "罗技(Logitech)G413", "price": "449.00", "shopname": "罗技G官方旗舰店"},
{"comment": 120000.0, "band": "新盟游戏", "price": "89.00", "shopname": "敏涛数码专营店"},
{"comment": 26000.0, "band": "雷蛇(Razer)BlackWidow X 黑寡妇蜘蛛X 竞技版87键 悬浮式游戏", "price": "299.00", "shopname": "雷蛇RAZER京东自营旗舰店"},
{"comment": 110000.0, "band": "达尔优(dareu)108键", "price": "199.00", "shopname": "达尔优京东自营旗舰店"},
{"comment": 61000.0, "band": "狼蛛(AULA)F2008混光跑马 ", "price": "129.00", "shopname": "狼蛛外设京东自营官方旗舰店"},
.......
]

科学计算

通过scrapy爬取到数据后,我们使用python科学计算进行分析
店铺名的评论量并画图展示。

vim keyboard_analyse.py
#!/home/yanggd/miniconda2/envs/science/bin/python
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
import jsonfilename= 'keyboard.json'#从json文件生成DataFrame
with open(filename) as f:pop_data = json.load(f)
df =DataFrame(pop_data)group_shopname = df.groupby('shopname')
group =group_shopname.mean()
#print group#字体设置
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
#柱状图
group.plot(kind='bar')
plt.xlabel(u"店铺名")
plt.ylabel(u"评论量")
plt.show()#运行
python keyboard_analyse.py

scrapy爬虫之抓取京东机械键盘评论量并画图展示相关推荐

  1. scrapy爬虫之抓取《芳华》短评及词云展示

    简介 在scrapy爬虫之<琅琊榜2>话题title收集及词云展示 及scrapy爬虫之模拟登录豆瓣l 两篇博文中,我们分别实现了直接爬取内容及模拟登陆豆瓣,现在我们将这两个功能整合到一起 ...

  2. python爬取网店数据_Python爬虫实现抓取京东店铺信息及下载图片功能示例

    本文实例讲述了Python爬虫实现抓取京东店铺信息及下载图片功能.分享给大家供大家参考,具体如下: 这个是抓取信息的 from bs4 import BeautifulSoup import requ ...

  3. 爬虫初学——爬取京东商品的评论(一)

    最近,初学了一些爬虫的知识,然后刚好被老师要求去爬取一些评论数据(淘宝.京东等),来进行深度学习识别虚假评论.然后咋办咧,东搜搜西搜搜,看有没有什么好的办法.毕竟之前可是被反爬机制很强的网站弄得毫无头 ...

  4. 【京东】抓取京东详情、评论_8.17

    一.确定需求 抓取京东详情页上的图书(打开搜索页面,输入出版社,点击按销量排.只看有货) 确定抓取元素:(共12个) ID / 书名 / 价格 / 作者 / 出版日期 / 出版社 / 总评论数 / 书 ...

  5. Scrapy 爬虫实例 抓取豆瓣小组信息并保存到mongodb中

    这个框架关注了很久,但是直到最近空了才仔细的看了下 这里我用的是scrapy0.24版本 先来个成品好感受这个框架带来的便捷性,等这段时间慢慢整理下思绪再把最近学到的关于此框架的知识一一更新到博客来. ...

  6. Scrapy爬虫轻松抓取网站数据

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也 ...

  7. Scrapy爬虫:抓取大量斗图网站最新表情图片

    一:目标 第一次使用Scrapy框架遇到很多坑,坚持去搜索,修改代码就可以解决问题.这次爬取的是一个斗图网站的最新表情图片www.doutula.com/photo/list,练习使用Scrapy框架 ...

  8. Scrapy爬虫框架抓取网易新闻

    @scrapy 环境安装 Windows scrapy的安装需要5个依赖库,先安装好这5个依赖库,然后在dos命令中利用pip install安装scrapy框架即可,首先要确保python的目录是添 ...

  9. scrapy爬虫循环抓取同一个url,避免同一URL使爬虫关闭

    主要方法是: def param_main(self, response):all_item_css = response.css("div.item")# 各种操作...yiel ...

最新文章

  1. 异步社区本周半价电子书
  2. 认识计算机系统反思,《认识计算机系统》教学反思
  3. android p获取通话记录_HBuilder 获取通话记录 (Android)
  4. springboot的IOC依赖注入与控制反转-举例(转载+自己整理)
  5. SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件
  6. BDD(行为驱动开发)
  7. JavaScript数据结构——散列表(Hash table,也叫哈希表)
  8. cisco 密码重置
  9. Action类一般情况为何要继承ActionSupport
  10. C# 设定TextBox 只能输入正数/负数/小数 By KEYPRESS 事件
  11. button执行onclick函数_JavaScript 函数定义与调用
  12. Android手游3d模型导出,楚留香手游3D模型怎么提取 提取教程
  13. 计算机考研英语是英语一还是英语二,考研英语一是不是很难
  14. php或js获取word内容,js能读取word js读取word文档
  15. win10-yolov5环境搭建
  16. Simulink建模:一阶滤波模型
  17. python描述性统计离散型变量_数据的描述性统计(Python3 实现)
  18. 感觉黑客帝国的时代不远了
  19. 字典攻击是什么意思?底层原理是什么?
  20. 苹果电脑导出android文件怎么打开,爱思助手Mac版教程:如何把文件导出到移动硬盘?...

热门文章

  1. 麦克纳姆轮的运动原理
  2. 网上收集的爆笑笑话 汗一个
  3. 幽默的经济学原理~··其实经济学可以这样学
  4. 招才猫显示服务器开小差,网络罢工开小差?宽带自排障手册分分钟解决!
  5. 看精确召回率和f1得分
  6. fireworks 投影_使用Fireworks文章创建动画
  7. 基于opencv的场景文字识别
  8. 和平精英android怎么写符号,和平精英名字怎么加符号 取名打出特殊符号技巧
  9. 在vue3中使用vue-lgrid-layout
  10. 小波变换系数计算实例_小波分析经典案例