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

时间:2022-12-11 00:11:48

更新

其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个。

可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经不可能了。那本节就带大家抓取匿名旺旺号熟悉一下Selenium吧。

2016/7/1

前言

嗯,淘宝,它一直是个难搞的家伙。

而且买家在买宝贝的时候大多数都是匿名评论的,大家都知道非匿名评论是非常有用的,比如对于大数据分析,分析某个宝贝的购买用户星级状况等等。

现在已经不能获取非匿名了,此句已没有意义了。

对于抓淘宝,相信尝试过的童鞋都能体会到抓取它到艰辛,最简单的方法莫过于模拟浏览器了,本节我们就讲解一下利用 Selenium 抓取淘宝评论的方法。

项目提供了如下功能:

  • 输入淘宝关键字采集淘宝链接并写入到文件
  • 从文件读取链接,执行评论采集
  • 将评论和旺旺号保存到Excel中
  • 记录当前采集链接索引,保存进度

准备工作

在开始本节之前

你需要了解一些基础知识,我们需要用到 Selenium 这个东西,详情请看

Selenium用法

我们首先讲解一下你需要做怎样的配置。

首先你需要安装 Python,版本是2.7

然后需要安装的 Python 类库。

 
1
pip install pyquery selenium twisted requests xlrd xlwt xlutils

安装浏览器 Chrome,安装浏览器 Chrome,安装浏览器Chrome。

然后下载ChromeDriver,ChromeDriver是驱动浏览器的工具,需要把它配置到环境变量里。

有的童鞋说,为什么不用 PhantomJS,因为为了防止淘宝禁掉我们,需要登录淘宝账号,登录过程可能会出现奇奇怪怪得验证码,滚动条,手机验证,如果用 PhantomJS 的话不方便操作,所以在这里我们就使用 Chrome 了。

ChromeDriver

上面是 ChromeDriver 的下载地址,谷歌都上得了,这个不在话下吧,这是最官方的版本,其他链接请自行搜索。

找到对应平台的 ChromeDriver,解压后将可执行文件配置到环境变量里,配置到环境变量里,配置到环境变量里!重要的话说三遍。

流程简述

首先我们拿一个例子来演示一下全过程。

随意打开天猫一个链接

示例链接

我们首先观察一下评论,可以发现所有的评论都是匿名的。即使这个用户不是匿名评论的,那也会显示匿名,淘宝这保密做的挺好。

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

心机的淘宝啊,那我们如果想获取一些旺旺号该咋办?

接下来我们返回宝贝详情页面,然后一直下拉下拉,拉到最最后,可以看到有个“看了又看”板块。

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

有没有!!发现了新大陆,这是什么?这是此宝贝相关宝贝以及它的一些评论。

看到了有非匿名用户了,哈哈哈,淘宝加密了评论,推荐部分却没有加密。

嗯,就从这里,我们把它们的旺旺号都抓下来,顺便把评论和购买的宝贝抓下来。

现在已经全部改成了匿名,上述话已经无意义了。

那么抓取完之后,保存到哪里呢?为了便于管理和统计,在这里保存到 Excel 中,那么就需要用到 xlrd, xlwt, xlutils 等库。

嗯,动机就是这样。

实战爬取

抓取过程

首先我们观察这个链接,在最初的时候,其实网页并没有加载最下方的“看了又看”内容的,慢慢往下滑动网页,滑到最下方之后,才发现看了又看页面才慢慢加载出来。

很明显,这个地方使用了Ajax,由于我们用的是 Selenium,所以这里我们不能直接来模拟 Ajax 的 Request,需要我们来模拟真实的用户操作。

所以我们要模拟的就是,在网页部分加载出来之后,模拟浏览器滑动到下方,使“看了又看”内容显示出来,然后获取网页源代码,解析之即可。

那么在这里就出现了两个至关重要的点,一个是判断网页框架大体加载出来,另一个是模拟滑动直到最下方的内容加载出来。

首先,我们解决第一个问题,怎样判断网页框架大体加载出来。我们可以用网页中的某个元素的出现与否来判断。

比如

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

这一部分是否加载出来。

审查一下代码,ID叫做 J_TabBarBox,好,那就用它来作为网页初步加载成功的标志。

在 Selenium 中,我们用显式等待的方法来判断该元素是否已经加载成功。

 
1
2
3
4
5
6
7
8
9
10
try:
    driver.get(url)
    WebDriverWait(driver, timeout).until(
        EC.presence_of_element_located((By.ID, "J_TabBarBox"))
    )
except TimeoutException:
    return False
if is_recommends_appear(driver, max_scroll_time):
    print u'已经成功加载出下方橱窗推荐宝贝信息'
    return driver.page_source

接下来我们需要模拟下拉浏览器,不妨直接下拉到底部,再从底部向上拉,可能需要下拉多次,所以在这里定义了一个下拉次数,那么判断“看了又看”正文内容是否出现依然可以用显式等待的方法。

浏览器审查元素发现它的选择器是 #J_TjWaterfall li

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

那么可以用如下方法来判断是否加载成功

 
1
2
3
4
5
try:
    driver.find_element_by_css_selector('#J_TjWaterfall li')
except NoSuchElementException:
    return False
return True

下拉过程可以用执行 JavaScript 的方法实现。

 
1
2
js = "window.scrollTo(0,document.body.scrollHeight-" + str(count * count* 200) + ")"
driver.execute_script(js)

其中 count 是下拉的次数,经过测试之后,每次拉动距离和 count 是平方关系比较科学,具体不再描述,当然你可以改成自己想要的数值。

嗯,加载出来之后,就可以用

 
1
driver.page_source

来获取网页源代码了

用 pyquery 解析即可。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        doc = pq(html)
        items = doc('#J_TjWaterfall > li')
        print u'分析得到下方宝贝中的用户评论:'
        for item in items.items():
            url = item.find('a').attr('href')
            if not url.startswith('http'):
                url = 'https:' + url
            comments_info = []
            comments = item.find('p').items()
            for comment in comments:
                comment_user = comment.find('b').remove().text()
                comment_content = comment.text()
                anonymous_str = config.ANONYMOUS_STR
                <del>if not anonymous_str in comment_user:</del>   #此句本来用来判断是否匿名,现淘宝已修复该漏洞,只能抓取全部匿名的了
                    comments_info.append((comment_content, comment_user))
            info.append({'url': url, 'comments_info': comments_info})
        return info

然后保存到 Excel 中。

运行结果截图

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

可以发现,另外提供了先登陆后爬取的功能,然后保存了爬取进度。

采集链接

刚才我们测试的链接是哪里来的?我们不能一个个去找吧?所以,在这里又提供了一个采集链接的过程,将采集的链接保存到文本,然后抓取的时候从文本读取一个个链接即可。

所以在这里我们模拟搜索的过程,关键字让用户输入,将搜索的链接采集下来。

在此 Selenium 模拟了输入文字,点击按钮和翻页的功能。

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

核心代码如下

下面的方法模拟了加载出搜索框之后输入文字点击回车的过程,将网页的结果返回。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def get_results(keyword):
    driver = config.DRIVER
    link = config.SEARCH_LINK
    driver.get(link)
    try:
        WebDriverWait(driver, config.TIMEOUT).until(
            EC.presence_of_element_located((By.ID, "mq"))
        )
    except TimeoutException:
        print u'加载页面失败'
    try:
        element = driver.find_element_by_css_selector('#mq')
        print u'成功找到了搜索框'
        keyword = keyword.decode('utf-8', 'ignore')
        print keyword
        print u'输入关键字', keyword
        for word in keyword:
            print word
            element.send_keys(word)
        element.send_keys(Keys.ENTER)
    except NoSuchElementException:
        print u'没有找到搜索框'
    print u'正在查询该关键字'
    try:
        WebDriverWait(driver, config.TIMEOUT).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#J_ItemList div.productImg-wrap"))
        )
    except TimeoutException:
        print u'查询失败'
    html = driver.page_source
    return html

下面的方法模拟了翻页的过程,到指定的翻页数目为止

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def get_more_link():
    print u'正在采集下一页的宝贝链接'
    driver = config.DRIVER
    try:
        js = "window.scrollTo(0,document.body.scrollHeight)"
        driver.execute_script(js)
    except WebDriverException:
        print u'页面下拉失败'
    try:
        next = driver.find_element_by_css_selector('#content b.ui-page-num > a.ui-page-next')
        next.click()
    except NoSuchElementException:
        print u'找到了翻页按钮'
    driver.implicitly_wait(5)
    try:
        WebDriverWait(driver, config.TIMEOUT).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#J_ItemList div.productImg-wrap"))
        )
    except TimeoutException:
        print u'查询失败'
    html = driver.page_source
    parse_html(html)

运行结果截图

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

采集到到内容保存到 urls.txt 中

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

嗯,这下采集链接和爬取链接都有了。

代码放送

扯了这么多,许多童鞋已经蠢蠢欲动了,大声告诉我你们想要的是什么?

哦没错!代码!

嗯在这呢!

代码

附加扯淡

嗯想说一句,在这里还提供了一些可配置项,比如翻页最大次数,超时时间,下拉次数,登录链接等等。

都可以在 config.py 中配置。

  • URLS_FILE

保存链接单的文件

  • OUT_FILE

输出文本EXCEL路径

  • COUNT_TXT

计数文件

  • DRIVER

浏览器驱动

  • TIMEOUT

采集超时时间

  • MAX_SCROLL_TIME

下拉滚动条最大次数

  • NOW_URL_COUNT

当前采集到第几个链接

  • LOGIN_URL

登录淘宝的链接

  • SEARCH_LINK

采集淘宝链接搜索页面

  • CONTENT

采集链接临时变量

  • PAGE

采集淘宝链接翻页数目

  • FILTER_SHOP

是否过滤相同店铺

  • ANONYMOUS_STR

匿名用户标志,已失效

哦,对了,程序怎么用啊?看 README!

转载:静觅 » Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺的更多相关文章

  1. 爬虫实战4:用selenium爬取淘宝美食

    方案1:一次性爬取全部淘宝美食信息 1. spider.py文件如下 __author__ = 'Administrator' from selenium import webdriver from ...

  2. 利用Selenium爬取淘宝商品信息

    一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...

  3. 使用Pyquery&plus;selenium抓取淘宝商品信息

    配置文件,配置好数据库名称,表名称,要搜索的产品类目,要爬取的页数 MONGO_URL = 'localhost' MONGO_DB = 'taobao' MONGO_TABLE = 'phone' ...

  4. 使用selenium抓取淘宝的商品信息

    淘宝的页面大量使用了js加载数据,所以采用selenium来进行爬取更为简单,selenum作为一个测试工具,主要配合无窗口浏览器phantomjs来使用. import re from seleni ...

  5. selenium抓取淘宝数据报错&colon;warnings&period;warn&lpar;&&num;39&semi;Selenium support for PhantomJS has been deprecated&comma; please use headless

    ssh://root@192.168.33.12:22/root/anaconda3/bin/python3 -u /www/python3/maoyantop100/meishi_selenium. ...

  6. Python 爬虫实例(9)—— 搜索 爬取 淘宝

    # coding:utf- import json import redis import time import requests session = requests.session() impo ...

  7. python爬虫实例,一小时上手爬取淘宝评论&lpar;附代码&rpar;

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 明确目的 通过访问天猫的网站,先搜索对应的商品,然后爬取它的评论数据. ...

  8. 使用selenium抓取淘宝信息并存储mongodb

    selenium模块 简单小例子 Author:song import pyquery from selenium import webdriver from selenium.common.exce ...

  9. 一个小demo 实用selenium 抓取淘宝搜索页面内的产品内容

    废话少说,上代码 #conding:utf-8 import re from selenium import webdriver from selenium.webdriver.common.by i ...

随机推荐

  1. Android开发究竟用什么工具,Eclipse&vert;&vert;AS

    所谓公欲善其事必先利器,那就让我们来看一下android的开发工具吧,安卓的开发工具有Eclipse和Android Studio,另外还有IntelliJ IDEA,可能很多人并不知道. 首先看一下 ...

  2. 【转】很有用但鲜有人知的 Linux 命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  3. GOOGLE影像地图

    卫星地图高清 //  

  4. mysql 。。。

    MySQL的相关概念介绍 MySQL 为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格 ...

  5. A在SP&period;NET跨页多选

    在ASP.NET跨页多选 本文介绍怎样在ASP.NET中实现多页面选择的问题.其详细思路非常easy:用隐藏的INPUT记住每次选择的项目,在进行数据绑定时.检查保存的值,再在DataGrid中进行选 ...

  6. Django first lesson 环境搭建

    pycharm ide集成开发环境 (提高开发效率) 解释器/编译器 编辑器 调试环境 虚拟机连接 设置VirtualBox端口 操作1 操作2 点击+号添加,名称为SSH,其中主机端口为物理机的端口 ...

  7. 关于百度地图(离线)使用过程报&OpenCurlyDoubleQuote;Cannot read property &&num;39&semi;jb&&num;39&semi; of undefined ”错误的解决办法

    使用百度地图(离线)API时,地图无法显示,f12查看报错: BaiduApi_2.0.js:1056 Uncaught TypeError: Cannot read property 'jb' of ...

  8. win10上如何启用或禁用Windows功能

    Windows10上提供了很多的功能,比如打印服务.传真服务.媒体服务等,怎样启用或禁用某些Windows功能呢? 工具/原料   windows10 方法/步骤     点击左下角的Windows图 ...

  9. Analysis of FCN

    全卷积网络 FCN 详解   背景 CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题.神经网络大神Jonathan Long发表了<Fully ...

  10. socket之 select模型

    前段时间一直想学习网络编程的select模型,看了<windows网络编程>的介绍,参考了别人的博客. 这里的资料主要来自http://www.cnblogs.com/RascallySn ...