手把手教你爬取淘宝的笔记本电脑数据(二)

简介: 手把手教你爬取淘宝的笔记本电脑数据(二)

2、爬虫思路的完整叙述

这个章节主要讲述的是我的整个爬虫思路。会的人就挑重点看看,不会的人就仔细看看。


1)定位输入框、搜索框

你想要获取笔记本电脑的数据信息。就必须要利用selenium自动化测试工具,自动输入“笔记本电脑”,然后点击“搜索”,获取我们想要的页面。

下图展示的是“输入框”的定位信息:

image.png

下图展示的是“搜索框”的定位信息:

image.png

第一次测试代码如下:


from selenium import webdriver
import time
# 搜索商品
def search_product(key_word):
    # 定位输入框
    browser.find_element_by_id("q").send_keys(key_word)
    # 定义点击按钮,并点击
    browser.find_element_by_class_name('btn-search').click()
    # 最大化窗口:为了方便我们扫码
    browser.maximize_window()
    # 等待15秒,给足时间我们扫码
    time.sleep(15)
# 获取数据
def get_data():
    pass
def main():
    browser.get('https://www.taobao.com/')
    search_product(key_word)
if __name__ == '__main__':
    key_word = input("请输入你要搜索的商品:")
    browser = webdriver.Chrome()
    main()


注意:在自动点击“搜索框”后,系统会提示“需要登陆信息”。登陆方式很多,我推荐的是使用“二维码登录”的方式,因为其他方式很复杂,也不建议你们尝试,除非你想研究爬虫。


2)获取“总页数”信息

这个操作是为我们后来的“翻页”操作做准备的。对于淘宝页面来说,进行翻页操作,有如下两种方式,下面我们一一进行说明,我们先看下图。

image.png

思路一:从第一页开始,一直点击下一页;

思路二:获取总页码,进行url的拼接后,进行翻页操作;

这里我们选择的是“第二种思路”。因为不同的商品页码不同(有的可能没有100页),因此为了便于代码的书写,我们选择了第二种。


from selenium import webdriver
import time
# 搜索商品,获取商品页码
def search_product(key_word):
    # 定位输入框
    browser.find_element_by_id("q").send_keys(key_word)
    # 定义点击按钮,并点击
    browser.find_element_by_class_name('btn-search').click()
    # 最大化窗口:为了方便我们扫码
    browser.maximize_window()
    # 等待15秒,给足时间我们扫码
    time.sleep(15)
    # 定位这个“页码”,获取“共100页这个文本”
    page_info = browser.find_element_by_xpath('//div[@class="total"]').text
    # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。
    page = re.findall("(\d+)",page_info)[0]
    return page
# 获取数据
def get_data():
    pass
def main():
    browser.get('https://www.taobao.com/')
    page = search_product(key_word)
    print(type(page))
    print(page)
if __name__ == '__main__':
    key_word = input("请输入你要搜索的商品:")
    browser = webdriver.Chrome()
    main()


定位“总页面”,我们可以看一下图中的定位信息,这里的总页面信息是一个文本“共100页”,我们需要利用“正则表达式”提取数字100,代码如上。

image.png


3)获取商品信息(第一页的信息)

我们要获取商品信息,首先要找到商品信息的具体定位信息。老生常谈的话,怎么定位?这里就不详细说明了,下图中可以看出:整个笔记本的信息都存在于div[@class=“items”]下。

其次,获取具体各部分的信息,我们使用的是xpath语法,这一直是我最喜欢使用的一个获取数据的方式。

image.png

代码如下:


from selenium import webdriver
import time
# 搜索商品,获取商品页码
def search_product(key_word):
    # 定位输入框
    browser.find_element_by_id("q").send_keys(key_word)
    # 定义点击按钮,并点击
    browser.find_element_by_class_name('btn-search').click()
    # 最大化窗口:为了方便我们扫码
    browser.maximize_window()
    # 等待15秒,给足时间我们扫码
    time.sleep(15)
    # 定位这个“页码”,获取“共100页这个文本”
    page_info = browser.find_element_by_xpath('//div[@class="total"]').text
    # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。
    page = re.findall("(\d+)",page_info)[0]
    return page
# 获取数据
def get_data():
    # 通过页面分析发现:所有的信息都在items节点下
    items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
    for item in items:
        # 参数信息
        pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
        # 价格
        pro_price = item.find_element_by_xpath('.//strong').text
        # 付款人数
        buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text
        # 旗舰店
        shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text
        # 发货地
        address = item.find_element_by_xpath('.//div[@class="location"]').text
        print(pro_desc, pro_price, buy_num, shop, address)
def main():
    browser.get('https://www.taobao.com/')
    page = search_product(key_word)
    print(page)
    get_data()
if __name__ == '__main__':
    key_word = input("请输入你要搜索的商品:")
    browser = webdriver.Chrome()
    main()

据(第一页的数据)

保存数据我们使用的是csv模块,我们先保存第一页的数据,后面采用追加的方式,将每一页的数据,一次次保存进行。


from selenium import webdriver
import time
import csv
# 搜索商品,获取商品页码
def search_product(key_word):
    # 定位输入框
    browser.find_element_by_id("q").send_keys(key_word)
    # 定义点击按钮,并点击
    browser.find_element_by_class_name('btn-search').click()
    # 最大化窗口:为了方便我们扫码
    browser.maximize_window()
    # 等待15秒,给足时间我们扫码
    time.sleep(15)
    # 定位这个“页码”,获取“共100页这个文本”
    page_info = browser.find_element_by_xpath('//div[@class="total"]').text
    # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。
    page = re.findall("(\d+)",page_info)[0]
    return page
# 获取数据
def get_data():
    # 通过页面分析发现:所有的信息都在items节点下
    items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq  "]')
    for item in items:
        # 参数信息
        pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text
        # 价格
        pro_price = item.find_element_by_xpath('.//strong').text
        # 付款人数
        buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text
        # 旗舰店
        shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text
        # 发货地
        address = item.find_element_by_xpath('.//div[@class="location"]').text
        #print(pro_desc, pro_price, buy_num, shop, address)
        with open('{}.csv'.format(key_word), mode='a', newline='', encoding='utf-8-sig') as f:
            csv_writer = csv.writer(f, delimiter=',')
            csv_writer.writerow([pro_desc, pro_price, buy_num, shop, address])
def main():
    browser.get('https://www.taobao.com/')
    page = search_product(key_word)
    print(page)
    get_data()
if __name__ == '__main__':
    key_word = input("请输入你要搜索的商品:")
    browser = webdriver.Chrome()
    main()


注意:在使用csv保存数据的时候,一定要将数据编码设置为“utf-8-sig”形式,不要问为什么,因为我以前碰到过保存为“utf8”格式,仍然出现乱码的情况。只有保存成这个编码还没有遇见任何问题。


5)翻页操作获取整个数据(完整代码)

我们想要知道怎么翻页,就必须了解每个页面的“url”是怎么变化的,下图我截取了第2,3,4页的url信息,进行分析。

image.png

相关文章
|
存储 Shell Linux
【Shell 命令集合 文件传输 FTP客户端工具】Linux ncftp 命令使用指南
【Shell 命令集合 文件传输 FTP客户端工具】Linux ncftp 命令使用指南
379 0
|
测试技术 调度 C++
六年打磨!阿里开源混沌工程工具 ChaosBlade
减少故障的最好方法就是让故障经常性的发生。通过不断重复失败过程,持续提升系统的容错和弹性能力。今天,阿里巴巴把六年来在故障演练领域的创意和实践汇浓缩而成的工具进行开源,它就是 “ChaosBlade”。如果你想要提升开发效率,不妨来了解一下。
12280 0
|
12月前
|
人工智能 IDE 开发工具
《C++人工智能开发 IDE 全解析:助力智能创新之路》
本文深入探讨了几款适合 C++ 人工智能开发的 IDE,包括 Visual Studio、CLion、Eclipse CDT 和 Qt Creator。每款 IDE 都有其独特的优势,如 Visual Studio 的强大调试工具、CLion 的代码导航和 CMake 支持、Eclipse CDT 的跨平台能力和丰富的插件生态系统,以及 Qt Creator 在界面开发方面的卓越表现。开发者应根据项目需求、团队协作和个人习惯选择最合适的 IDE,以提升开发效率和体验。
338 16
|
XML JavaScript 前端开发
JavaWeb基础4——HTML,JavaScript&CSS
HTML,JavaScript&CSS、元素、标签、css 选择器、属性、JavaScript基础语法、JavaScript对象、BOM浏览器对象模型、DOM文档对象模型、事件监听、正则对象RegExp/ES6
JavaWeb基础4——HTML,JavaScript&CSS
|
设计模式 API 持续交付
深入理解微服务架构:设计模式与实践
【10月更文挑战第19天】介绍了微服务架构的核心概念、设计模式及最佳实践。文章详细探讨了微服务的独立性、轻量级通信和业务能力,并介绍了聚合器、链式和发布/订阅等设计模式。同时,文章还分享了实施微服务的最佳实践,如定义清晰的服务边界、使用API网关和服务发现机制,以及面临的挑战和职业心得。
|
NoSQL Redis Windows
windows环境启动redis-server.exe出现闪退问题解决方案(亲测有效)
windows环境启动redis-server.exe出现闪退问题解决方案(亲测有效)
2120 0
|
Python
Python的报错让我学到新知识
Python的报错让我学到新知识
256 0
|
JavaScript 前端开发 API
游戏开发入门:Python后端与Vue前端的协同工作方式
【4月更文挑战第11天】使用Python后端(Flask或Django)和Vue.js前端开发游戏变得流行,能提高开发效率和可维护性。本文指导如何构建这样的项目,包括设置环境、创建虚拟环境、搭建后端API及前端Vue组件,强调前后端协作和API接口的重要性。这种架构促进团队合作,提升代码质量和游戏体验。
536 3
|
开发框架 .NET Linux
【.NET Developer】已发布好的.NET Core项目文件如何打包为Docker镜像文件
该文介绍了如何不使用VS2019手动创建ASP.NET Core Blazor项目的Dockerfile并构建Docker镜像。首先,创建名为Dockerfile的文件,并复制提供的Dockerfile内容,该文件指定了基础镜像和工作目录。然后,通过CMD在项目目录下运行`docker build -t 自定义镜像名 .`来生成镜像。最后,使用`docker run`命令启动容器并验证项目运行。此外,文章还提到了将镜像推送到Azure Container Registry (ACR)的步骤。
610 0
|
Linux
Linux系统编程之exec函数簇的使用:剖析exec函数簇的实现原理、参数解释和用法技巧
Linux系统编程之exec函数簇的使用:剖析exec函数簇的实现原理、参数解释和用法技巧
312 0