如图需要获取小米11的用户评论 网址:https://item.jd.com/100009958327.html
1.分析网页会发现利用selenium不用处理复杂的反爬会比较好(不过在此需要对selenium有扎实的基本功)
我们需要获取的信息有:
买 家 昵 称 , 手机颜色, 配置, 评 论 时 间, 买 家 评 星, 评论
2.接下来导入模块创建浏览器对象:
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options import csv from time import sleep web = Chrome() web.implicitly_wait(5) # 隐式等待5秒 web.get('https://item.jd.com/100009958327.html')
3.当我们浏览器打开这个网页的时候会发现评论信息根本无法加载处理,因为这是一个Ajas请求,利用js代码下拉滚动条加载数据,把下拉条拖到最下面即可
js = 'var a = document.documentElement.scrollTop=1000000' # js代码滚动条下拉 web.execute_script(js) sleep(1) web.execute_script(js)
4.定位到需要获取的数据
# 用户昵称 user_name_list = web.find_elements_by_xpath("//div[@class='user-info']") # 评星 star = web.find_elements_by_xpath('//div[@class="comment-column J-comment-column"]/div[1]') # 手机颜色 color = web.find_elements_by_xpath('//div[@class="comment-message"]/div[@class="order-info"]/span[1]') # 手机配置 conf = web.find_elements_by_xpath('//div[@class="comment-message"]/div[@class="order-info"]/span[2]') # 评论时间 p_time = web.find_elements_by_xpath( '//div[@class="comment-message"]/div/span[last()]') # /span[last()] #获取最后一个span标签 # 评论 comments = web.find_elements_by_xpath('//div[@class="comment-column J-comment-column"]/p')
5.设置csv文件打开格式写入表头
header = ['买 家', '手机颜色', '配置', '评 论 时 间', '买 家 评 星', '评论'] with open('小米11京东用户评论.csv', mode='w', encoding='gbk',newline='') as f: writer = csv.DictWriter(f, header) # 以字典的方式写入 # 写入表头信息需要调用writeheader() writer.writeheader()
6.把数据保存到csv文件中 (注意:这里抓取下来的评论文本下面有空白字符和\n,需要单独处理一下)
for i in range(len(user_name_list)): item = i + 1 + a * 10 com = comments[i].text.replace(r'\n', '').strip() # 处理\n和空白字符 dic = {'买 家': user_name_list[i].text, '手机颜色': color[i].text, '配置': conf[i].text, '评 论 时 间': p_time[i].text, '买 家 评 星': star[i].get_attribute('class').split(' ')[-1], '评论': com} writer.writerow(dic) print(dic) print('第%d条保存成功!' % item)
7.点击获取下一页标签 需要注意的是这个标签是上面被嵌套了多层,如果不做处理selenium点击会报错
需要利用js代码实现
app = web.find_element_by_xpath('//a[text()="下一页"]') # 定位下一页 web.execute_script("arguments[0].click();", app) # 利用js处理element click intercepted异常方法
这样就基本实现了,祝大家好运!
成果图:
完整代码如下:
#抓取京东商城 小米11 用户评论
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.keys import Keys import csv from time import sleep
opt = Options() # 创建对象 opt.add_argument('--headless') opt.add_argument('--disable-gpu') web = Chrome(options=opt) web.implicitly_wait(5) # 隐式等待5秒 web.get('https://item.jd.com/100009958327.html') header = ['买 家', '手机颜色', '配置', '评 论 时 间', '买 家 评 星', '评论'] with open('小米11京东用户评论.csv', mode='w', encoding='gbk',newline='') as f: writer = csv.DictWriter(f, header) # 以字典的方式写入 # 写入表头信息需要调用writeheader() writer.writeheader() a = 0 while 1: js = 'var a = document.documentElement.scrollTop=1000000' # js代码滚动条下拉 web.execute_script(js) sleep(1) web.execute_script(js) user_name_list = web.find_elements_by_xpath("//div[@class='user-info']") star = web.find_elements_by_xpath('//div[@class="comment-column J-comment-column"]/div[1]') color = web.find_elements_by_xpath('//div[@class="comment-message"]/div[@class="order-info"]/span[1]') conf = web.find_elements_by_xpath('//div[@class="comment-message"]/div[@class="order-info"]/span[2]') p_time = web.find_elements_by_xpath( '//div[@class="comment-message"]/div/span[last()]') # /span[last()] 获取最后一个span标签 comments = web.find_elements_by_xpath('//div[@class="comment-column J-comment-column"]/p') 用户评论.xls') for i in range(len(user_name_list)): item = i + 1 + a * 10 com = comments[i].text.replace('\n', '').strip() dic = {'买 家': user_name_list[i].text, '手机颜色': color[i].text, '配置': conf[i].text, '评 论 时 间': p_time[i].text, '买 家 评 星': star[i].get_attribute('class').split(' ')[-1], '评论': com} # 这里太长不好拷贝,就是一个字典 writer.writerow(dic) print(dic) print('第%d条保存成功!' % item) app = web.find_element_by_xpath('//a[text()="下一页"]') # 点击下一页 web.execute_script("arguments[0].click();", app) # 利用js处理异常方法 sleep(1) a += 1 if a >= 2: # 这里默认20条数据 web.quit() # 记得关闭浏览器 break
最后:有兴趣的朋友还可以对数据做简单的分析:
下面是在jupyter notebook上利用numpy,pandas,matplotlib,对数据进行简单分析和可视化
以下是抓取了830条有效数据进行分析
# 这是用户选择的手机颜色,由此可见大部分蓝色和黑色比较让人喜欢
# 这是用户选择手机配置的分布图,用户整体偏向于中高配置
# 通过评论时间大概估测每个月的销量,其中1月销量最高,毕竟手机才刚刚发布
# 好评率还是蛮高!
# 其中一条评论最长的用户是....居然有500字,在下不得不佩服,这文采值得学习
手机黑色的我以为会很丑 拿回来才发现 很喜欢这个颜色,打游戏90帧真好、拍照和音质都挺好的 手机这个壁纸我特别喜欢。喜欢买的朋友 早买早享受手机各方面性能都特别好,也是米粉一枚,就是米11的手机放歌后盖震动小缺陷其他都挺好,反正平时都是耳机听歌问题不大,充电大概要45分钟左右充满,像素杠杠的,本来想等Pro的,忍不住要换了,不知道还要多久才发布也不一定抢得到,考虑了很久还是决定换了11,幸好闺蛮推荐的,用这个京东活动限时绢9栢那,是聊天工具PRO再连上了8再65。总体来说都很棒!屏幕显示效果真的是很不错,非常细腻,拍照效果也非常好,电池续航还可以,一直玩耗电就快,什么手机都一样,正常用一天一充没问题,通话质量也没问题很清晰。音乐开大后盖确实有共振,不过也不影响使用像素超级棒,原相机也能扛得住 电池续航:还可以,中度用的话,白天充一次电吧 运行速度:我买的12+256,超级快 种草好久的米11,终于没有让我失望,值得买。对于说CPU翻车的,对我来说无所谓,我不玩大型游戏。 显示效果:色彩很棒,多肉边边的毛也可以拍出来昨天到的货,试了一天才来评价,第一感觉让我觉得手机很轻薄,骁龙888处理
额 ..大家都知道小米为发烧而生,想知道评论里面出现关于发热发烧的数量吗?别说了我也想知道.
果然不出我所料
830条数据就有105位网友吐槽手机发热,占比 12.65%
有兴趣的朋友,欢迎加个好友一起进步!