[python]利用selenium模拟用户操作抓取天猫评论数据

准备:

python3.5

安装selenium包

第一种方法:

cmd里输pip install selenium,但是经常报错

第二种方法:

下载安装包-cmd进入解压路径-python setup.py install-报错permission denied-右键安全更改报错文件夹权限为完全控制-再次安装成功
unknown error: unable to discover open pages-下载chromedriver放在环境变量目录下
测试自动打开百度时提示“您使用的是不受支持的命令行标记”-更改chromedriver版本为对应版本即可

安装包下载地址:https://pypi.python.org/pypi/selenium

chromedriver与chrome版本映射及下载地址:http://blog.csdn.net/huilan_same/article/details/51896672

实现:

selenium基本上就是模拟打开浏览器,向下滑动点击评论tab点击下一页等过程。由于selenium只能对显示在屏幕范围内的元素操作,所以滚动条操作很重要。

def deal_recommends_infos(url):
    if not url.startswith(‘http‘):
        url = ‘https:‘ + url

    print(‘开始寻找评论:‘ + url)
    driver = webdriver.Chrome()
    driver.maximize_window() # 全屏 

    timeout = 30
    try:
        driver.get(url)
        WebDriverWait(driver, timeout).until(
            EC.presence_of_element_located((By.ID, "J_TabBarBox"))  # 判断页面是否初步加载成功的标记
        )
    except TimeoutException:
        print(‘宝贝链接未加载成功‘)

    try:
        # 页面上拉600,看到TabBarBox
        js = "window.scrollTo(0,600)"
        driver.execute_script(js)
    except WebDriverException:
        print(‘上拉寻找评论区时出现问题‘)
    time.sleep(2)
    # 点击累计评论TAB
    driver.find_element_by_xpath(‘//*[@id="J_TabBar"]/li[2]‘).click()
    time.sleep(4)
    print(‘成功点击累计评论TAB‘)

    try:
        # rate-grid的正则表达式
        driver.find_element_by_xpath(‘//*[@id="J_Reviews"]/div/div[6]‘)
    except NoSuchElementException:
        print(‘评论信息中元素还未加载‘)
    print(‘已经成功加载到评论区信息‘)

    for i in range(2):
        try:

            js = "window.scrollTo(0,2500)"
            driver.execute_script(js)
            time.sleep(2)
            # 点击下一页
            driver.find_element_by_css_selector(‘#J_Reviews > div > div.rate-page > div > a:last-child‘).click()

        except WebDriverException:
            js = "window.scrollTo(0,3500)"
            driver.execute_script(js)
            time.sleep(2)
            # 点击下一页
            driver.find_element_by_css_selector(‘#J_Reviews > div > div.rate-page > div > a:last-child‘).click()
        except NoSuchElementException:
            print(‘找不到翻页按钮‘)
            continue
        print(‘已成功点击下一页‘)
        soup = BeautifulSoup(driver.page_source, "lxml")
        print(get_recommends_infos(soup))

    print(‘完成该链接的评论抓取‘)

要注意的点:

浏览器要全屏,缺少这个操作的话很容易出现bug,我猜是因为天猫商城右下角的二维码妨碍了鼠标点击。

下拉网页点击下一页时,由于天猫商城每页的评论长度不是那么确定,设置绝对值容易出现拉不到或者拉过了的情况,要做一个try语句。

target = driver.find_element_by_css_selector(‘#J_Reviews > div > div.rate-page > div > a:last-child‘)
driver.execute_script("arguments[0].scrollIntoView();",target) #拖动到可见的元素去

我尝试用以上代码来滚动到指定元素可见,但是总报is not clickable at point (1030, 19). Other element would receive the click:查了下是被天猫商城那个手机购买的二维码挡住了……现在暂时没有解决方案,只能先拉2500,不够就再加个1000。

理论上来说

soup = BeautifulSoup(driver.page_source, "lxml")
print(get_recommends_infos(soup))

这两句应该是放在点击下一页之前的,但是不知道为啥这样就会出现把第一页抓取两遍的情况。神tm换下代码顺序就正常了,想不通为什么这样结果对,我再慢慢研究吧。

#提取评论信息
def get_recommends_infos(s):
    comment = s.find("div",class_="rate-grid")
    comment_data = comment.find_all("tr")
    lst1=[]
    #逐行读取
    for i in comment_data:
        goodstype_lst=[]
        username_lst=[]
        #comment1为初次评论,comment2为追加评论,reply1为商家初次回复,reply2为商家追加回复,goodstype为商品类型,username为用户名
        dic={‘comment1‘: ‘‘,‘reply1‘:‘‘,‘comment2‘: ‘‘,‘reply2‘:‘‘, ‘goodstype‘: goodstype_lst, ‘username‘: username_lst}
        try:
            content1=i.find(‘div‘,class_="tm-rate-premiere").find(‘div‘,class_="tm-rate-content")
            dic[‘comment1‘]=content1.text
        except:
            content1=i.find(‘div‘,class_="tm-rate-content").find(‘div‘,class_="tm-rate-fulltxt")
            dic[‘comment1‘]=content1.text
        try:
            content2=i.find(‘div‘,class_="tm-rate-append").find(‘div‘,class_="tm-rate-content")
            dic[‘comment2‘]=content2.text
        except:
            dic[‘comment2‘]=‘null‘

        try:
            reply1=i.find(‘div‘,class_="tm-rate-premiere").find(‘div‘,class_="tm-rate-reply")
            dic[‘reply1‘]=reply1.text
        except:
            try:
                reply2=i.find(‘div‘,class_="tm-rate-append").find(‘div‘,class_="tm-rate-reply")
                dic[‘reply1‘]=‘null‘
            except:
                try:
                    reply1=i.find(‘div‘,class_="tm-rate-reply")
                    dic[‘reply1‘]=reply1.text
                except:
                    dic[‘reply1‘]=‘null‘
        try:
            reply2=i.find(‘div‘,class_="tm-rate-append").find(‘div‘,class_="tm-rate-reply")
            dic[‘reply2‘]=reply2.text
        except:
            dic[‘reply2‘]=‘null‘
        goodstype=i.find(‘div‘,class_="rate-sku").find_all(‘p‘)
        for b in goodstype:
            goodstype_lst.append(b.attrs[‘title‘])
        username=i.find_all(‘div‘,class_="rate-user-info")
        for c in username:
            username_lst.append(c.text)
        lst1.append(dic)
    return lst1

要注意的点:

初次评论:如果有追加评论的话div会被分成class=tm-rate-premiere和tm-rate-append两块,这两块里面又分别有tm-rate-content,没有追加评论的情况下评论就是tm-rate-content一整块。因此直接用BeautifulSoup找tm-rate-content是有问题的,可能会找到两个评论。

追加评论:这个比较好判断,没有tm-rate-append的话就没有追加评论

初次回复:回复情况分为下表6种,其中有初次回复的分为1、2、5共3种,先通过find(‘div‘,class_="tm-rate-premiere").find(‘div‘,class_="tm-rate-reply")把1选出来了,剩下5种中,把3排除掉,第一个被找到的tm-rate-reply就是初次回复。

序号 追评 初次回复 追评回复
1
2
3
4
5
6

追加回复:通过find(‘div‘,class_="tm-rate-append").find(‘div‘,class_="tm-rate-reply")把1、3选出来了,剩下的都为null

 参考:

Python利器之使用Selenium模拟用户操作抓取天猫评论数据 - 知乎专栏

Python爬虫利器五之Selenium的用法 | 静觅

Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺 | 静觅

通过Python抓取天猫评论数据

Python Package Index

时间: 2024-08-24 10:52:41

[python]利用selenium模拟用户操作抓取天猫评论数据的相关文章

python爬虫入门(五)Selenium模拟用户操作

爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库. 这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(xxx.xxx.xxx.xxx)这个用户,并且 user-agent 还是 Python-urllib/2.7 ,基于这两点判断非人类后直接在服务器上封杀

利用Python批量抓取京东评论数据

京东图书评论有非常丰富的信息,这里面就包含了购买日期.书名.作者.好评.中评.差评等等.以购买日期为例,使用Python + Mysql的搭配进行实现,程序不大,才100行.相关的解释我都在程序里加注了: 1 from selenium import webdriver 2 from bs4 import BeautifulSoup 3 import re 4 import win32com.client 5 import threading,time 6 import MySQLdb 7 8

利用selenium并使用gevent爬取动态网页数据

首先要下载相应的库 gevent协程库:pip install gevent selenium模拟浏览器访问库:pip install selenium selenium库相应驱动配置  https://www.cnblogs.com/Niuxingyu/p/10490882.html #导包 import gevent #猴子补丁 from gevent import monkey monkey.patch_all() import requests import os import re f

Android手机上,利用bat脚本模拟用户操作

---- 那么你就可以来看看这篇帖子了. 言归正传 利用bat脚本模拟用户操作,需要用到两点: ①就是adb命令了,adb命令可以用来模拟用户在手机上的操作 ②bat语言,就是批处理语言,主要用来进行逻辑处理,跟众多语言语法一样,批处理语言也包括for循环.if语句之类的语法: 一.adb命令 首先我们来介绍模拟用户在手机上操作的adb命令 input keyevent //发送键盘事件 用法说明: adb shell input keyevent "value" usage: inp

python下selenium模拟浏览器基础操作

1.安装及下载 selenium安装: pip install selenium  即可自动安装selenium geckodriver下载:https://github.com/mozilla/geckodriver/releases Chromedriver下载:http://npm.taobao.org/mirrors/chromedriver/ 2.保存路径 将下载好的geckodriver以及Chromedriver解压到桌面,打开我的电脑,找到Python文件夹中anancode文件

python自然语言处理1——从网络抓取数据

python自然语言处理1--从网络抓取数据 写在前面 本节学习python2.7 BeautifulSoup库从网络抽取数据的技术,检验之简而言之就是爬虫技术.网络编程是一门复杂的技术,在需要基础的地方,文中给出的链接地址,都是很好的教程,可以参考,我在这里不在重复发明轮子.本节的主旨在于: 帮助快速掌握基本爬虫技术,形成一条主线,能为自己的实验构造基础数据.掌握爬虫技术后,可以从网络抓取符合特定需求的数据供分析,这里学习的爬虫技术适用于数据挖掘.自然语言处理等需要从外部挖掘数据的学科. 1.

利用fiddler抓取Android app数据包

前言 做Android开发的朋友经常需要做网络数据的获取和提交表单数据等操作,然而对于调试程序而言,很难知道我们的数据到底是以怎样的形式发送的,是否发送成功,如果发送失败有是什么原因引起的.fiddler工具为我们提供了很方便的抓包操作,可以轻松抓取浏览器的发出的数据,不管是手机APP,还是web浏览器,都是可以的. 什么是fiddler 百度百科上是这样说的:Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出&quo

微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的"有趣",寻找那份或有或无的存在感. 有人选择在朋友圈记录生活的点滴,有人选择在朋友圈展示自己的观点.有时我们想去展示自己,有时又想去窥探着别人的生活,而有时又不想别人过多的了解自己的生活,或是屏蔽对方,或是不给对方看朋友圈,又或是不

Python结合BeautifulSoup抓取知乎数据

本文主要介绍利用Python登录知乎账号,抓取其中的用户名.用户头像.知乎的问题.问题来源.被赞数目.以及回答者.其中数据是配合Beautiful Soup进行解析的. 首先,要解决的是知乎登录问题.在程序中登录知乎我们直接提供用户名和密码是无法进行登录的,这里我们采用一个比较笨拙的办法直接在发送请求过程中附带上cookies.这个cookies值我们可以通过在火狐浏览器登录知乎时用firebug直接捕获.cookies获取如下图所示: [info] email =youremail passw