Python + selenium 爬取淘宝商品列表及商品评论[2021-08-26]

  • 主要内容
    • 登录淘宝
    • 获取商品列表
    • 获取评论信息
    • 存入数据库
    • 需要提醒

主要内容

通过python3.8+ selenium 模拟chrome操作进行淘宝商品列表及评论的爬取
还存在以下问题:
需要人扫二维码登录以便于绕过反爬机制(后面再优化)
评论爬取耗时比较长,因为页面加载完整后才能进行评论的爬取,而各类商品详情页的图片数量不同,导致加载时间不同,有的甚至要加载1-2min(也可能是公司网限制了购物网站的网速)

整体思路:
通过扫码登录淘宝,绕过反爬机制
通过关键字搜索,获取商品列表信息
逐一访问商品详情页面,获取商品评论信息
转df存入数据库(评论信息,满10个商品存一次)

登录淘宝

通过selenium登录淘宝主要有2种方式,一种是在代码中写入账号密码,并且加入滑块模拟绕过反爬,我自己觉得有点不靠谱,而且我一开始也是用这种思路,导致账号被锁了…所以我现在采取的思路是通过登录支付宝的登录页面,扫描二维码来间接登录淘宝,这样可以不需要滑块验证,目前还行.


def loginTB(item):# item 为你需要通过淘宝搜索的宝贝关键字browser.get('https://auth.alipay.com/login/index.htm?loginScene=7&goto=https%3A%2F%2Fauth.alipay.com%2Flogin%2Ftaobao_trust_login.htm%3Ftarget%3Dhttps%253A%252F%252Flogin.taobao.com%252Fmember%252Falipay_sign_dispatcher.jhtml%253Ftg%253Dhttps%25253A%25252F%25252Fwww.taobao.com%25252F&params=VFBMX3JlZGlyZWN0X3VybD1odHRwcyUzQSUyRiUyRnd3dy50YW9iYW8uY29tJTJG')# 设置显示等待  等待搜索框出现wait = WebDriverWait(browser, 180)wait.until(EC.presence_of_element_located((By.ID, 'q')))# 查找搜索框,输入搜索关键字并点击搜索text_input = browser.find_element_by_id('q')text_input.send_keys(item)btn = browser.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button')btn.click()

获取商品列表

两个函数,一个用于翻页,一个用于获取商品列表信息,需要嵌套使用

def get_TB_data():page_index = 1data_list = []while page_index > 0 :print("===================正在抓取第{}页===================".format(page_index))print("当前页面URL:" + browser.current_url)# 解析数据data_list += get_item_list(browser.page_source)# 设置显示等待  等待下一页按钮wait = WebDriverWait(browser, 60)try:wait.until(EC.presence_of_element_located((By.XPATH, '//a[@class="J_Ajax num icon-tag"]')))time.sleep(1)try:# 通过动作链,滚动到下一页按钮元素处write = browser.find_element_by_xpath('//li[@class="item next"]')ActionChains(browser).move_to_element(write).perform()except NoSuchElementException as e:print("爬取完毕!")page_index = 0breaktime.sleep(2)webdriver.ActionChains(browser).move_to_element(write).click(write).perform()page_index += 1return data_list

这里返回一个list,里面包含各商品列表的dic,最后会转df
这里需要注意的是shop_info = {} 一定要在循环内,否则因为python的指引问题,会导致list出错

def get_item_list(data):xml = etree.HTML(data)product_names = xml.xpath('//img[@class="J_ItemPic img"]/@alt')prices = xml.xpath('//div[@class="price g_price g_price-highlight"]/strong/text()')shop_names = xml.xpath('//div[@class="shop"]/a/span[last()]/text()')dteail_urls = xml.xpath('//div[@class="pic"]/a/@href')sales_volumes = xml.xpath('//div[@class="deal-cnt"]/text()')addresss = xml.xpath('//div[@class="location"]/text()')data_list = []for i in range(len(product_names)):shop_info = {}shop_info['item_name'] = product_names[i]shop_info['price'] = prices[i]shop_info['shop_name'] = shop_names[i]shop_info['salse_volume'] = sales_volumes[i]shop_info['address'] = addresss[i]shop_info['item_url'] = dteail_urls[i]with open('shop_data.json','a',encoding = 'utf-8') as f :f.write(json.dumps(shop_info, ensure_ascii=False) + '\n')data_list.append(shop_info)print('正在爬取第%s件商品'%(i+1))print('商品名称:%s'%product_names[i])print('商品单价:%s'%prices[i])print('店铺名称:%s'%shop_names[i])print('累计售卖:%s'%sales_volumes[i])print("-"*30)return data_list

获取评论信息

同样是2个函数,一个用于获取评论信息,一个用于总控(逐一切换商品详情页及翻页)

def get_comment(data_list):comment_dic = {}for i in range(len(data_list)):comment_list = []time.sleep(1)print('准备开始爬取第%s个商品的评论信息'%(i+1))z = 1while  z == 1:try:if data_list[i]['item_url'][0] =='/':browser.get('https:'+data_list[i]['item_url'])else:browser.get(data_list[i]['item_url'])time.sleep(3)browser.execute_script('window.scrollTo(0,'+str(100+random.random()*30)+')')browser.find_element_by_xpath('//div[@id="J_TabBarBox"]/ul/li[2]/a').click()comment_list = get_comment_info(browser.page_source)time.sleep(1)#翻页while True:try:next_page=browser.find_element_by_xpath('//div[@class="rate-page"]/div[@class="rate-paginator"]//a[contains(text(),"下一页>>")]')browser.execute_script("arguments[0].click();", next_page)comment_list += get_comment_info(browser.page_source)except NoSuchElementException as e:z = 0breakexcept:breakcomment_dic[data_list[i]['item_name']] = comment_listif i > 0  and i % 10 == 0:comment_df = pd.DataFrame(columns=('user_name','comment','com_time','com_add','item_name','insert_time'))for item_name , comments in comment_dic.items():comment_tmp = pd.DataFrame(comments)comment_tmp['item_name'] = item_namecomment_tmp['insert_time'] = dt.datetime.now().strftime('%Y-%m-%d %H:%M:%S')comment_df = pd.concat([comment_df,comment_tmp])data2mysql(comment_df,'comment_list')comment_dic = {}

获取评论信息,如果该商品没有评论则跳过
是否有追评会导致XPATH不一样,要注意
同时要注意如果评论内容里面有moji表情,会导致存入数据库出现问题,所以要剔除

def get_comment_info(text):source = etree.HTML(text)user_name = re.findall('<div class="rate-user-info">(.*?)</div>',text)if len(user_name) > 0:info_list = source.xpath('//div[@class="rate-grid"]/table/tbody/tr')    com_list = []for i in range(len(info_list)):item = {}item['user_name'] = user_name[i].replace('<span>','').replace('</span>','')if info_list[i].xpath('./td[1]/div[@class="tm-rate-premiere"]'):item['comment'] = info_list[i].xpath('./td[1]/div[@class="tm-rate-premiere"]//div[@class="tm-rate-content"]/div[@class="tm-rate-fulltxt"]/text()')[0]item['com_time'] = info_list[i].xpath('./td[1]/div[@class="tm-rate-premiere"]/div[@class="tm-rate-tag"]//div[@class="tm-rate-date"]/text()')[0]item['com_add'] = info_list[i].xpath('./td[1]/div[@class="tm-rate-append"]//div[@class="tm-rate-content"]/div[@class="tm-rate-fulltxt"]/text()')[0]else:item['comment'] = info_list[i].xpath('./td[1]/div[@class="tm-rate-content"]/div[@class="tm-rate-fulltxt"]/text()')[0]item['com_time'] = info_list[i].xpath('./td[1]/div[@class="tm-rate-date"]/text()')[0]item['com_add'] = ''item['comment'] = str(bytes(item['comment'], encoding='utf-8').decode('utf-8').encode('gbk', 'ignore').decode('gbk'))item['comment'] = item['comment'].replace(' ','')print('爬取到评论信息')print('用户名:%s'%item['user_name'])print('评论时间:%s'%item['com_time'])print('评论内容:%s'%item['comment'])print('追加评论:%s'%item['com_add'])print("-"*30)com_list.append(item)else:print('此商品没有评论')return com_list

存入数据库

def data2mysql(df,table_name):engine = ('mysql+pymysql://root:xxxxx@localhost:3306/selenium_taobao_pachong?charset=utf8')df = df.applymap(str)df.to_sql(name = table_name ,con = engine, if_exists = 'append',index = False,index_label = False)

需要提醒

如果被反爬锁定了,可以尝试下取消chrome的开发模式,以及自动检测来绕过,如果还不行的话,就需要在chrome的驱动程序上进行修改了,但是windows系统好像不太好弄.这也是为什么选择扫描二维码的形式进行登录,并且大量使用sleep来放慢速度
u1s1,淘宝技术还是可以的

chrome_options = webdriver.ChromeOptions();
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']);
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
browser = webdriver.Chrome(options=chrome_options)

Python + selenium 爬取淘宝商品列表及商品评论 2021-08-26相关推荐

  1. python +selenium 爬取淘宝网商品信息

    前几天用python爬取豆瓣关于电影<长城>的影评,发现豆瓣的网页是静态的,心中一阵窃喜.以为对于动态网页了解的不是太多.但是主要是用cookie加headers爬取的.效果还不错,爬取了 ...

  2. 吃货们看好了!python+selenium爬取淘宝美食

    前言 今天为大家介绍一个利用Python的selenium打开浏览器的方式来爬去淘宝美食,这个小案例涵盖了selenium的基本知识点,如何打开浏览器以及关键字的搜索 导入第三方库 打开浏览器 搜索功 ...

  3. python +Selenium 爬取淘宝商品评论

    第一步 现在淘宝防爬取做的比较好,如果直接爬的话总是出现登陆界面.从而获取不到信息. 解决办法,新建 淘宝.py import json from selenium import webdriver ...

  4. Python selenium 爬取淘宝商品

    Catalog 翻页 获取动态页面信息 提取商品信息 完整代码 翻页 from urllib import parse domain = 'https://s.taobao.com/search?' ...

  5. 使用python selenium爬取淘宝商品信息 自动登录淘宝和爬取某一宝贝的主图,属性图和详情图等等

    selenium作为一个自动化测试工具非常好用,谁用谁知道啊. 先说如何登录淘宝,淘宝现在直接用会员名和密码登录会有滑块验证,找了网上说的几种方法和自己尝试了一番效果还是不太理想,实测过程中,即使滑块 ...

  6. python+selenium爬取淘宝商品信息+淘宝自动登录——爬虫实战

    1.前言 继续学习爬虫内容,这回是以selenium模拟操作进行抓取,其中有几个需要登陆的注意事项. 2.自动登陆+查找页面 由于现在淘宝的反爬机制,需要登陆才好下一步操作.在搜索输入后页面会调入登陆 ...

  7. Python爬虫爬取淘宝、天猫某商品页面相关信息实例

    一.爬取天猫店铺的相关信息 URL="https://detail.tmall.com/item.htm?spm=a230r.1.14.8.4a1a115fb1rHn5&id=617 ...

  8. Python + selenium 爬取淘宝网(销量,店铺名,价格等)

    import time from selenium import webdriver from lxml import etreedef Run(keywords, numPage):# 构造无头的C ...

  9. selenium爬取淘宝商品基础数据以及商品详情(茶叶数据)

    selenium爬取淘宝商品基础数据以及商品详情 目录 网页分析 确定要爬取的数据 分析网页构成 爬取流程 登入 爬取基础数据以及商品详情 爬取基础数据 爬取商品详情 淘宝滑动验证码 保存EXCEL中 ...

最新文章

  1. Git log高级用法
  2. mysql数据库优化的几种方法
  3. 计算机语言表示教师节快乐,表达教师节快乐的微信祝福语大汇总54句
  4. 关于Java开发需要注意的十二点流程
  5. 从抵触到力推,.Net Core的成功让微软正视开源
  6. 第36课 天连碧水碧连天 《小学生C++趣味编程》
  7. 2017.3.21 树网的核 思考记录
  8. 二维正则表达式v0.1
  9. t–sql pl–sql_T-SQL for DBA –使用T-SQL进行快速数据分析的三种方法
  10. 机器学习初探(手写数字识别)matlab读取数据集
  11. 前端框架中的大熊猫Ember
  12. win10清除磁盘写保护
  13. 苹果元数据被拒回复邮件多久_聊聊苹果账号被调查这事
  14. 【观察】从新华三2022十大技术趋势,看数字化如何重塑未来社会
  15. 您好,高雅症患者 穆穆-movno1推荐
  16. 【阿里云】DCDN全站加速介绍及配置
  17. Educational Codeforces Round 132 (Rated for Div. 2) 题解(A~D)
  18. esp01s ntp TM1637 数码管时钟源代码
  19. 流量分析实战(1⃣️)_2014_11_16
  20. Qt多功能计算器(四)——base64加密和解密

热门文章

  1. 2020年最新的PTCMS完美修复版小说模板蜻蜓听书、四色风格、带朗读的
  2. python语言的计算生态规模有多大_【单选题】Python 语言的一个重要特点是它有较多的计算生态,简单理解为第三方提供的可用编程模块 / 函数库 / 组件,这个规模有多大?...
  3. javascript格式化输出的实现(MuJS)
  4. springboot毕设项目基于数据可视化的云山川景点日推交流平台gox2x(java+VUE+Mybatis+Maven+Mysql)
  5. GPRS技术在紫金桥组态软件中的应用
  6. 【必备技能】SCI 投稿各阶段邮件万能套用模板!
  7. 科研入门:文献检索,阅读技巧及工具使用
  8. windows10连接共享打印机报错:操作无法完成(错误 0x00000709)
  9. 快速了解自动化测试工具Parasoft vs Fortify功能对比
  10. 矩阵乘法分配律+bitset优化——hdu4920