【python实现网络爬虫(10)】Selenium框架以任意关键词爬取淘宝商品数据

以任意关键词爬取商品数据

比如这里以输入中文为例:小米手机(需要扫码登录)
在这里插入图片描述

爬虫逻辑:【登陆】-【访问页面 + 采集商品信息 - 翻页】

1)函数式编程

函数1:get_to_page(keyword) → 【登陆】
         keyword:关键字

函数2:get_data(page_num) → 【访问页面 + 采集数据信息 - 翻页
         page_num:翻页次数

2)采集字段
商品照片、价格、付款情况、标题、店家名称、店铺地等字段
在这里插入图片描述

前期准备和封装第一个函数
import time
import pandas as pd
from selenium import webdriver

def get_to_page(keyword):
    browser = webdriver.Chrome()
    browser.get('https://s.taobao.com/search?q={}'.format(keyword))  
    time.sleep(15)
    #用于扫码,可以把时间设置的长一些,毕竟是人工操作
    #尝试过密码输入,无法通过滑块验证
    print("程序已经成功进入目标页面")
    return browser

该部分代码实现的就是:导入相关的库,然后调用selenium框架进行登录后,跳转到指定关键词的搜索页面

封装第二个函数

该部分就是商品信息的获取以及错误异常处理和可视化输出的问题

步骤一、获取商品对应的标签,这里使用xpath路径(最为简洁,直接复制粘贴就可以了)
比如获取标题的信息,首先进入到检查界面,找到标题对应的位置,然后右键copy,然后在选择copy XPath,将复制的内容粘贴到下面的.browser.find_element_by_xpath的括号里面即可
在这里插入图片描述
步骤二、创建个字典用以保存数据

dic = {}
dic['标题'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2]').text
print(dic)

输出的结果为:
在这里插入图片描述
可以正常输出后,就可以把获取的其他字存放到字典里面了,其他字段的xpath路径也是直接复制粘贴的

dic = {}
dic['img'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[1]/div/div[1]/a/img').get_attribute('src')
dic['标题'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2]').text
dic['店铺'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[1]/a/span[2]').text
dic['店家地址'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[3]/div[2]').text
dic['产品售价'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[1]/strong').text  
dic['付款情况'] = browser.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[1]/div[2]').text
print(dic)

输出的结果为:
在这里插入图片描述
检查核对,这是以“小米手机”为关键次搜索的第一个商品,在网页的信息如下,可以看出完全匹配
在这里插入图片描述
步骤三、xpath路径解析,使用xpath路径的好处在于每个商品的标签都是按照顺序摆放的,比如这里的商品信息,都是分散在第四个【div】标签下面,解析如下:

//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[1]/div[2]/div[2] #第一个商品标题的路径
//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[2]/div[2]/div[2] #第二个商品标题的路径
//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[3]/div[2]/div[2] #第三个商品标题的路径
......

分析可以得出,只要是修改第四个div[]里面的内容就可以实现对应商品数据的获取,而一页的商品是48个,直接for i in range(1,49),就可以实现第一页的商品信息的获取了,为了防止爬取过程中出错,加上异常错误判断的处理(比如有的商品上面就没有地址,为了保证程序正常运行下去,加上try-except进行处理)

for i in range(1,49):
     try:
         dic = {}
         dic['img'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[1]/div/div[1]/a/img').get_attribute('src')
         dic['标题'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[2]').text
         dic['店铺'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[1]/a/span[2]').text
         dic['店家地址'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[2]').text
         dic['产品售价'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[1]/strong').text  
         dic['付款情况'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[2]').text
         print(dic)
     except:
         print("数据采集失败")

运行的结果如下
在这里插入图片描述
步骤四、翻页处理,就是get_datas函数里面传参的page_num,进行遍历即可,这里面要完成翻页的功能,采用的是点击下面的数字框,然后输入要爬取的数字,接着点击“确定”按钮即可
在这里插入图片描述

for j in range(1,page_num+1):
	try:
		num = browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')
        num.clear()
        num.send_keys(j+1)
        browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/span[3]').click()
        time.sleep(5)
        print("已爬取{}页,程序休息.....{}s".format(j,5))
  except:
      continue

至此该过程的所有的步骤都已经操作完成,封装第二个函数,为了将爬取的数据之中存放在电脑上,需要将所有的字典都存放在列表里,最后整个函数返回的是一个存放数据的列表。如下(两个try-except一个是应对页面的数据爬取的问题,还有一个应对的是翻页的问题,最后为了保证数据爬取到位,在每次翻页之后要让浏览器休息一下,设置一个暂停时间,一般5s足够)

def get_datas(page_num):
    data_lst = []
    for j in range(1,page_num+1):
        try:
            for i in range(1,49):
                try:
                    dic = {}
                    dic['img'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[1]/div/div[1]/a/img').get_attribute('src')
                    dic['标题'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[2]').text
                    dic['店铺'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[1]/a/span[2]').text
                    dic['店家地址'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[3]/div[2]').text
                    dic['产品售价'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[1]/strong').text  
                    dic['付款情况'] = browser.find_element_by_xpath(f'//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[{i}]/div[2]/div[1]/div[2]').text
                    print(dic)
                    data_lst.append(dic)
                except:
                    print("数据采集失败")
            num = browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/input')
            num.clear()
            num.send_keys(j+1)
            browser.find_element_by_xpath('//*[@id="mainsrp-pager"]/div/div/div/div[2]/span[3]').click()
            time.sleep(5)
            print("已爬取{}页,程序休息.....{}s".format(j,5))
        except:
            continue
    print("一共获取{}条数据".format(len(data_lst)))
    return(data_lst)
最后执行代码

通过分块执行,上边是导入的库和封装的函数,下面直接就是调用函数和保存数据的过程即可

if __name__ == '__main__':
    
    browser = get_to_page('小米')
    data_lst = get_datas(3)
    #前两行是直接完成爬取淘宝中3页以小米手机为关键词搜索得到的商品信息数据
    data = pd.DataFrame(get_datas(3))
    data.to_excel('数据.xlsx',index=False)
    #后两行是把获得的数据直接存放在本地

输出的结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lys_828

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

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

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

打赏作者

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

抵扣说明:

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

余额充值