利用splash爬取京东商品信息

一、环境

window7

python3.5

pycharm

scrapy

scrapy-splash

MySQL

二、简介

为了体验scrapy-splash 的动态网页渲染效果,特地编写了利用splash爬取京东商品信息的爬虫,当然站在爬取效率和稳定性方面来说,动态网页爬取首先应该考虑的还是动态页面逆向分析。

三、环境搭建

这里只介绍splash在window7上的搭建方法:

Splash是一个利用webkit或者基于webkit库 Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。官方文档解释是必须使用Docker容器!之所以用容器技术,好处是你可以一坨的安装好splash,而不必一点一点的去为安装splash填坑。

在网上的教程中,大多数是建议利用linux来安装docker,原因如下图:

docker使用go语言开发,并且运行在linux系统下,而如果想用window运行,只能在window基础上先运行一个linux虚拟机,然后再在这个linux虚拟机下运行docker。

由于我使用的是window7系统,只能到官网(https://docs.docker.com/toolbox/toolbox_install_windows/)下载DockerToolbox,下载完成后,双击安装(安装过程自行百度);

安装完成后会有三个快捷键:

    点击启动Docker Quickstart Terminal

输入安装splash的命令:$docker pull scrapinghub/splash

运行命令:$docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash  ,开启8050连接端口和5023监控端口或者只开启8050端口。

最后在scrapy项目中安装scrapy-splash组件,在settings.py中添加#用来支持cache_args(可选),splash设置

SPIDER_MIDDLEWARES = {

#'e_commerce.middlewares.ECommerceSpiderMiddleware': 543,

'scrapy_splash.SplashDeduplicateArgsMiddleware' : 100 ,

}

DOWNLOADER_MIDDLEWARES = {

#'e_commerce.middlewares.ECommerceDownloaderMiddleware': 543,

'scrapy_splash.SplashCookiesMiddleware' : 723 ,

'scrapy_splash.SplashMiddleware' : 725 ,

'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware' : 810 ,

}

#设置去重过滤器

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

SPLASH_URL = 'http://192.168.99.100:8050'

环境配置完成。

四、京东网页分析与爬虫编程实现

此次主要爬取京东商品的以下参数:

product:商品名

product_url : 商品链接

initial_price : 原价

price : 实际价格

shop : 店家

tags : 优惠活动

comment_nums : 累计评论数

summary_order : 京东排名

praise : 好评度

爬取京东商品信息首先得有商品信息入口,以商品书籍python(关键字)为例,url:https://search.jd.com/Search?keyword=python&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=python&page=159&s=4732&click=0

简化为:https://search.jd.com/Search?keyword=python&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=python&page=1

查看多页发现url里的几个重要关键字:

keyword:搜索关键字

wq:搜索关键字

page:页数(呈奇数递增)

故可以构建请求url:https://search.jd.com/Search?keyword={1}&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq={1}&page={0}

分析网页源码发现各商品信息:

通过css或XPath很容易就可以提取出商品信息,不过发现这里并没有我们想要的所有信息,故还得找出每个商品的url。

这里存在的一个问题是京东一页的商品是分批显示的,通过F12分析网络里的XHR就会发现,新加载的商品是通过向服务器发送请求url:https://search.jd.com/s_new.php?keyword=python&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=python&page=160&s=4762&scrolling=y&log_id=1530076904.20294&tpl=2_M&show_items=28950919364,12082834672,28883808237,29290652302,29291203091,27895583715,29089172884,28884416666,28938172051,28938903145,26066239470,29090468719,29094523735,28949599627,29291004039,28041915738,26232273814,26400554950,28494562293,29361448498,26291836439,19942582293,15348519021,19580125836,29251686387,27859110321,27880583607,29185119165,28738281855,29184203799

重要关键字page是在原来的基础上加1,直接对该url进行模拟浏览器请求应该是会简便很多,但现在我们不讨论这种逆向分析方法,我们这里采用的是splash中的execute 端点对动态网页进行渲染,就是执行一条javascript语句模拟浏览器跳转到页面下方位置,从而达到完全加载商品的目的。

请求方法:

商品的url可以在这里提取到:

构造每个商品url请求:https:// + url,当对该url进行请求时发现商品的价格、优惠信息、图书排名等需要的信息都没有提取出,分析发现需要进行动态渲染才能得到,所以我们这里采用splash的render.html端点对该url网页进行渲染,请求方法:

此时再去提取相应的信息,提取成功。

但最后还是有一项参数没能成功提取,那就是好评率,躲在这里:

在浏览器中需要点击【商品评价】才能看到,分析网页源码发现该信息也是在点击【商品评价】后向服务器发送请求

请求url:https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv1516&productId=12186192&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

可简化为:https://sclub.jd.com/comment/productPageComments.action?&productId=12186192&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

构造请求url:https://sclub.jd.com/comment/productPageComments.action?&productId={0}&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1

只要传入product_id便可以通过该url请求获得需要的好评度

当然也可以继续提取商品的评论或者是评论情况,这里我觉得好评度已经能说明该商品的好坏了,当然还得结合评论数来做出判断。

关键代码:def crawl_commentInfo(self , response):

total_product_info = response.css('.gl-item')

for product_info in total_product_info:

product_url = 'https:' + product_info.css('.gl-i-wrap .p-img a::attr(href)').extract_first()

#comment_info crawl firstly

headers = self.headers.copy()

headers.update({

'Referer' : 'https://item.jd.com/12330816.html' ,

'Host': 'sclub.jd.com',

})

match_obj = re.match('.*/(d+).html', product_url)

if match_obj:

product_id = match_obj.group(1)

yield scrapy.Request(self.start_urls[1].format(product_id) , headers = headers ,

meta= {'product_url' : product_url} , callback= self.parse_product)

print('Now crawl commentInfo url is' , self.start_urls[1].format(product_id))

# break

match_obj = re.match('.*page=(d+)$', response.url)

if match_obj:

page_num = int(match_obj.group(1)) + 2

else:

page_num = 3

if '下一页' in response.text:

yield SplashRequest(self.start_urls[0].format(page_num, 'python'), endpoint='execute',

callback=self.crawl_commentInfo , splash_headers= self.headers ,

args={'lua_source': self.lua_script, 'image' : 0 , 'wait': 1}, cache_args=['lua_source'])

print('Now page_url is :', self.start_urls[0].format(page_num, 'python'))def parse_product(self, response):

product_url = response.meta.get('product_url')

praise = 0

praise_match = re.match('.*"goodRateShow":(d+),.*' , response.text)

if praise_match:

praise = praise_match.group(1)

headers = self.headers.copy()

headers.update({

'Upgrade-Insecure-Requests': 1,

'Host' : 'item.jd.com' ,

})

yield SplashRequest(product_url, endpoint='render.html', splash_headers = headers,

args={'image' : 0, 'timeout' : 15 , 'wait' : 1 } , meta={'praise' : praise}

)

print('Now request url is:', product_url)

爬取结果:

爬取了京东关键字“python”的全部商品信息,一共五千多条,也可以切换其他关键字爬取任何商品,我们可以通过评论数comment_nums分析每个商品的销量情况(因为销量数量和评论数量是相对应的),也可以通过排名summary_order分析出商品的销量情况,通过praise好评度分析出商品的好坏。

go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...相关推荐

  1. layui获取input信息_python爬虫—用selenium爬取京东商品信息

    python爬虫--用selenium爬取京东商品信息 1.先附上效果图(我偷懒只爬了4页) 2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Hea ...

  2. python爬取京东商品信息代码_Python利用Xpath选择器爬取京东网商品信息

    HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树:XPath 使用路径表达式在 XML 文档中选取节点.节点是通过沿着路径或者 step ...

  3. 第七篇:爬虫实战— 3、自动登录123并且自动发送邮箱;自动爬取京东商品信息...

    selenium模块 阅读目录 一.介绍 二.安装 三.基本使用 四.选择器 五.等待元素被加载 六.元素交互操作 七.其他 八.练习 一.介绍 selenium最初是一个测试工具,而爬虫中使用它主要 ...

  4. python爬取商品信息_Python基于BeautifulSoup爬取京东商品信息

    今天小编利用美丽的汤来为大家演示一下如何实现京东商品信息的精准匹配~~ HTML文件其实就是由一组尖括号构成的标签组织起来的,每一对尖括号形式一个标签,标签之间存在上下关系,形成标签树:因此可以说Be ...

  5. Python爬取京东商品信息

    *使用Python爬取京东华为手机前十页的所有商品的链接.名称.价格.评价数以及店铺名称. 1.前期准备 (1)下载驱动 我使用的是谷歌浏览器,所以要下载谷歌驱动,用来告诉电脑在哪打开浏览器. 驱动文 ...

  6. python爬取天气数据山东_Python爬取天气预报数据,并存入到本地EXCEL中-Go语言中文社区...

    近期忙里偷闲,搞了几天python爬虫,基本可以实现常规网络数据的爬取,比如糗事百科.豆瓣影评.NBA数据.股票数据.天气预报等的爬取,整体过程其实比较简单,有一些HTML+CSS+DOM树等知识就很 ...

  7. python treeview底部加个按钮_Python爬取京东商品信息(GUI版本)

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:DYblog 转载:https://www.cnblogs.com/ ...

  8. python爬取京东商品属性_python爬虫小项目:爬取京东商品信息

    #爬取京东手机信息 import requests from bs4 import BeautifulSoup from selenium import webdriver import re imp ...

  9. python爬虫爬取京东商品评价_python爬取京东商品信息及评论

    ''' 爬取京东商品信息: 功能: 通过chromeDrive进行模拟访问需要爬取的京东商品详情页(https://item.jd.com/100003196609.html)并且程序支持多个页面爬取 ...

最新文章

  1. 四大运营商的5G部署路线一览
  2. 利用getchar()消除多余字符数据(主要是“回车”)
  3. 数梦工场联手阿里云 推出大数据一体机
  4. spring_有关Spring缓存性能的更多信息
  5. DNS 漏洞发现者 Dan Kaminsky 访谈录
  6. 范围for语句的整理
  7. Android之如何设置背景的透明度
  8. js实现excel块拖拉数据_Excel操作比Python更方便?常见数据操作Excel实现和Python实现的比较...
  9. bootstrap3 徽章_尔冬升送张大大金像奖女神徽章,全国仅14枚,网友吐槽:他不值得...
  10. 经典公司小型局域网服务器架设方案
  11. SQL SERVER IDENTITY 约束的用法
  12. Angular.js学习笔记(1)
  13. 产品经理面试题(面试经历)
  14. js下载activex
  15. Laravel单元测试
  16. C++异常处理的问题
  17. 情商 智商 逆商,哪个最重要?
  18. PCL点云滤波器总结
  19. 我在Python的艳阳里,大雪纷飞
  20. java-net-php-python-jspm服装类跨境电商库存控制计算机毕业设计程序

热门文章

  1. Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.21
  2. homebrew安装mysql
  3. nuxt route 全局管理 route.beforeEach 替代
  4. 数据库实验四 用户权限管理
  5. pytorch之with torch.no_grad
  6. 1002 写出这个数 (20分)
  7. 用c语言程序编写一份试卷,C语言程序设计试题
  8. ftp的本地用户搭建
  9. 读取html文件,让其中的内容和notepad打开这个html的样子一样。
  10. scikit-learn 学习笔记-- Generalized Linear Models (三)