之前写过一篇「不用写代码,30 秒抓取李笑来所有微博」,链接:https://www.jianshu.com/p/bfeb13908571,介绍了如何使用webscraper抓取新浪微博,有同学在操作的过程中遇到一些问题,其中有一些常见问题,我将其总结如下,希望可以对大家有一点帮助。
可能有朋友不知道webscraper,我再介绍一下:webscraper 一一款谷歌插件,可以方便的抓取网页上的内容:文字、链接、图片、表格等,而无需写一行代码。
webscraper有如下优点——
- 免费
- 不受操作系统限制,只要安装Chrome浏览器即可运行
- 操作简单,易上手。(很多没有技术背景的同学,都可以快速学会)
- 功能强大:不仅可以抓静态网页,对于js动态加载的数据,也很容易抓取
根据已经测试的经历,下列类型网站均可抓取——
- 58同城、大众点评、美团、链家等
- 微信公众号、简书、知乎、博客等
- 淘宝、阿里巴巴、网易严选等
可以在浏览器查看到的数据,95%均可抓取。
你可能会问,那剩下的5%是什么呢?—— 等你遇到再说吧,如果遇不到,那对你来说,就是100%了[微笑]
一、常见问题
1、下载了webscraper安装包,但是无法安装,怎么办?
如果你无法科学上网,可以从链接: https://pan.baidu.com/s/1eTn8up8 密码: jpqy下载webscraper安装包。
下载好以后,将此安装包,拖到chrome://extensions/页面,按照提示安装即可。
提示:!!下载好的安装包,不能直接双击安装
2、webscraper安装好后,打开没有看到工作界面,怎么办?
有的同学,webscraper安装成功,然后在浏览器点击 “右键” ----> “检查”后,出现如下界面。
红框处,没有出现webscraper的入口。
解决方案:将开发者工具,调试成 底部 模式,操作步骤如下图——
调成“底部”模式后,就正常了,如下图——
3、第一个例子,抓取知乎张佳玮的文章列表,为什么结果顺序和网站不一样?
webscraper抓取数据的结果,默认是无序。若是想要结果变的有序,需要安装CouchDB,这点在第三次分享中有讲到。
4、知乎张佳玮的文章总共有30多页,几百条数据,为什么我只抓到了20条?
因为你抓取的是单页数据,所以只有20条。
如何抓取多页,在第二次分享中有讲到。
5、数据下载到本地后,用excel打开后为什么是乱码?
这是由于你excel的编码问题,解决方案:百度“excel打开乱码”,有很多方法。
6、我想抓取多条记录,但为什么结果只有一条?
你没有勾选Multiple。
7、data preview的时候有多条数据,但实际为什么只抓到几条?
你可能忘记设置 delay 了,或者需要将 delay 增大一点,这点你需要根据自己的网络状况调整一下。
8、data preview的时候有数据,但scrape的时候却没有结果?
3种可能情况——
1)你选中了网页元素,但是没有点击“Done selecting",也就是没有完成最后一步,正确选中网页元素后,在Selector最右边,会出现一段「代码」,有了这段「代码」才代表选中元素完成。
2)选择器没选对,这个就比较复杂了,需要根据实际情况分析
3)网站有反爬虫,所以无法实际抓取
9、抓取图片时,开始抓取后,就不工作了,一直卡在那里
2种可能情况——
1)网络问题:关闭这个弹出窗口,重新抓取
2)下载的图片数量太大,浏览器卡死、崩溃
提示:webscraper 不适合下载大量图片;
百度搜索图片、搜狗搜索图片都有反爬,不能下载。
10、想选中某个元素,但一点击就会跳转,怎么解决?
跳转问题,第三次分享有讲到。如果着急,可以自己摸索一下,点击下图这个 enable key,然后出现 spc 键,将鼠标移动到你要点击的地方,按下 s 键
11、抓取的内容除了excel,可以导出为其他格式吗?
不可以,webscraper暂时只支持导出excel
12、有时候点击 create sitemap按钮没反应,怎么回事?
这种情况一般出现在,安装并启用 CouchDB 后。
解决方法:打开 CouchDB,重启浏览器。
原理:创建 sitemap,本质就是将 sitemap name 和 start url 这两条数据存储到磁盘上,但现在存储不了,说明你和磁盘中间的存储过程出现问题。
而你现在用的是 CouchDB 存储数据,说明 CouchDB 这一步有问题,而 CouchDB 数据库一般不会出问题,所以问题就是你没有打开 CouchDB,需要手动打开 CouchDB。
CouchDB 是一个基于 js 的数据库,需要和浏览器交互,所以你需要让浏览器知道,你打开了 CouchDB,所以这时候,如果创建 sitemap 还不成功,就需要重启浏览器,让它知道,哦,现在 CouchDB 已经启动了,我可以用它了。
13、为什么我的excel里面部分列内容和教程里的不一样?
大家安装的 webscraper 方式不同,版本也可能不同。所以结果显示可能有所差别,但是差别肯定不会影响到真实数据。
可能就是多了一列 web-scraper-start-url,或者少了这一列。或者其他。这些都不是大问题。
大家自己根据实际情况,不要觉得和教程里面的结果不一样,就觉得自己的数据有问题。
遇到不一样的地方,不要着急,先查看哪里不一样,然后分析下不同之处的意义。
如果不同之处只是一些 “通识” 性的信息,比如 start URL、或者页码数、或者其他,而自己需要的数据抓取到了,就说明那些不同之处是软件自动附带的,可能为的是更清楚的表明数据的来源或者其他。
14、为什么抓取完成后,什么也没有,显示“No data scraped yet”?
最近几天,发现 webscraper 的一些细节功能发生了变化,原来是 12 月 22 日更新了新版本,有了一些新变化,具体细节如下:
1)抓取 image 的时候,“Download image” 这个选项消失了。如图一。
2)点击 “scrap" 以后的设置界面,原来的默认值有了变化,从 5000 变为 2000。如图二
3)抓取完毕后,不会直接显示数据,需要点击一个”refresh“这个按钮,如图三
4)抓取结果中,多了一列 “web-scraper-order”,暂时不清楚用途。如图四
我暂时只发现这些变化,但是这些变化都不影响我们的数据结果。大家可以忽略。
可能有的人的 webscraper 版本没有这些变化,那就忽略就行了。
image.png
15、抓取图片没有“Download image”选项,怎么办?
之前说过 webscraper 的最新版本去除了 “Download image" 选项,也就是批量下载图片的功能,最新版本现在只能抓取图片链接。
解决方案有 2 种——
1、批量抓取到图片的链接,然后使用迅雷等下载工具批量下载。
2、卸载掉最新的 webscraper,安装老版本,可以从这里下载,链接: 链接:百度网盘 请输入提取密码 密码: i7e9
老版本依然是有”Download image" 这个选项的。
注意不要科学上网,否则 webscraper 可能会自动更新到最新版本。
16、安装CouchDB后,http://127.0.0.1:5984/_utils/ 为什么打不开?
配置 couchDB 时 当在网页输入链接链接:http://127.0.0.1:5984/_utils/ 时,如果发生网页崩溃或打不开要求界面时,只需打开下载的文件 couchdb-2.1.1
如果安装过程出现下面图片错误,说明你的系统版本和软件版本不兼容。 你需要下载 32 位的版本, 链接:链接:百度网盘 请输入提取密码 密码: apet 下载安装成功后,需要打开 CouchDB 软件。 嗯,是的软件安装好,还要 “打开”。之前遇到很多朋友,没有打开 CouchDB。之后访问链接:链接:http://127.0.0.1:5984/_utils/ 才会正常。
17、数据抓取下来了,但是错位,怎么回事?
数据错位,是因为你没有创建子选择器。
你应该新建一个Element作为父选择器,把要抓取的信息,作为子选择器。这样抓取的信息就不会错位。
二、抓取网站的思路
1、如果要抓取的数据有多页,我该用哪个分页方式?
抓取多页数据,翻页方式按照以下优先级:
1)规律分页:首先分析url是否规律
如果有规律——使用规律分页
如果没有规律,看第2条——
2)如果是js动态加载,继续分析是哪一种:
如果是「下拉加载更多」方式,则使用Element scroll down。
如果是「点击加载更多」方式,则使用Element click,Click type选择「click more」,Click element uniqueness选择「unique CSS Selector」。
其余情况看第3条——
3)如果点击翻页按钮时,网页的 url没有变化,或者 url只有#后面的部分发生变化,比如:https://weibo.com/5745019302/DCC6EAQdO?type=comment#_rnd1519785953991
那么这时候,使用Element click,Click type选择「click once」,Click element uniqueness选择「unique Text」。
4)如果以上方式都不属于你遇到的翻页方式,则使用最后一种「循环翻页」,适用类型:页面的翻页按钮本身就是一个url,这个url指向按钮所示的那页。
具体原理及方法在第三次分享里有讲到。
我也总结了一个sitemap,大家可以复用一下:
分享一个抓取百度搜索关键字,所有结果的标题和详情页链接的 sitemap。 嗯,是所有页面,你搜到多少页,就抓多少页。这是个无限循环的抓取。 不过有个小 bug,就是他会在最后两页的时候,来回重复抓。也就是前面所有页抓完后,重复的抓最后两页,建议你到最后的时候,手动中断程序,然后导出数据。
'''
{"_id":"baidu","startUrl":" 链接:https://www.baidu.com/s?wd=%E6%AF%94%E7%89%B9%E5%B8%81&pn=0&oq=%E6%AF%94%E7%89%B9%E5%B8%81&tn=baiduhome_pg&ie=utf-8&usm=3&rsv_idx=2&rsv_pq=c789a61d0005f45c&rsv_t=1cd9H90S6andIWLAmJXh9Q7QV8IK940mPN%2B7Fyi4G6aHwXrxXQOwM%2Bns3%2FGsE4oUOjlH","selectors":[{"parentSelectors":["_root","pagination"],"type":"SelectorElement","multiple":true,"id":"total","selector":"h3.t a","delay":"2000"},{"parentSelectors":["total"],"type":"SelectorText","multiple":false,"id":"title","selector":"parent","regex":"","delay":""},{"parentSelectors":["total"],"type":"SelectorLink","multiple":false,"id":"detail","selector":"parent","delay":""},{"parentSelectors":["_root","pagination"],"type":"SelectorLink","multiple":true,"id":"pagination","selector":"div#page a","delay":"2000"}]}
'''
如何应用到自己想要搜索的目标呢? 很简单,直接百度搜索关键字,将第一页的 url 作为 start url 替换掉我的即可。
2、选择器可以联合使用吗?
可以,而且一般情况下,经常需要多个选择器一起使用,才能达到更好的效果。
两种方式——
串联
比如
- Element ——> Text(link)(Element)
- Element scroll down ——> Text(link)(Element)
- Element click ——> Text(link)(Element)
并联
Element Click 和 Element scroll down
下面是案例: 抓取简书首页所有文章标题(当然你也可以抓链接,抓评论数,点赞数,我只是选一个简单的说明一下方法)。
目标网站:链接:简书 - 创作你的创作
先说说这个网站抓取的难点:
1、进入网站后,会显示一部分文章。
2、如果需要查看更多文章,则需要向下滑动鼠标。
3、滑动鼠标显示更多文章后,会出现一个 “阅读更多” 的按钮。如图 1. 这时候滑动鼠标就没用了,需要点击 “阅读更多” 按钮才能查看更多文章。
再说说用 webscraper 抓取的方法: Element scroll down + Element Click + Text 。
可以看到,抓取这个网站的标题,需要套用多个选择器。而且其中有两个配置项较多的 Element 选择器。
下面是 sitemap(两个 3 引号之间):
'''
{"_id":"aaa","startUrl":[" 链接:简书 - 创作你的创作],"selectors":[{"id":"aaa","type":"SelectorElementScroll","selector":"a.title","parentSelectors":["_root"],"multiple":true,"delay":"5000"},{"id":"ccc","type":"SelectorElementClick","selector":"a.title","parentSelectors":["_root"],"multiple":true,"delay":"5000","clickElementSelector":"a.load-more","clickType":"clickMore","discardInitialElements":false,"clickElementUniquenessType":"uniqueCSSSelector"},{"id":"fff","type":"SelectorText","selector":"parent","parentSelectors":["ccc"],"multiple":false,"regex":"","delay":0}]}
'''
selector 树如图二。
aaa:Element scroll down
bbb:Element Click
ccc:Text
大家从 selector 树可以看到,aaa 是个 Element 选择器,但是却没有子选择器。 是的,这里是这个案例的一个特殊的地方。Element scroll down(aaa)选择器不是为了抓取数据,而是为了辅助显示数据。因为这个网站一开始需要 “滑动鼠标” 才能显示更多。
真正抓取数据的是 Element Click(bbb) 选择器下的 ccc 选择器。
这里的 aaa 和 bbb 是并列的,因为测试中发现,Element Click 和 Element scroll down 串联的话,始终无法抓取到数据,因为这两个选择器串联的话,哪个在前,哪个在后,该选多大区域,实在不好选。大家可以下去试试。
总结,以后遇到这类网站:需要加载更多,和 “点击加载更多” 两种结合的网站。可以使用这种方法。
使用 Element scroll down 辅助显示数据,不创建子选择器。
使用 Element Click 抓取数据,建立 Text 或者选择器。
以上,就是一些经常遇到的问题,如果大家还有什么疑惑,可以留言,我会逐一回答。如果问题比较典型,我会单独整理成文,发布出来。
网友评论
针对这个问题,在练习知乎的爬虫。点击了refresh还是不行。但是在选择数据预览的时候却能够预览到。请问大神这是什么原因呢?
1、你的delay设置太短
2、可能这个网页不止scroll down,还有点击加载更多结合,你没有注意看
数据不完整,有的为空,有的有,我猜你应该用的是没有用Element,所以字段错开了,让你以为是空。
如果不能都选中,说明程序员没有给三个类型一个父类型,那就只能一个类型一个类型抓了。抓三次。
不过一般都有的,没有的话,只能说这个网站的前端程序员不合格。
Ps: 你先试试,有问题加我微信 mingbai62
https://t.zsxq.com/vzzVrne