PQ爬淘宝数据

题目:

根据关键词根,爬取淘宝所有商品数据。

思路:

关于PQ网抓,前面已介绍过几个类似的案例,点击前往,那个理解的话再做这个会比较容易。
但是抓淘宝和之前的题相比又有些特殊,因为我们知道在淘宝中搜索关键词,返回的结果肯定不止一页,我们除了要实现翻页效果,还要知道每个关键词搜索出来的结果共有多少页。
首先打开淘宝搜索关键词"ipad",按F12然后点击下一页,不难发现这样的信息:

我们把这个url复制到浏览器打开,发现原来是通过api返回了一串json。经过删减测试发现,关键部分为https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&q=ipad,其余均可省略。
继续点击下一页,发现其余参数没有变化,但是"data-value"后的数字一直在变,页数每加1参数就会加44。
为什么是44?观察发现原来淘宝每一页一行有4件商品共11行,也就是一页有44件商品。这个先不管,我们只要知道页数和参数两者间的关系就行了:data-value=(页数-1)*44。
再来考虑下如何获取搜索结果共有多少页?
通过F12找了一圈好像没找到,但我们知道,一般来说和页数相关的参数都会带上"page",那我们尝试下在刚刚返回的json中搜索"page"看下会发生什么?

发现在"pager"字段下有一个叫"totalPage"的参数,看着就像总页数,后面对应的值为100,再把网页拉到最下面发现果然显示"共100页",于是得知此参数即为总页数。当然这里只是我们运气好他刚好名字里带"page"而已,如果没有搜索到我们通过观察json也能够找出来。
总页数有了,控制页数的参数也有了,那么只需要根据这些信息构建自定义函数调用即可。

解法:

let
    get_data=(x)=>
        let
            url="https://s.taobao.com/search?ajax=true&q="&Uri.EscapeDataString(x),
            totalpage=Json.Document(Web.Contents(url))[mods][pager][data][totalPage],
            pages=List.Numbers(0,totalpage,44),
            data=List.Transform(pages,each Json.Document(Web.Contents(url&"&data-key=s&data-value="&Text.From(_)))[mods][itemlist][data][auctions])
        in
            data,
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    获取 = Table.AddColumn(源, "data", each get_data([关键词])),
    展开 = Table.ExpandListColumn(Table.ExpandListColumn(获取, "data"),"data"),
    结果 = Table.ExpandRecordColumn(展开, "data", Record.FieldNames(展开[data]{0}))
in
    结果

在此仅演示了简单的数据爬取,也许你会发现最终的结果并不完美:标题中的html标签没有去掉,有些关键词搜索无结果。。。
一个完整的爬虫项目还需要后续的数据清洗、异常处理等步骤,当然这些并不是本文的主题。
也许你在操作的过程中会有各种疑问,为什么是这个,为什么不是那个?。。。
唯一的方法就是试,不同网页的提交方式、数据结构都不一样,谁也无法知道下一步会怎样,答案都是试出来的。

附件

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注