爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存

2023-11-09

通过昨天的分析,我们已经能到依次打开多个页面了,接下来就是获取每个页面上宝贝的信息了。

分析页面宝贝信息

【插入图片,宝贝信息各项内容】
993869-20171202170506976-162262444.jpg

从图片上看,每个宝贝有如下信息;price,title,url,deal amount,shop,location等6个信息,其中url表示宝贝的地址。

我们通过查看器分析,每个宝贝都在一个div里面,这个div的class属性包含item。
而所有的item都在一个div内,这个总的div具有class属性为items,也就是单个页面上包含所有宝贝的一个框架。

因而,只有当这个div已经加载了,才能够断定页面的宝贝信息是可以提取的,所以再提取信息之前,我们要判断这个div的存在。

对于网页源码的解析,这次我们使用Pyquery,轮换着用一下嘛,感觉还是PyQuery比较好用,尤其是pyquery搜索到的对象还能在此进行搜索,很方便。
Pyquery的使用方法请查看我之前的文章,或者看一下API。
下面我们依次来分析一下每项信息应该如何提取。

1、Price
【插入图片,price】
993869-20171202170516929-1327169151.jpg

可以看出,price的信息在一个div里面,具有clas属性price,我们如果通过text来获取的话,还会将前面的人民币符号得到,回头切片切掉就好了。
2、Deal Amount
【插入图片,amount】
993869-20171202170522522-2072625440.jpg

成交量信息再一个class属性为deal-cnt的div标签里面,仍然需要将最后三个字符切掉。
3、Title
【插入图片,title】
993869-20171202170530882-113231708.jpg

宝贝的标题在一个class属性为title的div标签里面,通过text可以获取。
4、Shop
993869-20171202170538382-1746621947.jpg

【插入图片,shop和location】
店铺名在一个class属性为shop的div标签呢。
5、Location
同上图,class属性为location。
6、URL
【插入图片,宝贝的地址】
993869-20171202170545147-187661567.jpg

url地址在一个a标签,class属性为pic-link,这个a标签的href属性就是url地址。

from pyquery import PyQuery as pq
def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.grid > div:nth-child(1)')))
    html=browser.page_source
    doc=pq(html)
    items=doc('div.item').items()#讲解一下
    for item in items:
        product={
            'url':item('a.pic-link').attr('href'),
            'price':item.find('.price').text()[1:],
            'amount':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        #save_to_mongo(product)
        save_to_csv(product)

这里我们在讲一下items的内容,看一下源码中的范例:

> d = PyQuery('<div><span>foo</span><span>bar</span></div>')
> [i.text() for i in d.items('span')]
 ['foo', 'bar']
>[i.text() for i in d('span').items()]
 ['foo', 'bar']
>list(d.items('a')) == list(d('a').items())
 True

保存数据到MongoDb

如果我们获取到product,想保存到MongoDb数据库中,其实是很简单的,设置好数据库的url、数据库名、表名,通过pymongo链接到对应的数据库。
即使我们数据库还未建立,没关系的,会动态创建表格和数据。

import pymongo

'''MONGO设置'''
MONGO_URL='localhost'
MONGO_DB='taobao'
MONGO_Table=KEYWORD

client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]

def save_to_mongo(product):
    try:
        if db[MONGO_Table].insert(product):
            print('保存成功',product)
    except Exception:
        print('保存出错',product)
        pass

【插入图片,MongoDB数据】
993869-20171202170557351-97058121.jpg

保存数据到CSV文件

其实也就是文本文件,只不过可以通过excel打开,方便我们做一些分析。
这里就不展开讲了,请看代码。

def save_to_csv(product):

    with open(FileName,'a') as f:
        s=product['title']+','+product['price']+','+product['amount']+','+product['location']+','+product['shop']+','+product['url']+'\n'
        try:
            f.write(s)
            print('保存到csv成功!',product)
        except:
            pass

全部代码

只要改变KEYWORD关键字的内容,就能搜索到不同的宝贝信息,并保存下来,我们默认保存到csv文件中,数据毕竟只有几千条,还是Excel方便。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from pyquery import PyQuery as pq
import re
import pymongo
from multiprocessing import Pool

'''要搜索的关键字'''
KEYWORD='Iphone8'
'''MONGO设置'''
MONGO_URL='localhost'
MONGO_DB='taobao'
MONGO_Table=KEYWORD
'''要保存的csv文件'''
FileName=KEYWORD+'.csv'
'''PhantomJS参数'''
SERVICE_ARGS=['--load-images=false']#不加载图片,节省时间

client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]

#browser=webdriver.Firefox()
browser=webdriver.PhantomJS(service_args=SERVICE_ARGS)
browser.set_window_size(1400,900)
index_url='https://www.taobao.com/'
wait=WebDriverWait(browser, 10)

def search(keyword):
    try:
        browser.get(index_url)
        #user_search_input=browser.find_element_by_css_selector('#q')
        #user_search_button=browser.find_element_by_css_selector('.btn-search')
        user_search_input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))
        user_search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-search")))
        user_search_input.send_keys(keyword)
        user_search_button.click()
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'div.total')))
        total_page=re.compile(r'(\d+)').search(total.text).group(1)
        print(total_page)
        get_products()
        return int(total_page)
    except TimeoutException:
        search(keyword)

def get_next_page(pageNum):
    try:
        user_page_input = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[2]/div[3]/div[1]/div[26]/div/div/div/div[2]/input")))
        user_page_button = wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div[2]/div[3]/div[1]/div[26]/div/div/div/div[2]/span[3]")))
        user_page_input.clear()
        user_page_input.send_keys(pageNum)
        user_page_button.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'li.active > span:nth-child(1)'),str(pageNum)))
        get_products()
    except TimeoutException:
        get_next_page(pageNum)

def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.grid > div:nth-child(1)')))
    html=browser.page_source
    doc=pq(html)
    items=doc('div.item').items()
    for item in items:
        product={
            'url':item('a.pic-link').attr('href'),
            'price':item.find('.price').text()[1:],
            'amount':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        #save_to_mongo(product)
        save_to_csv(product)

def save_to_csv(product):

    with open(FileName,'a') as f:
        s=product['title']+','+product['price']+','+product['amount']+','+product['location']+','+product['shop']+','+product['url']+'\n'
        try:
            f.write(s)
            print('保存到csv成功!',product)
        except:
            pass

def save_to_mongo(product):
    try:
        if db[MONGO_Table].insert(product):
            print('保存成功',product)
    except Exception:
        print('保存出错',product)
        pass


def main():
    total=search(KEYWORD)
    # p=Pool()
    # p.map(get_next_page,[i for i in range(2,total+1)])
    for i in range(2,total+1):
        get_next_page(i)
    browser.close()

if __name__=='__main__':
    main()

简单分析一下结果

【插入图片,结果分析示例】
993869-20171202170614022-30583621.jpg

月成交量最好的是一款老人机,只有79元。。。。
智能手机里面,vivo X20是卖的最好的,2999元价位。
1500价位,小米5x出现了。。。

这种类似的分析都是建立在数据挖掘的基础上的,希望你能从本篇内容中学到一些知识。

993869-20171127210458206-1142783382.jpg

转载于:https://www.cnblogs.com/xingzhui/p/7954826.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存 的相关文章

  • 翠儿。让流永远运行

    我对 tweepy python 库比较陌生 我想确保我的流 python 脚本始终在远程服务器上运行 因此 如果有人能够分享如何实现这一目标的最佳实践 那就太好了 现在我正在这样做 if name main while True try
  • 在 Python 中使用 Selenium 处理“接受 Cookie”弹出窗口

    我一直在尝试用硒抓取这个房地产网站的一些信息 但是 当我访问该网站时 我需要接受 cookie 才能继续 这仅在机器人访问网站时发生 而不是在我手动执行时发生 当我尝试通过 xpath 或 id 查找相应的元素时 正如我在手动检查页面时找到
  • Django:如何测试“HttpResponsePermanentRedirect”

    我正在为我的 django 应用程序编写一些测试 在我看来 它使用 HttpResponseRedirect 重定向到其他一些网址 那么我该如何测试呢 姜戈TestCase类有一个方法assertRedirects https docs d
  • 从正在运行的 python 脚本检测优化标志是否为 -O 或 -OO

    有时我想生成一个子进程 其优化标志与启动父进程时使用的优 化标志相同 我可以使用类似的东西 optimize not debug 但这样我就可以匹配两者 O and OO flags 是否有一些 python 内部状态包含该信息 经过一番深
  • 在Python3.6中调用C#代码

    由于完全不了解 C 编码 我希望在我的 python 代码中调用 C 函数 我知道有很多关于同一问题的问答 但由于一些奇怪的原因 我无法从示例 python 模块导入简单的 c 类库 以下是我所做的事情 C 类库设置 我使用的是 VS 20
  • Python 3 __getattribute__ 与点访问行为

    我读了一些关于 python 的对象属性查找的内容 这里 https blog ionelmc ro 2015 02 09 understanding python metaclasses object attribute lookup h
  • Python BeautifulSoup XML 解析

    我编写了一个简单的脚本来使用 BeautifulSoup 模块解析 XML 聊天日志 标准 soup prettify 工作正常 只是聊天日志中有很多绒毛 您可以在下面看到我正在使用的脚本代码和一些 XML 输入文件 Code import
  • 优化 Keras 以使用所有可用的 CPU 资源

    好吧 我真的不知道我在说什么 所以请耐心听我说 我正在使用 Theano 后端运行 Keras 以在 MNIST 图像上运行基本的神经网络 目前只是一个教程 过去 我一直使用我的旧 HP 笔记本电脑 因为我有 Windows 和 Ubunt
  • 如何限制Django CreateView中ForeignKey字段的选择?

    我有一个沿着这些思路的模型结构 models py class Foo models Model class Bar models Model foo models ForeignKey Foo class Baz models Model
  • “char”/“character”类型的类型提示

    char 或 character 没有内置的原始类型 因此显然必须使用长度为 1 的字符串 但是为了暗示这一点并暗示它应该被视为一个字符 如何通过类型提示来实现这一点 grade chr A 一种方法可能是使用内置的 chr 函数来表示这一
  • 如何使用Python的super()来更新父值?

    我对继承很陌生 之前所有关于继承和 Python 的 super 函数的讨论都有点超出我的理解 我当前使用以下代码来更新父对象的值 usr bin env python test py class Master object mydata
  • Python:计算数据帧列中所有行中特定字符的实例数

    我有一个包含列 toaddress ccaddress body 的数据框 df 我想迭代数据帧的索引 以获取 toaddress 和 ccaddress 字段中电子邮件地址的最小 最大和平均数量 这是通过计算这两列中每个字段中的 和 的实
  • 将 Pandas 列中的列表拆分为单独的列

    这是我在 pandas 数据框中的 特征 列 Feature Cricket 82379 Kabaddi 255 Reality 4751 Cricket 15640 Wildlife 730 LiveTV 13 Football 4129
  • 如何列出 python PDB 中的当前行?

    在 perl 调试器中 如果重复列出离开当前行的代码段 可以通过输入命令返回到当前行 点 我无法使用 python PDB 模块找到任何类似的东西 如果我list如果我自己离开当前行并想再次查看它 似乎我必须记住当前正在执行的行号 对我来说
  • 将输入发送到 python 子进程而不等待结果

    我正在尝试为一段代码编写一些基本测试 该代码通常通过 stdin 无休止地接受输入 直到给出特定的退出命令 我想检查程序是否在给出一些输入字符串时崩溃 经过一段时间来考虑处理 但似乎无法弄清楚如何发送数据而不是陷入等待我不知道的输出关心 我
  • select() 可以在 Windows 下使用 Python 中的文件吗?

    我正在尝试在 Windows 下运行以下 python 服务器 An echo server that uses select to handle multiple clients at a time Entering any line o
  • Pandas Dataframe:将包含列表的行扩展到多行,并为所有列提供所需的索引

    我在 pandas 数据框中有时间序列数据 索引为测量开始时的时间 列中包含以固定采样率记录的值列表 连续索引 列表中元素数量的差异 这是它的样子 Time A B Z 0 1 2 3 4 1 2 3 4 2 5 6 7 8 5 6 7 8
  • 导入错误:没有名为 google.auth 的模块

    当我尝试导入时firebase admin in python 2 7我收到错误 导入错误 没有名为 google auth 的模块 这是Docker文件 https github com ammaratef45 Attendance bl
  • 如何通过字符串匹配加速 pandas 行过滤?

    我经常需要过滤 pandas 数据框df by df df col name string value 并且我想加快行选择操作 有没有快速的方法可以做到这一点 例如 In 1 df mul df 3000 2000 3 reset inde
  • 全局变量是 None 而不是实例 - Python

    我正在处理Python 中的全局变量 代码应该可以正常工作 但是有一个问题 我必须使用全局变量作为类的实例Back 当我运行应用程序时 它说 back is None 这应该不是真的 因为第二行setup 功能 back Back Back

随机推荐

  • RT-Thread 实时操作系统(一)

    视频播放地址 https www bilibili com video BV1Cb4y1m7W5 p 2 vd source b91967c499b23106586d7aa35af46413 0 学习路线 1 RT Thread简介 2 R
  • u3d 2D Animator AnimationClip复用方案

    新做了个2D游戏 类似小时候红白机的 热血格斗 比较菜 人物2d动画就用的Animator 碰撞块的方法做的 移动 攻击等做成Clip然后通过Animator控制 发现一个人物一个Animator N个片断 然后要制作10多个不同的人物 但
  • discuz密码找回:忘记管理员密码,忘记UCENTER创始人密码

    discuz站点 忘记管理员密码或忘记ucenter管理员密码怎么办 discuz管理员密码修改 第一步进入uc后台 域名 uc server 如果uc密码忘记请继续往下看 找到用户管理里编辑管理员账号 第二步把想改的密码输入进去直接提交就
  • .pgr照片文件解析,C++与Java存储数据差别大小端模式

    1 pgr是什么 pgr文件是二进制的图像文件 可以用普通的文本文件打开 或者查看十六进制的文本信息 读取需要了解 非常重要 基本数据类型的大小端存储模式 表头Header 详细信息可参考 http www powergrep com ma
  • 替换jar包内的class文件

    前提 项目几年没有更新 不确定手头上的代码是否最新内容 只能通过替换class文件进行更新 1 从本地项目中拿到class文件 2 复制jar包到文件夹中 打开cmd窗口 创建对应jar包下的文件夹 把本地项目的class文件放进去 例 m
  • 曾有一个人,爱我如生命(3)

    第十一章 一切都已结束 不再藕断丝连 我最后一次拥抱你的双膝 说出令人心碎的话语 一切都已结束 回答我已听见 我不愿再一次将自己欺骗 也许 往事终会将我遗忘 我此生与爱再也无缘 普希金 往事 那些天我不知道是怎么熬过来的 什么事都做不下去
  • golang 命令行cobra妙用

    为什么使用命令行 大型项目中少不了数据升级 如果采用web服务 一来不够安全 二来数据量大的时候也会出超时的情况 这时使用命令行是比较合适的方式了 命令行中的MVC web项目一般采用MVC模式 对于命令行有吗 对于命令行则有command
  • Unity——Transform类

    transform position 基础知识 Transform作为Unity中游戏对象最为重要的组件 位置 作为Transfrom组件的一个属性 具有同等重要的地位 Transform组件下有两个 位置 属性 position 指的是游
  • 华为OD机试-报文转换 只有20%通过率。但是没没找到未通过原因

    机试题只有AC20 但是目前没看到原因 我看有人说是16进制的原因 但是输出也是16进制 是不用转换的吧 因为我全部都是用的String 不存在说数据被我转成了10进制 报文转义功能 报文中如果出现0x0A 转义成两个字节0x12 0x34
  • 文件上传漏洞php相关函数

    1 file exists path 检查文件或目录是否存在 参数 描述 path 必需 规定要检查的路径 如果指定的文件或目录存在则返回 TRUE 否则返回 FALSE 2 move uploaded file file newloc 把
  • Delphi2007中提示Application.Exename错误的处理办法

    将application exename改为forms application exename 错误提示
  • 中国各省区块链政策竞争力指数TOP10(2020年10月)

    顺应着国家大力发展区块链的趋势 自2020年以来 全国迎来了区块链政策热潮 中央以及各地方政府纷纷颁布区块链相关政策 此前 链塔智库发布过系列文章 中国区块链50城 通过扫描城市经济发展水平 政府区块链政策及支持力度 区块链投融资事件 区块
  • VUE设置浏览器icon图标

    在创建Vue项目时一般会用默认的项目标题和图标 如下图所示 不是很美观也可能不符合项目的需求 所以有时候就需要改变项目在浏览器上方的标签名称或者图标 找到项目根目录的index html 如图 进去就能够修改title 也就是在浏览器上方的
  • sklearn中ValueError: Unknown label type: ‘continuous‘错误解决

    ValueError Unknown label type continuous 错误解决 今天在做决策树鸢尾花分类时出现了一个错误 解决方法是 train y后加上astype int 即可
  • unity中物体移动到指定位置的四种方法

    法一 使用Vector3 MoveTowards 方法 void Update float step Speed Time deltaTime gameObject transform localPosition Vector3 MoveT
  • vue3.2 之 driver引导页的使用

    目录 vue3 2 之 driver引导页的使用 components driver index vue components driver steps ts 使用 效果 vue3 2 之 driver引导页的使用 安装 yarn add
  • Java一行代码将yyyyMMdd转换为yyyy-MM-dd,yyyy-MM-dd转换为yyyyMMdd

    Java一行代码将yyyyMMdd转换为yyyy MM dd 代码如下 Java日期格式转换记录 yyyyMMdd与yyyy MM dd相互转换 代码如下 yyyyMMdd转换为yyyy MM dd System out println L
  • gtest使用简介

    gtest使用简介 gtest是谷歌开发的开源测试框架 用于帮助c 开发者实现测试用例 使用下来感觉gtest简单实用 基本可以满足各类的测试需求 gtest的使用并不复杂 这里主要是整理一下基本的使用方法和一些实际开发中碰到的问题 通过
  • cuda driver-内存分配

    目录 前言 1 内存分配 前言 统一内存 Unified Memory 统一内存是CUDA中的一种内存管理模型 它将主机 CPU 和设备 GPU 的内存合并为一个统一的内存地址空间 通过使用统一内存 应用程序可以透明地访问主机和设备上的内存
  • 爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存

    通过昨天的分析 我们已经能到依次打开多个页面了 接下来就是获取每个页面上宝贝的信息了 分析页面宝贝信息 插入图片 宝贝信息各项内容 从图片上看 每个宝贝有如下信息 price title url deal amount shop locat