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

利用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好评度分析出商品的好坏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430010.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jquery事件绑定解绑机制源码分析

引子 为什么Jquery能实现不传回调函数也能解绑事件?如下: $("p").on("click",function(){alert("The paragraph was clicked."); });$("#box1").off("click"); 事件绑定解绑机制 调用on函数的时候…

微信小程序导航:免费视频+精品教程+DEMO集合(长期更新)

1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t14764346784612:简易教程:https://mp.weixin.qq.com/debug/wxadoc/dev/?t14764346775993:设计指南:https://mp.weixin.qq.com/debug/wxadoc/desig…

怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法

转载的文章,原文:电脑弹出USB设备时提示该设备正在使用中的解决方法-系统城​www.xitongcheng.com电脑弹出USB设备时提示该设备正在使用,虽然在正常显示时并没有程序在使用,但是确实会出现这种情况,实际上确…

js菜单自适应的实现

功能示意图 菜单自适应示意图如下: 对象A可以拖动,缩放。菜单跟随对象A拖动,位置优先级为下面、上面、右边、左边、中间。 实现思路 其实菜单放在上下左右中,都是它的left和top在变,我们只要依次计算菜单在下/上/右…

python转换为c代码_bash 转换为C代码

bash 转换为C代码,并编译为可执行文件[rootlocalhost ~]# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz[rootlocalhost ~]# tar xvfz shc-3.8.9.tgz[rootlocalhost ~]# cd shc-3.8.9[rootlocalhost shc-3.8.9]# gcc -c shc.c[rootlocalhost shc-3.8.9]# gcc…

promise简析

promise可以解决多个回调函数嵌套问题,将嵌套所表示的流程通过同步的代码更加清晰的表达出来。 promise的用法与使用配置文件很类似:启动异步函数,在then里面配置好异步函数成功或执行失败的回调函数,然后就可以去干别的事了。 …

python cookies过期_Python3中关于cookie的创建与保存

1.cookie的作用cookie 是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据,就像有些网站上的一些数据是需要登录后才能看得到,那么想抓取某个页面内容,就需要用到cookie来模拟登陆了。在用cookie模拟登陆的时候&…

GIS-004-Cesium版权信息隐藏

.cesium-widget-credits { display: none; } .cesium-viewer .cesium-widget-credits { display: none; }转载于:https://www.cnblogs.com/defineconst/p/5965531.html

webpaper网页出题语言

目的 方便编写web试题,直接使用几个简单的标签,就可以生成一份可以在web上使用,并且可以打印出来的题。 效果预览 考卷打印效果 生成考卷发送给学生,或打印出来线下考 答案卷打印效果: 通过点击”显示答案”生成答…

python教程很详细_Python编程入门教程:从入门到高级,非常详细

本文的资料和内容是我下载的,觉得非常有用,于是转过来大家瞧瞧:这里给初学Python的朋友提供一些建议和指导吧。大神请无视,俗话说:授人以鱼不如授人以渔。所以我这里只是阐述学习过程,并不会直接详细写某个…

NOIP复习资料——往年习题精选

一、计算机系统 1.在以下各项中,()不是CPU的组成部分。(NOIP2007) A.控制器B.运算器C.寄存器D.主板 【答案】D。CPU由控制器、运算器和寄存器组成。 2.在下列各项中…

【笔记】js重写

js重写,以localstorage为例: var originalSetItem localStorage.setItem; localStorage.setItem function(){// 这里做一些额外的事...//继续调用原来的方法originalSetItem.apply(this, arguments); } 代码引自:这里

(中英)作文 —— 标题与小标题

一个押韵的标题,会十分讨巧; 当世界年轻的时候, 当中国年轻的时候,当世界衰老的时候;1. 英文 A year of no significance. An animal of no significance.2. 名著的变形 双城记:A tale of Two cities Tales…

table 表格点击当前行按钮隐藏当前的另一个按钮_Excel表格为什么那么慢已经应该如何解决(四)一类特殊的函数易变函数(volatile function)...

我们,让Excel变简单今天我们把主题聚焦在一类特殊函数造成的问题上——volatile function。这一类函数有人把他们翻译成“易变函数”,其实挺贴切的。本系列其他文章:Excel表格为什么那么慢已经应该如何解决(一)概述Excel表格为什么那么慢已经…

h5 storage事件监听

分析 引用《h5移动web开发指南》上的话: “当同源页面的某个页面修改了localStorage,其余的同源页面只要注册了storage事件,就会触发” 所以,localStorage的例子运行需要如下条件: 同一浏览器打开了两个同源页面其中一个网页修…

python工作台_FreeCAD二次开发-创建Python工作台,添加菜单栏和工具条,FreeCAD命令

FreeCAD作为一款基于OpenCasCAD内核的开源CAD软件,可以在GitHub上下载源代码。阅读源代码,有助于我们学习CAD软件架构,了解底层几何算法。由博主Caesar卢尚宇自学整理(纯粹出于对三维CAD软件开发的热爱)内容出自FreeCAD官方社区https://wiki.…

3d照片环效果(修改版--添加了x轴y轴双向转动和修复模糊度的bug)

今天用用前两天总结的css3新效果写了一个3d照片环的效果&#xff0c;其中还有些bug大家可以看一看&#xff0c;一起改进。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><sty…

h5离线应用

h5离线应用 所谓离线应用&#xff0c;就是断网之后还可以运行的应用。h5提供了application cache&#xff0c;可以保存网页的离线数据。CSDN的Markdown编辑器就运用了application cache&#xff0c;在没有网络的情况下&#xff0c;一样可以正常使用&#xff0c;这就是一个很好…

[deviceone开发]-do_RichLabel的简单示例

一、简介 do_RichLabel支持html格式的文本内容&#xff0c;但是只支持部分标签&#xff0c;这个示例列出了一些支持的常用标签&#xff0c;android能支持的标签相对ios更少 二、效果图 三、相关下载 https://github.com/do-project/code4do/tree/master/richlabel_demo 四、相关…

使用rpm包升级ntpd服务_服务器准备升级,小程序将暂停使用

今天说3件事情&#xff1a;一、由于用户增速超出了我们的预期&#xff0c;为确保法助攻小程序的使用体验&#xff0c;我们购买了更高配置的服务器&#xff0c;目前&#xff0c;内部测试已完成&#xff0c;现决定对服务器进行正式升级。服务器升级时间&#xff1a;8月7日(本周五…