如何批量抓取网页上的数据?

Product Daily 2020-10-18 12:18

当我们想做市场调研,统计一些淘宝店的月销量,几百个商品几十页,逐个记录要弄到时候?或者我们想把豆瓣这样的资料库抓取下来,分析一下热门电影的趋势、年份、评分人数,能怎么方便做到?


“爬虫”这个词应该多少听过,但网上一搜,Python 教程满天飞,一小时从入门到放弃。其实不一定要编写代码,Scraper 就是一种简易的方式,帮我们把网页上看到的内容批量保存下来。



下面以 Data Miner 这个 Chrome 插件为例来演示。好用 Scraper 工具还有很多,原理相通,选自己用得顺手的就好。






原理


一个前端网页,由 HTML、CSS、JS(JavaScript)组成,分别代表页面骨架和内容、外观长什么样子、操作交互时有什么功能。


Chrome 右键菜单点击“检查”,打开面板的“Elements”板块里,就是组成网页的 HTML、CSS 部分。试着改一改、删一删,就能很快理解。还可以使用面板左上角的“光标”来选择元素,看看这个元素是怎么被 HTML、CSS 描述的。



我们要抓取的是 HTML 部分。HTML 由一层层元素包裹组成,常见的有 <div> 元素、段落 <p> 元素、输入框 <input> 元素、图片 <img> 元素、超链接 <a> 元素等等。 


比如图中商品列表的第一个商品,标题是“中牌制服馆 水手巾配饰JK制服直条巾”,点击之后可以跳转详情页。它的 HTML 被描述为:

<a class="item-name J_TGoldData" href="//item.taobao.com/item.htm?id=18651001581">中牌制服馆 水手巾配饰JK制服直条巾</a>

我把其它字段省去,只保留了核心部分。我们关心的主要是:

  • <a></a> 中间包裹住的是文字内容

  • href="xxx" 是超链接

  • class 可以理解为这个元素的名字

一个网页里,相同类型的元素很多,怎么区分哪个是哪个?就用 class 来区分。


我们把需要的元素辨别出来,告诉抓取工具,它就会帮我们保存下来。不同网页的结构不同,爬取规则也无法共用,理解网页结构往往是抓取中最耗时的部分。



实操


安装工具后,Chrome 右上方会出现图标。打开工具,先创建一个爬取规则。



抓取的页面一般分为两种,列表页和详情页,理解前者自然就会后者。抓取步骤大致分两步:

  1. 列表由一个个 row 组成,先把 row 给认出来;

  2. 在一个 row 里,筛选出你需要的信息。


以淘宝为例,组成列表的是一个个宫格商品。鼠标移到元素上面,按住 shift 键进行选中,就会出现橙色虚线框。这时勾选上元素类型和名字,比如这个叫 .item 的 <dl> 元素,就是我们想要的,它可以写成 dl.item。


只勾 <dl> 的话,会发现,出现了很多无关的元素,因为只勾 <dl> 不能确定这个元素是唯一的,但同时勾上 .item 和 <dl> 就可以。




如果选中后,列表里其它 row 出现绿色的方框,证明就选对了。点击确认后,Row Count 也应该跟列表中的实际数量一样。


如果没出现,或者出现了不相关的元素,那么还要再调整一下,多找其它元素试试,也可以点击蓝色按钮“Select parent”选中它的父标签试试。




把一个个信息 Cols 辨别出来的方法跟刚才一样,比如我要的是标题、价格、销售数量、图片链接,Extract 代表的 Text 是内容、Image URL 是图片链接、URL 是跳转链接,根据自己的需求调整即可。


点击“眼睛”按钮,可以检验实际抓取出来的数据。




完成之后,保存和运行,恭喜你,你要的信息就会以表格形成呈现出来,下载文件或复制随你。




淘宝的网页相对好爬,前端写得很规范。但难免有些网站,选中元素的所有 class 和属性,也辨认不出它是唯一。这时不用自责,只是开发者不好好给元素取名,前端没写好。


我们可以曲线救国,比如我们想要一个 <span> 元素,但页面里有很多,没法辨认,

  • 我们要的 <span> 元素可能是属于被某个叫 xxx 的 <div> 元素包裹,那么 div.xxx> span 就可以辨认出它是唯一的。

  • 或者我们要的是第 2 项的 <span> 元素,可以写成 span:nth-of-type(2)

  • 虽然没有 class="xxx",但可能有别的,比如 data-url="/inshopse",可以写成 span[data-url="/inshopse"]


当然,也可以下载 excel 再回头处理。方法很多,善用搜索引擎,世界上一定还有其他人跟你遇到同样的问题。



翻页


要是只抓一页我也不用爬虫了,页数越多越体现抓取工具所带来的效率提升。主流翻页方式有两种,

  • 翻页器翻页,替换当前页面的数据

  • 在当前页面往下加载更多数据


第一种,我们的办法是找出那个“下一页”按钮,工具自动帮我们按翻页按钮。在 Nav 板块添加规则,加了之后可以点击 Test Navgation 测试看能不能正常翻页。


找出来之后,抓取结果页就会多一个翻页按钮,设置翻页间隔时间和页数,就可以去泡杯咖啡等着结果出来啦。(PS:如果是加载比较慢的网站,间隔时间要设长一点。)




全部页数的数据,会存在 Data Collections 板块。




而第二种,在当前页面继续加载数据的网页,因网站而异。无论是点击“加载更多”按钮,还是鼠标直接滚动下滑,都可以在 Actions 板块模拟出来。





详情页


列表页信息不够,有的信息要打开详情页才有。这时我们需要 Jobs 进程来帮我们完成。

  1. 先建立详情页的抓取规则,

  2. 选择我们要抓的详情页的 url 集合。(可以来自先前抓完列表页时,在列表页获取到的一列 url 结果,或者也可以手动上传的本地一个表格文件。)


设置好这两项,工具就可以自动帮忙抓取。(PS:这个功能在 Data Miner 要付费)






推荐阅读