京东手机爬虫

本文介绍了作者国庆期间编写京东手机爬虫的过程,包括爬取手机名称、价格、配置等信息。文章首先概述了简单爬虫的基本思路,然后详细讲解了如何处理动态加载的网页,包括使用requests获取网页内容,利用正则表达式、BeautifulSoup解析网页,以及如何抓取并解析动态加载的价格数据。最后,文章提到了爬取的文件组织结构和后续的数据分析准备。
摘要由CSDN通过智能技术生成

拖延症晚期的我终于于于于于于于又来更新博客了。国庆自己写了个京东手机的爬虫,爬取了京东商城所有手机的名称,价格,配置,属性等信息,算是实现了预期的功能。这里mark一下,以后遇到类似的项目都可以借鉴。

这次的京东手机爬虫和以往的都不太相同,之前爬取的都是静态网页,所有需要的内容都可以在一个页面中找到,比较基础。这次的爬虫涉及到动态加载的网页,具体的话参加后面的详细说明。

在开始具体的爬虫之前,我想先总结一下编写简单爬虫的思路。首先,秉承“万物皆可爬”的理念,我们能找到的URL都是可以爬取的(如果是某些大型的网站可能会有反爬措施,相应的会有特殊的手段进行爬取。当然,爬和反爬就像矛与盾的关系,身为菜鸟的我在爬京东时总是战战兢兢,生怕什么时候就把我的IP封了=.=)。带着这种舍我其谁的勇气,我们来试试吧~

简单梳理一下之前做过的小爬虫,大概分为以下几个步骤:

1.      俗话说,“巧妇难为无米之炊”,我们先要找到需要爬取的网页地址,这是我们一切工作的前提。(URL可能有多个哦)

2.      对于URL,通过解析将其转换为网页文本。这里我用的是Python3中的requests库,提交一个包含URL的request请求,会返回一个包含网页内容的response响应。在这个response对象中就可以获取网页文本。

3.      得到网页文本后通过一定的工具对其进行解析,得到我们感兴趣的内容(“弱水三千,我只取一瓢”那么多内容都爬下来也理解不了啊。)这里我用过的工具主要有三种,适用于不同的网页。

(1) 对于简单一点的网页(内容不多,格式也不是标准的html格式),使用正则表达式库re,将网页视为一个超级长的字符串,匹配得到相应的内容。

(2) 大型网站的网页,有时候用正则就会显得力不从心。另一方面,这些网页通常都是标准的html格式,而Python第三方库BeautifulSoup非常适合解决这类的问题。BeautifulSoup将整个html文档解析为以标签为节点的树形结构,并提供访问这些节点的API,这对于爬取我们关心的网页内容来讲是非常便利的。

(3) JSON或者类JSON类型的网页,这些网页的数据全部或者大部分是以JSON格式保存的,而json库可以方便地从这些类型的网页中获取键值对等信息。

(4) 未完待续….

有了思路后,马上进行京东手机爬取的内容吧~

1.      进入京东的首页,选择手机后的界面是这样式儿的:

得到这些URL后,先选择某一页查看源代码找到我们关心的内容:

好,170页,这就是我们的目标。而我们更关心每页的URL,这就有点像找规律了…

第1页:

https://list.jd.com/list.html?cat=9987,653,655&page=1&sort=sort%5Frank%5Fasc&trans=1&JL=6_0_0#J_main

第2页:

https://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort%5Frank%5Fasc&trans=1&JL=6_0_0#J_main

第3页:

https://list.jd.com/list.html?cat=9987,653,655&page=3&sort=sort%5Frank%5Fasc&trans=1&JL=6_0_0#J_main

第170页:

https://list.jd.com/list.html?cat=9987,653,655&page=170&sort=sort%5Frank%5Fasc&trans=1&JL=6_0_0#J_main

看到这么有规律的URL对于程序的循环抓取来讲可是太开心了,所以京东手机预览界面的URL格式为:

https://list.jd.com/list.html?cat=9987,653,655&page=?&sort=sort%5Frank%5Fasc&trans=1&JL=6_0_0#J_main

其中?代表页码,这里就是1-170。

         这对应的代码为:

def getAllPages():
    allPagesUrlList = []
    singlePageUrl = ''
    for page in range(1, 171):
        if page == 2:
            singlePageUrl = 'https://list.jd.com/list.html?cat=9987,653,655&page=' \
                            + str(page) + '&sort=sort%5Frank%5Fasc&trans=1&JL=6_0_0&ms=6#J_main'
        singlePageUrl = 'https://list.jd.com/list.html?cat=9987,653,655&page=' \
                        + str(page) + '&sort=sort%5Frank%5Fasc&trans=1&JL=6_0_0#J_main'
        allPagesUrlList.append(singlePageUrl)
    return allPagesUrlList
在实际爬取时,发现有时候第二页的URL比其他页的多了&ms=6(经验证是系统随机生成的,应该是隔几天会出现一次)。这里就按照当时爬取的URL进行处理。

得到这些URL后,先选择某一页查看源代码找到我们关心的内容:


这里每一页都有N多个手机,我们在人工点击一个手机时会跳转到手机详情界面,而这个链接在上图的href标签内。这里采用BeautifulSoup库获取该标签的内容。代码如下:

def getPhonesUrl(pageUrl):
    phonesUrlList = []
    html = getHtmlText(pageUrl)
    soup = BeautifulSo
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值