比如京东的商品列表页,列表中的价格和评论都是通过jsonp获取,再渲染出来的。而用 nodecrawler 只能爬取最原始的页面,请问如何才能等页面的js执行完毕后才返回html? 先谢谢各位大佬的提议。
回复 (30)
J
@pengliheng 好的,我也是这么做的。然后在我国外的服务器,只需2s就下载好了。。。。万恶的高墙。 自豪地采用 CNodeJS ionic
J
A
引用 JZLeung@atian25 我只是个业余的,集群什么的都不懂。现在正在研究puppeteer 但是扔上服务器后(阿里的装不上chromium,扔的国外)动不动就30s超时。醉了。
@JZLeung 说明你的服务器跟你要抓取的网站之间的访问速度太慢了....
J
引用 atian25@JZLeung puppeteer 只是一个 headless 的 chromium 浏览器而已,Google 官方出来的,所以之前的 phantomjs,casperjs,nightmar...
@atian25 我只是个业余的,集群什么的都不懂。现在正在研究puppeteer 但是扔上服务器后(阿里的装不上chromium,扔的国外)动不动就30s超时。醉了。
A
引用 JZLeung@atian25 @JasonBoy 这个 puppeteer 的速度如何?能不能在几分钟内爬完100个页面?
@JZLeung puppeteer 只是一个 headless 的 chromium 浏览器而已,Google 官方出来的,所以之前的 phantomjs,casperjs,nightmare 就结束了历史使命了。
抓取速度只看你网速,反正一般爬虫你都是搞集群的,所以 puppeteer 的启动速度可以忽略不计(比起其他几个,它的启动速度已经是最快的了)。
还是要看你的具体业务场景,简单的那种还是直接 curl 快,需要执行 js 的,非 puppeteer 莫属。
K
J
引用 sodawy方向1 headless类 工具:puppeteer(推荐), phantomjs(基本已经不会再更新) 场景:如果对抓取不熟悉,或者页面js做了太多事情,接口响应和你最终要的东西相差很多时。...
@soda-wy 好的,感谢这么详细的解答。我试试两种的效率。
J
引用 Kevinzhang29@JZLeung 我爬携程酒店就是这样的,虽然麻烦 但是你爬了id什么的之后 建立自己的数据库 接下来只要爬就行了。
@Kevinzhang29 那你是先爬完所有的id再去更新各个id的数据还是爬一些更新一些这样呢?
S
方向1 headless类
- 工具:puppeteer(推荐), phantomjs(基本已经不会再更新)
- 场景:如果对抓取不熟悉,或者页面js做了太多事情,接口响应和你最终要的东西相差很多时。
- 优点:省心,前端开发熟悉的套路。headless类的帮你模拟出浏览器的加载过程,你自己拿渲染生成好的数据就可以了。
- 缺点:可定制化低-> 易被防抓; 性能差
方向2 抓接口
- 工具:你熟悉语言的httpRequest库
- 场景:熟悉抓取,你能分析出你要的数据来自那些接口以及接口的前后逻辑;性能要求高
- 优点:可定制化高,请求你想发成啥样都可以;性能好
- 缺点:对开发者分析能力和动手能力要求高
至于性能相差多少,可以理解成进程级别和请求级别,这要看具体抓取目标环境和你的具体实现了。
如果楼主还是一脸懵的话,建议你甭管用啥,先run起来,渐渐就有感觉了
K
引用 JZLeung@Kevinzhang29 有jsonp的url但是还是需要先爬取需要的sku的id。
@JZLeung 我爬携程酒店就是这样的,虽然麻烦 但是你爬了id什么的之后 建立自己的数据库 接下来只要爬就行了。
J
@pengliheng 能说下思路吗?谢谢。
J
J
J
引用 ianchn这个问题无数的人已经总结无数次。请百度
@ianchn 百度的结果,基本都是要不Python(可是我不会),要不就是phantomjs(太慢了,因为有几十个页面,每个页面又有几十个请求)
J
J
引用 JsonSong89一般来说,常见的就是容器和找接口。 不过如果对稳定性没有太高的要求,其实还有一个方案,直接控制台或者暴力猴,通过jquery 和 cors 把数据提交给服务器。
@178220709 这个肯定不行的。。。。因为要实时爬取。
A
puppeteer: 我不管你是不是动态页面,只要你是web,撸起袖子就是干
A
puppeteer 不解释
K
用谷歌network 可以看到接口url,直接爬接口 然后整理数据就行
S
用scrapy+selenium,很轻松
W
既然有接口,直接调接口拿数据就好了呀
J
一般来说,常见的就是容器和找接口。 不过如果对稳定性没有太高的要求,其实还有一个方案,直接控制台或者暴力猴,通过jquery 和 cors 把数据提交给服务器。
G
selenium phantomjs nightmare 都可以
J
Z
这不是更好吗?页面都不用爬了,直接调取它接口
O
J
引用 oyoscphantomjs模拟请求,不过速度很慢.如果对速度有要求的话比如可以对京东抓包,找出接口,然后再用正则匹配来截取jsonp里想要的数据
@oyosc 有接口,但是有很多个,一页所有商品需要访问3个接口各3次。 自豪地采用 CNodeJS ionic
O
phantomjs模拟请求,不过速度很慢.如果对速度有要求的话比如可以对京东抓包,找出接口,然后再用正则匹配来截取jsonp里想要的数据
参与回复
登录后即可参与回复。登录