Python+XPath+Selenium爬取淘宝商品信息

Python+XPath+Selenium爬取淘宝商品信息

使用Selenium控制浏览器进行自动化操作,同时对爬取到的页面信息进行字段分析,后台将分析得到的数据写入CSV文件保存!

先看效果!!!

在这里插入图片描述

安装Selenium库和Chrome浏览器驱动

首先,Win+R打开命令行,输入pip list回车,查看是否安装Selenium库,如果没有,输入pip install selenium回车!进行安装。
在这里插入图片描述
然后我们打开我们的谷歌浏览器,设置—>关于Chrome,查看我们的Chrome的版本。
在这里插入图片描述
然后我们去到https://npm.taobao.org/mirrors/chromedriver/,谷歌浏览器的淘宝镜像去下载对应版本的驱动。
在这里插入图片描述
下载成功后,只需要把整个ChromeDriver(如果下载后有文件夹的话,请把文件夹去掉,只需要里面的驱动程序!!!)放到Python的安装目录里面就可以了。

开始编写程序!!!

这是我们需要用到的第三方库。

import time, os, csv, datetime
from selenium import webdriver

然后开始初始化一些需要的变量。

class TBSpider(object):
    def __init__(self):
        self.count = 1
        self.keyword = input(r'请输入要查询的淘宝商品信息名称:')
        self.file_name = self.keyword + datetime.datetime.now().strftime('%Y-%m-%d')
        self.driver = webdriver.Chrome()

创建文件夹,用于一会保存爬取到的商品信息。

    def create_dir(self):
        '''
            创建文件夹
        '''
        if not os.path.exists(r'./{}'.format('商品信息数据')):
            os.mkdir(r'./{}'.format('商品信息数据'))
        self.write_header()

写入CSV的头部信息用于整理爬取到的淘宝商品信息。

    def write_header(self):
        '''
            写入csv头部信息
        '''
        if not os.path.exists(r'./{}.csv'.format(r'***商品数据保存成功:{}'.format(self.keyword))):
            csv_header = ['商品名称', '商品价格', '销量', '商品店铺', '商品链接']
            with open(r'./{}/{}.csv'.format('商品信息数据', self.file_name), 'w', newline='', encoding='gbk') as file_csv:
                csv_writer_header = csv.DictWriter(file_csv, csv_header)
                csv_writer_header.writeheader()
        self.request_start_url()

编写url,初始化变量。

    def request_start_url(self):
        '''
            请求起始url
        '''
        self.driver.get('https://uland.taobao.com/sem/tbsearch?refpid=mm_26632258_3504122_32538762&keyword=&clk1=b563659abe93a96a4e4c136b8d38b209&upsId=b563659abe93a96a4e4c136b8d38b209&spm=a2e0b.20350158.31919782.1&pnum=0')
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)
        self.search_goods()

输入商品关键字,并且控制浏览器将商品关键字输入到淘宝网搜索框中,进行搜索。

    def search_goods(self):
        '''
            输入商品关键字
        '''
        print('\n' + r'----------------正在搜索商品信息:{}--------------------'.format(self.keyword) + '\n')
        self.driver.find_element_by_id('J_search_key').send_keys(self.keyword)
        self.driver.find_element_by_class_name('submit').click()
        time.sleep(3)
        self.mouse_scroll()

控制鼠标滑动,在浏览器自动化操作中鼠标往下滑动,并且进行翻页的操作,进行懒加载!

    def mouse_scroll(self):
        '''
            鼠标滑轮滚动,实现懒加载过程
        '''
        print(r'----------------正在请求第{}页数据--------------------'.format(self.count) + '\n')
        for i in range(1, 11):
            js = r'scrollTo(0, {})'.format(600 * i)
            # js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %s' % (i / 20)
            self.driver.execute_script(js)
            time.sleep(1)
        self.get_goods_info()

获取到网页的内容之后,我们就是用XPath对商品信息进行解析,获得主要的商品信息,(例如:名字,价格,销量,链接等等…)

    def get_goods_info(self):
        '''
            解析得到商品信息字段
        '''
        li_list = self.driver.find_elements_by_xpath('//div[@class="lego-pc-search-list pc-search-list"]/ul')
        for li in li_list:
            name = li.find_elements_by_xpath(r'//li[@class="pc-items-item item-undefined"]/a/div['
                                             r'@class="pc-items-item-title pc-items-item-title-row2"]/span')

            price = li.find_elements_by_xpath(r'//li[@class="pc-items-item item-undefined"]/a/div['
                                             r'@class="price-con"]/span[2]')

            xiaoliang = li.find_elements_by_xpath(r'li[@class="pc-items-item item-undefined"]/a/div['
                                                 r'@class="item-footer"]/div[2]')
            vendor = li.find_elements_by_xpath(r'//*[@id="mx_5"]/ul/li/a/div[3]/div')
            link = li.find_elements_by_xpath(r'//li[@class="pc-items-item item-undefined"]/a')

            for a, b, c, d, e in zip(name, price, xiaoliang, vendor, link):
                f = a.text
                g = b.text
                h = c.text
                i = d.text.replace('', '')
                j = e.get_attribute('href')
                self.save_data(f, g, h, i, j)

我们要既然解析到所需要的商品信息,同时也在CSV文件中写入了头部信息,那就将商品信息也写入到CSV文件中。

    def save_data(self, name, price, xiaoliang, vendor, link):
        '''
            写入csv文件主体信息
        '''
        try:
            with open(r'./{}/{}.csv'.format('商品信息数据', self.file_name), 'a+', newline='', encoding='gbk') as file_csv:
                csv_writer = csv.writer(file_csv, delimiter=',')
                csv_writer.writerow([name, price, xiaoliang, vendor, link])
                print(r'***商品数据保存成功:{}'.format(name))
        except Exception as e:
            pass

编写循环代码,让我们可以进行多页的请求,并且让它自动翻页。在range里面我们可以控制爬取到第几页,页数可以根据自己需要进行调整。

    def get_next_page(self):
        '''
            实现循环请求
        '''
        time.sleep(4)
        for index in range(2, 101):
            print(r'----------------第{}页数据保存完成--------------------'.format(self.count) + '\n')
            time.sleep(4)
            self.count += 1
            if index <= 100:
                self.driver.find_element_by_xpath(r'//*[@id="J_pc-search-page-nav"]/span[3]').click()
                self.mouse_scroll()
            else:
                print('\n' + r'---------------所有商品数据保存完成------------------')
                break

最后写入main方法!

    def main(self):
        '''
            实现主要逻辑
        '''
        self.create_dir()
        self.get_next_page()
        print('\n' + r'-------------文件保存成功------------------')

调用我们的编写的方法,进行爬取。

if __name__ == '__main__':
    tb = TBSpider()
    tb.main()

等自动化操作完成后,我们可以在控制台看到所有的商品信息,同时可以在同路径的“商品信息”文件夹中看到我们商品信息的CSV文件。
在这里插入图片描述
CSV文件------->>>
在这里插入图片描述

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个不会射日的后羿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值