发布时间:2025-06-24 20:05:42  作者:北方职教升学中心  阅读量:816


调用page_turning翻页进行翻页,并爬取第PageStart+1页到第PageEnd页商品信息。商品详细信息(商品标题、销量、selenium、地区、

使用视频教程:

【爬虫】Python实现爬取淘宝商品信息(超详细)

# 代码说明:'''代码功能: 基于ChromeDriver爬取taobao(淘宝)平台商品列表数据输入参数:  KEYWORLD --> 搜索商品“关键词”;          pageStart --> 爬取起始页;          pageEnd --> 爬取终止页;输出文件:爬取商品列表数据        'Page'        :页码        'Num'         :序号        'title'       :商品标题        'Price'       :商品价格        'Deal'        :商品销量        'Location'    :地理位置        'Shop'        :商品        'IsPostFree'  :是否包邮        'Title_URL'   :商品详细页链接        'Shop_URL'    :商铺链接        'Img_URL'     :图片链接'''# 声明第三方库/头文件from selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqimport timeimport openpyxl as op               #导入Excel读写库# 全局变量count = 1                           # 写入Excel商品计数KEYWORD = input('输入搜索的商品关键词Keyword:')# 要搜索的商品的关键词pageStart = int(input('输入爬取的起始页PageStart:'))# 爬取起始页pageEnd = int(input('输入爬取的终止页PageEnd:'))# 爬取终止页# 启动ChromeDriver服务options = webdriver.ChromeOptions()# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式options.add_experimental_option("excludeSwitches", ['enable-automation'])# 把chrome设为selenium驱动的浏览器代理;driver = webdriver.Chrome(options=options)# 反爬机制driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",                       {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})driver.get('https://www.taobao.com')# 窗口最大化driver.maximize_window()# wait是Selenium中的一个等待类,用于在特定条件满足之前等待一定的时间(这里是15秒)。openpyxl等Python的第三方库;如若缺失,使用pip指令安装即可。

# 爬虫main函数def Crawer_main():    try:        # 搜索KEYWORD        search_goods(KEYWORD)        # 判断pageStart是否为第1页        if pageStart != 1:            turn_pageStart()        # 爬取PageStart的商品信息        get_goods(pageStart)        # 从PageStart+1爬取到PageEnd        for i in range(pageStart + 1, pageEnd+1):            page_turning(i)            get_goods(i)    except Exception as exc:        print("Crawer_main函数错误!")

淘宝登录界面示意图:

搜索“关键词”

ChromeDriver服务请求淘宝(https://www.taobao.com)服务,模拟浏览器运行,找到“输入框”输入关键词KEYWORD,并点击“搜索”按键。

【更新说明】项目代码已在2024年12月02日19点30进行更新,如有问题可评论或私信与我联系!

目录

项目介绍

代码部分

引用第三方库

全局定义

主函数

爬虫主函数代码

搜索“关键词”

翻页函数代码

​编辑

获取商品列表信息代码

完整代码

项目介绍

项目使用ChromeDriver插件,基于Python的第三方库Selenium模拟浏览器运行、商铺链接等)

4、

if __name__ == '__main__':    # 建立Excel表格    try:        ws = op.Workbook()                                  # 创建Workbook        wb = ws.create_sheet(index=0)                       # 创建worsheet        # Excel第一行:表头        title_list = ['Page', 'Num', 'title', 'Price', 'Deal', 'Location', 'Shop', 'IsPostFree', 'Title_URL',                      'Shop_URL', 'Img_URL', 'Style_1', 'Style_2', 'Style_3']        for i in range(0, len(title_list)):            wb.cell(row=count, column=i + 1, value=title_list[i])        count += 1  # 从第二行开始写爬取数据    except Exception as exc:        print("Excel建立失败!")    # 开始爬取数据    Crawer_main()    # 保存Excel表格    data = time.strftime('%Y%m%d-%H%M', time.localtime(time.time()))    Filename = "{}_No.{}~{}_{}_FromTB.xlsx".format(KEYWORD,pageStart,pageEnd,data)    ws.save(filename = Filename)    print(Filename + "存储成功~")

(输入)效果预览:

爬虫主函数代码

1、翻页初始页函数turn_pageStart,找到页码输入框,输入初始页页码,点击“确认”按键跳转至初始页。调用爬虫主函数Crawer_main,启动爬虫程序;

3、

# 输入“关键词”,搜索def search_goods(KEYWORD):    try:        print("正在搜索: {}".format(KEYWORD))        # 找到搜索“输入框”        input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))        # 找到“搜索”按钮        submit = wait.until(            EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))        # 输入框写入“关键词KeyWord”        input.send_keys(KEYWORD)        # 点击“搜索”按键        submit.click()        # 搜索商品后会再强制停止2秒,如有滑块请手动操作        time.sleep(2)        print("搜索完成!")    except Exception as exc:        print("search_goods函数错误!")

翻页函数代码

1、pyquery请求HTML页面信息,并进行解析;

3、价格、# 如果一直到等待时间都没满足则会捕获TimeoutException异常wait = WebDriverWait(driver,10)# 打开页面后会强制停止10秒,请在此时手动扫码登陆# 输入“关键词”,搜索def search_goods(KEYWORD): try: print("正在搜索: {}".format(KEYWORD)) # 找到搜索“输入框” input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))) # 找到“搜索”按钮 submit = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))) # 输入框写入“关键词KeyWord” input.send_keys(KEYWORD) # 点击“搜索”按键 submit.click() # 搜索商品后会再强制停止2秒,如有滑块请手动操作 time.sleep(2) print("搜索完成!") except Exception as exc: print("search_goods函数错误!")# 翻页至第pageStar页def turn_pageStart(): try: print("正在翻转:第{}页".format(pageStart)) # 滑动到页面底端 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滑动到底部后停留3s time.sleep(3) # 找到输入“页面”的表单,输入“起始页” pageInput = wait.until(EC.presence_of_element_located( (By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/span[3]/input'))) pageInput.send_keys(pageStart) # 找到页面跳转的“确定”按钮,并且点击 admit = wait.until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/button[3]'))) admit.click() print("已翻至:第{}页".format(pageStart)) except Exception as exc: print("turn_pageStart函数错误!")# 获取每一页的商品信息;def get_goods(page): try: # 声明全局变量count global count if input('确认界面加载完毕,输入数字“1”开始爬取-->') == 1: pass # 获取html网页 html = driver.page_source doc = pq(html) # 提取所有商品的共同父元素的类选择器 items = doc('div.content--CUnfXXxv > div > div').items() for item in items: # 定位商品标题 title = item.find('.title--qJ7Xg_90 span').text() # 定位价格 price_int = item.find('.priceInt--yqqZMJ5a').text() price_float = item.find('.priceFloat--XpixvyQ1').text() if price_int and price_float: price = float(f"{price_int}{price_float}") else: price = 0.0 # 定位交易量 deal = item.find('.realSales--XZJiepmt').text() # 定位所在地信息 location = item.find('.procity--wlcT2xH9 span').text() # 定位店名 shop = item.find('.shopNameText--DmtlsDKm').text() # 定位包邮的位置 postText = item.find('.subIconWrapper--Vl8zAdQn').text() postText = "包邮" if "包邮" in postText else "/" # 定位商品url t_url = item.find('.doubleCardWrapperAdapt--mEcC7olq') t_url = t_url.attr('href') # t_url = item.attr('a.doubleCardWrapperAdapt--mEcC7olq href') # 定位店名url shop_url = item.find('.TextAndPic--grkZAtsC a') shop_url = shop_url.attr('href') # 定位商品图片url img = item.find('.mainPicAdaptWrapper--V_ayd2hD img') img_url = img.attr('src') # 定位风格 style_list = item('div.abstractWrapper--whLX5va5 > div').items() style = [] for s in style_list: s_span = s('div.descBox--RunOO4S3 > span').text() if s_span != '': style.append(s_span) # 构建商品信息字典 product = { 'Page': page, 'Num': count-1, 'title': title, 'price': price, 'deal': deal, 'location': location, 'shop': shop, 'isPostFree': postText, 'url': t_url, 'shop_url': shop_url, 'img_url': img_url } print(product) # 商品信息写入Excel表格中 wb.cell(row=count, column=1, value=page) # 页码 wb.cell(row=count, column=2, value=count-1) # 序号 wb.cell(row=count, column=3, value=title) # 标题 wb.cell(row=count, column=4, value=price) # 价格 wb.cell(row=count, column=5, value=deal) # 付款人数 wb.cell(row=count, column=6, value=location) # 地理位置 wb.cell(row=count, column=7, value=shop) # 店铺名称 wb.cell(row=count, column=8, value=postText) # 是否包邮 wb.cell(row=count, column=9, value=t_url) # 商品链接 wb.cell(row=count, column=10, value=shop_url) # 商铺链接 wb.cell(row=count, column=11, value=img_url) # 图片链接 for i in range(0,len(style)): wb.cell(row=count, column=12+i, value=style[i]) # 风格1~3 count += 1 # 下一行 except Exception: print("get_goods函数错误!")# 翻页函数def page_turning(page_number): try: print("正在翻页: 第{}页".format(page_number)) # 强制等待2秒后翻页 time.sleep(2) # 找到“下一页”的按钮 submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/button[2]'))) submit.click() # 判断页数是否相等 wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/span[1]/em'), str(page_number))) print("已翻至: 第{}页".format(page_number)) except Exception as exc: print("page_turning函数错误!")# 爬虫main函数def Crawer_main(): try: # 搜索KEYWORD search_goods(KEYWORD) # 判断pageStart是否为第1页 if pageStart != 1: turn_pageStart() # 爬取PageStart的商品信息 get_goods(pageStart) # 从PageStart+1爬取到PageEnd for i in range(pageStart + 1, pageEnd+1): page_turning(i) get_goods(i) except Exception as exc: print("Crawer_main函数错误!")if __name__ == '__main__': # 建立Excel表格 try: ws = op.Workbook() # 创建Workbook wb = ws.create_sheet(index=0) # 创建worsheet # Excel第一行:表头 title_list = ['Page', 'Num', 'title', 'Price', 'Deal', 'Location', 'Shop', 'IsPostFree', 'Title_URL', 'Shop_URL', 'Img_URL', 'Style_1', 'Style_2', 'Style_3'] for i in range(0, len(title_list)): wb.cell(row=count, column=i + 1, value=title_list[i]) count += 1 # 从第二行开始写爬取数据 except Exception as exc: print("Excel建立失败!") # 开始爬取数据 Crawer_main() # 保存Excel表格 data = time.strftime('%Y%m%d-%H%M', time.localtime(time.time())) Filename = "{}_No.{}~{}_{}_FromTB.xlsx".format(KEYWORD,pageStart,pageEnd,data) ws.save(filename = Filename) print(Filename + "存储成功~")

【不足】不足之处,恳请批评指正,我们共同进步!

【鸣谢】特别感谢“芝士胡椒粉”的文章指导!

商铺名称、代码能正常运行但是Excel没有数据等问题,可能是淘宝网页更新了父元素类选择器的缘故,大家可以参照教程检查一下元素是否更新;若网页元素更新,则可参照教程自行修改;【爬虫】教你如何获取淘宝网页父元素类选择器标签(超详细)-CSDN博客

效果预览:

代码部分

引用第三方库

# 声明第三方库/头文件from selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom pyquery import PyQuery as pqimport timeimport openpyxl as op               #导入Excel读写库

【第三方库】主要运用到PyQuery、PyQuery解析和操作HTML文档,获取淘宝平台中某类商品的详细信息(商品标题、

pip install pyquerypip install seleniumpip install openpyxl

【ChromeDriver下载与安装】若运行过程中出现如下问题,可能是ChromeDriver版本与Chrome版本不一致导致,需要对ChromeDriver进行更新。翻页函数page_turning,搜索并点击“下一页”按键,判断页码是否相等;若页码相等获取该页商品列表信息;

2、商铺链接等),并基于第三方库openpyxl建立、若弹出登录窗口,使用手机“淘宝”APP,扫码登录(如图所示);

【注意】抓紧时间完成登录,若出现error,则重新运行代码,尽快登录;超时可能出现error

3、商品详情页链接、

【说明】若允许代码出现翻译错误、滑动页面至页码选择界面(如图所示),待页面所有信息加载完成后,输入数字“1”开始爬取当前页内容;

2、销量、商铺名称、将获取的信息写入字典和Excel表格中;

# 获取每一页的商品信息;def get_goods(page):    try:        # 声明全局变量count        global count        if input('确认界面加载完毕,输入数字“1”开始爬取-->') == 1:            pass        # 获取html网页        html = driver.page_source        doc = pq(html)        # 提取所有商品的共同父元素的类选择器        items = doc('div.content--CUnfXXxv > div > div').items()        for item in items:            # 定位商品标题            title = item.find('.title--qJ7Xg_90 span').text()            # 定位价格            price_int = item.find('.priceInt--yqqZMJ5a').text()            price_float = item.find('.priceFloat--XpixvyQ1').text()            if price_int and price_float:                price = float(f"{price_int}{price_float}")            else:                price = 0.0            # 定位交易量            deal = item.find('.realSales--XZJiepmt').text()            # 定位所在地信息            location = item.find('.procity--wlcT2xH9 span').text()            # 定位店名            shop = item.find('.shopNameText--DmtlsDKm').text()            # 定位包邮的位置            postText = item.find('.subIconWrapper--Vl8zAdQn').text()            postText = "包邮" if "包邮" in postText else "/"            # 定位商品url            t_url = item.find('.doubleCardWrapperAdapt--mEcC7olq')            t_url = t_url.attr('href')            # t_url = item.attr('a.doubleCardWrapperAdapt--mEcC7olq href')            # 定位店名url            shop_url = item.find('.TextAndPic--grkZAtsC a')            shop_url = shop_url.attr('href')            # 定位商品图片url            img = item.find('.mainPicAdaptWrapper--V_ayd2hD img')            img_url = img.attr('src')            # 定位风格            style_list = item('div.abstractWrapper--whLX5va5 > div').items()            style = []            for s in style_list:                s_span = s('div.descBox--RunOO4S3 > span').text()                if s_span != '':                    style.append(s_span)            # 构建商品信息字典            product = {                'Page':         page,                'Num':          count-1,                'title':        title,                'price':        price,                'deal':         deal,                'location':     location,                'shop':         shop,                'isPostFree':   postText,                'url':          t_url,                'shop_url':     shop_url,                'img_url':      img_url            }            print(product)            # 商品信息写入Excel表格中            wb.cell(row=count, column=1, value=page)                # 页码            wb.cell(row=count, column=2, value=count-1)             # 序号            wb.cell(row=count, column=3, value=title)               # 标题            wb.cell(row=count, column=4, value=price)               # 价格            wb.cell(row=count, column=5, value=deal)                # 付款人数            wb.cell(row=count, column=6, value=location)            # 地理位置            wb.cell(row=count, column=7, value=shop)                # 店铺名称            wb.cell(row=count, column=8, value=postText)            # 是否包邮            wb.cell(row=count, column=9, value=t_url)               # 商品链接            wb.cell(row=count, column=10, value=shop_url)           # 商铺链接            wb.cell(row=count, column=11, value=img_url)            # 图片链接            for i in range(0,len(style)):                wb.cell(row=count, column=12+i, value=style[i])     # 风格1~3            count += 1                                              # 下一行    except Exception:        print("get_goods函数错误!")

淘宝界面页码选择界面示意图:

获取商品列表信息示意图:

完整代码

【说明】考虑到浏览器请求数据时间长短不定,代码由“定时延时方式”改为“手动输入方式”以便留足时间等待数据请求完成;请求数据期间,可手动滑动淘宝界面,加载商品详情【注意:滑动到页面选择位置即可】加载完成后,输入数字“1”开始爬取当前页商品详情(如下图所示)。建立Excel表格,并设置第一行(表头);

2、地区、ChromeDriver服务请求淘宝(https://www.taobao.com)服务,模拟浏览器运行,找到“输入框”输入关键词KEYWORD,并点击“搜索”按键;

2、调用get_goods获取起始页PageStart的商品列表信息;

5、

# 翻页函数def page_turning(page_number):    try:        print("正在翻页: 第{}页".format(page_number))        # 强制等待2秒后翻页        time.sleep(2)        # 找到“下一页”的按钮        submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/button[2]')))        submit.click()        # 判断页数是否相等        wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/span[1]/em'), str(page_number)))        print("已翻至: 第{}页".format(page_number))    except Exception as exc:        print("page_turning函数错误!")# 翻页至第pageStar页def turn_pageStart():    try:        print("正在翻转:第{}页".format(pageStart))        # 滑动到页面底端        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")        # 滑动到底部后停留3s        time.sleep(3)        # 找到输入“页面”的表单,输入“起始页”        pageInput = wait.until(EC.presence_of_element_located(            (By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/span[3]/input')))        pageInput.send_keys(pageStart)        # 找到页面跳转的“确定”按钮,并且点击        admit = wait.until(EC.element_to_be_clickable(            (By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/button[3]')))        admit.click()        print("已翻至:第{}页".format(pageStart))    except Exception as exc:        print("turn_pageStart函数错误!")

“下一页”按键示意图:

获取商品列表信息代码

1、输出.xlsx格式文件。价格、详情页链接、ChromeDriver下载与安装:手把手教你,ChromeDriver下载与安装

全局定义

输入初始参数:

  • 爬取商品的关键词KEYWORD
  • 爬取网页的起始页pageStart
  • 爬取网页的终止页pageEnd
# 全局变量count = 1                           # 写入Excel商品计数KEYWORD = input('输入搜索的商品关键词Keyword:')# 要搜索的商品的关键词pageStart = int(input('输入爬取的起始页PageStart:'))# 爬取起始页pageEnd = int(input('输入爬取的终止页PageEnd:'))# 爬取终止页# 启动ChromeDriver服务options = webdriver.ChromeOptions()# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式options.add_experimental_option("excludeSwitches", ['enable-automation'])# 把chrome设为selenium驱动的浏览器代理;driver = webdriver.Chrome(options=options)# 反爬机制driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",                       {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})driver.get('https://www.taobao.com')# 窗口最大化driver.maximize_window()# wait是Selenium中的一个等待类,用于在特定条件满足之前等待一定的时间(这里是15秒)。存储于Excel表格中。# 如果一直到等待时间都没满足则会捕获TimeoutException异常wait = WebDriverWait(driver,10)# 打开页面后会强制停止10秒,请在此时手动扫码登陆

主函数

1、判断PageStart是否为1;若PageStart不为1,跳转至PageStart所在页;

4、