Python爬取淘宝商品

2023-11-11

爬取淘宝商品信息

  • 一个小菜鸡,用了十四个小时写了个爬虫,时间是有点长,但我心里美滋滋啊,记录下过程。也是第一次写博客排版什么的就凑合吧。

主要用了selenium、BeautifulSoup库

  • 初始化,在十秒内页面加载完毕,调用selenium。

        def __init__(self):
        url = 'https://login.taobao.com/member/login.jhtml'
        self.url = url
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser, 10)
    
  • 定义一个登陆函数,我采用的是扫码登陆,需要你手动用手机扫码登陆,最开始用的账号密码登陆可把我给折磨的,账号密码登陆我的淘宝号会出现滑动登陆和跳转到验证页面发送验证码验证,整了半天滑动一出现我就重新运行,验证码我用Xpath找到元素位置点击发送验证码,手动后台输入,但我发现不行,后来次用扫码登陆,心累。有一点要注意,不要为了方便扫码最大化窗口,有时候会被反爬。设置合适的窗口大小,方便扫码。自己根据要扫码的时间设置时间。

      def login_Infos(self):
         self.browser.get(self.url)
         # 改变窗口宽度,不要最大化,会被反爬虫检测到
         self.browser.set_window_size(1300, 800)
         # 点击二维码扫描
         self.browser.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
         # 等待扫描二维码,时间短了就改一改
         time.sleep(12)
    
  • 新建一个保存数据的csv函数,需要导入csv库

       def file_Csv(self):
         csv_file = open(r'手机.csv', 'w', newline='', encoding='utf-8-sig')
         writer = csv.writer(csv_file)
         self.writer = writer
         writer.writerow(['商品名称', '销售地', '店铺名称', '销售价格', '销售量', '商品链接'])
    
  • 设置保存数据的函数,登录上后,一般会跳转到个人中心,然后跳到主页,用Xpath定位,如果跳到个人主页,就模拟点击跳到淘宝主页,如果已经在主页了就定位到搜索框,后台输入要搜索的商品名称,爬取页数,然后模拟点击搜索,注意淘宝只能到100页,所以页数最大值只能是100。
    page = self.browser.page_source 保存页面,用BeautifulSoup解析,中间有个坑特坑
    在这里插入图片描述
    红色标记处解析不出来,检查了半天写的一点毛病都没有,就是获取不到,然后逐步检查,才发现红色标记处获取不到为NoneType,后来改用规则,获取其div下的div标签就能获取得到,很奇怪,心累。
    然后就是数据处理了。
    模拟下一页的时候还有一个坑,每次下一页的标签会变,但它始终是最后一个li标签位置,所以定位li标签要定位到最后一个li标签的位置,而不是直接浏览器复制Xpath路径。

       def get_Data(self):
         global data
         # page = self.browser.page_source
         #
         # dk = page.encode(encoding='UTF-8').decode('unicode_escape')
         # tt = dk.decode(encoding='UTF-8')
         # print(dk)
         if self.browser.find_element_by_xpath('//*[@id="J_SiteNavHome"]/div/a'):
             taobao_index = self.browser.find_element_by_xpath('//*[@id="J_SiteNavHome"]/div/a')
             taobao_index.click()
         time.sleep(2)
         search_input = self.browser.find_element_by_xpath('//*[@id="q"]')
         goods_name = input("请输入要搜索的商品名称:")
         search_input.send_keys(goods_name)
         time.sleep(2)
         search_submit = self.browser.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')
         search_submit.click()
         count = int(input("请输入要爬的页数(最大为100):"))
         # 淘宝最大页数为100页
         for k in range(count):
             page = self.browser.page_source
             # print(page.encode('utf-8', 'ignore'))
             print("页面正在解析<<<<<<<<<<<<<<<<<<<<<<<<<<<")
             # with open(r'demo.html', 'w', newline='', encoding='utf-8-sig') as f:
             #     f.write(page.encode("gbk", 'ignore').decode("gbk", "ignore"))
             soup = BeautifulSoup(page, "html.parser")
             data_site = soup.find('div', class_='grid g-clearfix').find_all_next('div', class_='items')
             for data_good in data_site:
                 dk0 = data_good.find_all('div', class_='row row-1 g-clearfix')
                 dk1 = data_good.find_all('div', class_='row row-2 title')
                 dk2 = data_good.find_all('div', class_='row row-3 g-clearfix')
                 for i in range(len(dk0)):
                     price_site = dk0[i].find('div', class_='price g_price g_price-highlight')
                     price_good = price_site.find('strong').text.strip()
                     counts_buy = dk0[i].find('div', class_='deal-cnt').text
                     counts_buy = counts_buy.replace('人付款', '')
                     # print(counts_buy)
                     if '+' in counts_buy:
                         counts_buy = counts_buy.replace('+', '')
                     if '万' in counts_buy:
                         counts_buy = float(counts_buy.replace('万', '')) * 10000
                     # print(counts_buy)
                     name_site = dk1[i].find('a')
                     url_good = name_site['href']
                     name_good = name_site.text.strip()
                     shop_name = dk2[i].find('div', class_='shop').text.strip()
                     shop_site = dk2[i].find('div', class_='location').text
                     # print(name_good, shop_site, shop_name, price_good, counts_buy, url_good)
                     data.append([str(name_good), str(shop_site), str(shop_name), str(price_good), str(counts_buy),
                                  str(url_good)])
                     # print(i)
    
             for j in range(len(data)):
                 self.writer.writerow(data[j])
             print("第" + str(k+1) + "页解析、存储完毕<<<<<<<<<<<<<<<<<<<<<")
             if k != 99:
                 data = []
                 page_next = self.browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/ul/li[last()]/a')
                 page_next.click()
                 t = randint(3, 5)
                 time.sleep(t)
                 
    
  • 过程截图
    在这里插入图片描述
    在这里插入图片描述

  • 最后附上源码,有说的不明或错误的地方,有看到的小伙伴请指正。

    	import time
    	from selenium import webdriver  # 调用webdriver模块
    	from selenium.webdriver.support.ui import WebDriverWait
    	from bs4 import BeautifulSoup
    	import csv
    	from random import *
    	
    	# 定义淘宝类
    	class Taobao_Infos():
    	    def __init__(self):
    	        url = 'https://login.taobao.com/member/login.jhtml'
    	        self.url = url
    	        self.browser = webdriver.Chrome()
    	        self.wait = WebDriverWait(self.browser, 10)
    	
    	    def login_Infos(self):
    	        self.browser.get(self.url)
    	        # 改变窗口宽度,不要最大化,会被反爬虫检测到
    	        self.browser.set_window_size(1300, 800)
    	        # 点击二维码扫描
    	        self.browser.find_element_by_xpath('//*[@id="login"]/div[1]/i').click()
    	        # 等待扫描二维码,时间短了就改一改
    	        time.sleep(12)
    	
    	    def file_Csv(self):
    	        csv_file = open(r'手机.csv', 'w', newline='', encoding='utf-8-sig')
    	        writer = csv.writer(csv_file)
    	        self.writer = writer
    	        writer.writerow(['商品名称', '销售地', '店铺名称', '销售价格', '销售量', '商品链接'])
    	
    	    def get_Data(self):
    	        global data
    	        # page = self.browser.page_source
    	        #
    	        # dk = page.encode(encoding='UTF-8').decode('unicode_escape')
    	        # tt = dk.decode(encoding='UTF-8')
    	        # print(dk)
    	        if self.browser.find_element_by_xpath('//*[@id="J_SiteNavHome"]/div/a'):
    	            taobao_index = self.browser.find_element_by_xpath('//*[@id="J_SiteNavHome"]/div/a')
    	            taobao_index.click()
    	        time.sleep(2)
    	        search_input = self.browser.find_element_by_xpath('//*[@id="q"]')
    	        goods_name = input("请输入要搜索的商品名称:")
    	        search_input.send_keys(goods_name)
    	        time.sleep(2)
    	        search_submit = self.browser.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')
    	        search_submit.click()
    	        count = int(input("请输入要爬的页数(最大为100):"))
    	        # 淘宝最大页数为100页
    	        for k in range(count):
    	            page = self.browser.page_source
    	            # print(page.encode('utf-8', 'ignore'))
    	            print("页面正在解析<<<<<<<<<<<<<<<<<<<<<<<<<<<")
    	            # with open(r'demo.html', 'w', newline='', encoding='utf-8-sig') as f:
    	            #     f.write(page.encode("gbk", 'ignore').decode("gbk", "ignore"))
    	            soup = BeautifulSoup(page, "html.parser")
    	            data_site = soup.find('div', class_='grid g-clearfix').find_all_next('div', class_='items')
    	            for data_good in data_site:
    	                dk0 = data_good.find_all('div', class_='row row-1 g-clearfix')
    	                dk1 = data_good.find_all('div', class_='row row-2 title')
    	                dk2 = data_good.find_all('div', class_='row row-3 g-clearfix')
    	                for i in range(len(dk0)):
    	                    price_site = dk0[i].find('div', class_='price g_price g_price-highlight')
    	                    price_good = price_site.find('strong').text.strip()
    	                    counts_buy = dk0[i].find('div', class_='deal-cnt').text
    	                    counts_buy = counts_buy.replace('人付款', '')
    	                    # print(counts_buy)
    	                    if '+' in counts_buy:
    	                        counts_buy = counts_buy.replace('+', '')
    	                    if '万' in counts_buy:
    	                        counts_buy = float(counts_buy.replace('万', '')) * 10000
    	                    # print(counts_buy)
    	                    name_site = dk1[i].find('a')
    	                    url_good = name_site['href']
    	                    name_good = name_site.text.strip()
    	                    shop_name = dk2[i].find('div', class_='shop').text.strip()
    	                    shop_site = dk2[i].find('div', class_='location').text
    	                    # print(name_good, shop_site, shop_name, price_good, counts_buy, url_good)
    	                    data.append([str(name_good), str(shop_site), str(shop_name), str(price_good), str(counts_buy),
    	                                 str(url_good)])
    	                    # print(i)
    	
    	            for j in range(len(data)):
    	                self.writer.writerow(data[j])
    	            print("第" + str(k+1) + "页解析、存储完毕<<<<<<<<<<<<<<<<<<<<<")
    	            if k != 99:
    	                data = []
    	                page_next = self.browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/ul/li[last()]/a')
    	                page_next.click()
    	                t = randint(3, 5)
    	                time.sleep(t)
    	
    	
    	if __name__ == "__main__":
    	    data = []
    	    app = Taobao_Infos()
    	    app.login_Infos()
    	    app.file_Csv()
    	    app.get_Data()
    
    
  • 还得数据处理,头秃。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬取淘宝商品 的相关文章

随机推荐

  • 饥荒暴食模式服务器无响应,饥荒暴食模式无银盘图文攻略介绍

    饥荒暴食模式无银盘图文攻略介绍 2018 06 26 17 03 50来源 游戏下载编辑 苦力趴评论 0 饥荒 近日推出了新的游戏模式暴食模式 玩家可以选择单人通关亦或是组队一同任务 下面就为大家带来饥荒暴食模式无银盘图文攻略介绍 基本思路
  • 数据库之数据库设计和E-R模型

    本篇文章介绍数据库设计和E R模型 内容基本是笔者在学习 数据库系统概念 时摘抄总结而来 仅作笔记 实体 联系模型 实体 联系 entity relationship E R 数据模型的提出旨在方便数据库的设计 它是通过允许定义代表数据库全
  • related work

    Traditional approaches e g genetic algorithm GA 2 and ant colony optimization ACO 3 can obtain optimal mapping results b
  • mysql查询练习(三)

    31 查询成绩比该课程平均成绩低的同学的成绩表 mysql gt select from score a where degree lt select avg degree from score b where a cno b cno sn
  • 查看linux系统版本命令

    一 查看内核版本命令 1 root SOR SYS cat proc version Linux version 2 6 18 238 el5 mockbuild x86 012 build bos redhat com gcc versi
  • Robot Framework完整流程学习--分层思想

    一 环境搭建 网上有很多的教程 这里就不多讲了 二 RIDE的界面认识 这里只介绍几个重要常用的功能 其他相信自己都能理解 1 Search Keywords F5 搜索关键字 2 Content Assistance 内容助手 3 Vie
  • java 多线程 总结一

    首先讲一下进程和线程的区别 进程 每个进程都有独立的代码和数据空间 进程上下文 进程间的切换会有较大的开销 一个进程包含1 n个线程 线程 同一类线程共享代码和数据空间 每个线程有独立的运行栈和程序计数器 PC 线程切换开销小 线程和进程一
  • nmap常规使用和参数超细详解 -- 小黑liux武器库详解<宝藏文>

    namp非常强大的主机发现和端口扫描工具 这是web渗透常用的工具 包含四项基本功能 主机发现 端口扫描 版本侦测 操作系统侦测 目录 常规使用 单体拳法 组合拳 参数详解 主机发现 扫描技术 服务版本探测 操作系统检测 防火墙 IDS规避
  • opencv +数字识别

    现在很多场景需要使用的数字识别 比如银行卡识别 以及车牌识别等 在AI领域有很多图像识别算法 大多是居于opencv 或者谷歌开源的tesseract 识别 由于公司业务需要 需要开发一个客户端程序 同时需要在xp这种老古董的机子上运行 故
  • protoBuffer的下载以及使用①

    这里写了一个简单的示例检测proto是否可以使用 使用protoBuf需要提供以下 protobuf java 2 6 1 sources jar protoc 2 6 1 win32 zip 这两个文件我已经添加了附件 当然也可去谷歌官网
  • mysql报错合集

    1 Too many connections 报错 quickBI上报错 数据源执行SQL失败 INTERNAL java sql SQLException com mysql jdbc exceptions jdbc4 MySQLNonT
  • java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigD

    解决 将int类型转成BigDecimal类型就可以了 filtrationList add new Filtration MatchType EQ BigDecimal valueOf 0 fisRemove java lang Clas
  • 东北大学acm第五周周赛

    include
  • Resources.getResourceAsStream用法

    Resources com ibatis common resource Resources 类为从类路径中加载资源 提供了易于使用的方法 处理 ClassLoader 是一项 富于挑战的工作 尤其是应用服务器 容器的情况下 Resourc
  • mmdetection的VOC数据集训练、测试、保存(测试图片)

    mmdetection训练 测试总结 1 数据集格式 voc数据集 在 mmdetection data VOCdekit 上传数据 改名为VOC2007 其中包含JPEGImages Annotations ImageSets等 2 代码
  • 【vue3】监听路由的写法以及路由更新但是页面内容不更新的解决方案

    以下是vue3使用watch监听路由的写法 watch gt router currentRoute value newValue any gt 此处写监听路由后要执行的事情 if newValue fullPath manage rack
  • 2019年第十届蓝桥杯程序设计大赛国赛C++大学B组题解

    目录 A 平方序列 B 质数拆分 D 求值 E 路径计数 F 最优包含 G 排列数 H 解谜游戏 I 第八大奇迹 A 平方序列 题目解析 题意很直白 我们可以暴力枚举x y 2019
  • 机械革命开启Hyper-V安装Docker无限蓝屏(已解决)

    安装Docker时会蓝屏 安装Docker时会蓝屏 起初以为是docker 系统问题 后来经过仔细的检查 发现是只要开启虚拟化就会蓝屏 再检查好像硬件虚拟化有点问题 一番查找之后方知是bios的问题 CODE01需要升级到1 07版本 官方
  • 如何实现一个组件封装?

    问题网址 http bbs daxiangclass com thread 271 htm js前端组件的封装方法 定义一个类 类中增加一个方法 body中定义一个dom节点 脚本中把dom节点和类定义结合起来 实现特定的组件功能 vue组
  • Python爬取淘宝商品

    爬取淘宝商品信息 一个小菜鸡 用了十四个小时写了个爬虫 时间是有点长 但我心里美滋滋啊 记录下过程 也是第一次写博客排版什么的就凑合吧 主要用了selenium BeautifulSoup库 初始化 在十秒内页面加载完毕 调用seleniu