Python+selinume+mysql爬取考拉商品信息_考拉商品图片python爬虫-程序员宅基地

技术标签: 爬虫  python  selinume  

Python+selinume+mysql爬取考拉商品信息

环境:pycharm 2019
有点偷懒,缺少了一些相应的检测
第一步 获目标网页的信息

  1. url = https://www.kaola.com/
	from selenium import webdriver
 	url = 'http://www.kaola.com/'
    #不打开浏览器
    # chrome_options = webdriver.ChromeOptions()
    # chrome_options.add_argument('--headless')
    # driver = webdriver.Chrome(chrome_options=chrome_options)
    driver = webdriver.Chrome() #打开浏览器,需要配置selinume
    driver.implicitly_wait(10)#隐式等待十秒,推荐使用显示等待,自行查找资料
    #大致就是 等待某些页面元素加载出来再执行下一步
    driver.get(url)
    html = driver.page_source #返回网站文本信息
    print(html)

这样就可以获取目标网站页面的全部信息,或者在网页中通过开发者工具直接观察
输入框和搜索按钮,找到网页中的输入框以及搜索按钮所在点,之后可以通过ID或者CSS选择器或者Xpath路经将所需要搜索的物品发送进去以及点击,之后都是用Xpath路径
输入框,右键 - 检查搜索按钮
selinume 有个find_element_by_xpath()函数可以通过xpath路径找到所需要的属性,文本等

driver.find_element_by_xpath('//*[@id="topSearchInput"]').send_keys(name)
#关于xpath的路径 这里就不多说 不了解自己查资料吧 
#send_keys()向搜索框输入需要查找的物品
driver.find_element_by_xpath('//*[@id="topSearchBtn"]').click()
#点击

执行到这里之后页面应该会跳转到你搜索的物品的商品界面,那么之后就要分析商品的页面了,因为有些网站是动态的商品的信息不会一下就显示在网页内容里
需要下拉页面

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

那么我们可以观察到页面已经将所有商品信息都包含在网页中了,因此不需要下拉网页
商品列表
第二步,获取商品的信息
可以直接使用 find_element_by_xpath()找到所需要的信心,但是我上面为了查看当前页面的源码所以之后我再转换为HTML,HTML文本进行初始化,成功构造XPath解析对象,同时可以自动修正HMTL文本

在这里插入图片描述
Chrom有个很好用的开发着工具,Xpath可以查看你的预览xpath路径所查询到的东西。
在这里插入图片描述
在这里插入图片描述

 	name = result.xpath('//div[@class="img"]/img/@alt')
    price =result.xpath('//div[@class="desc clearfix"]/p[1]/span[1]/text()')
    title = '¥'
    for i in range(len(price)):
        price[i] = title + price[i]
    comments =result.xpath('//div[@class="desc clearfix"]/p[3]//text()')
    comments = ' '.join(comments)
    comments = re.findall(r'\d+',comments)
    storename = result.xpath('//div[@class="desc clearfix"]/p[4]//text()')
    storename_list = []
    for item in storename:
        if item != '' and item != ' ' and item != '  ' and item != '   ':
            storename_list.append(item)
    date = zip(name,price,comments,storename_list)#
    return date
    #获得商品信息后,会发现各种问题,比如列表里有很多空格,或者多了很多莫名的符号,那么要么就是xpath路径有问题,要么就需要自己筛选结果,比如正则表达式等

换页,找到下一页click()点击,按道理应该等到页码显示高亮再执行爬取的操作,但我找没找高亮的位置

driver.find_element_by_xpath('//*[@class="nextPage"]').click()

第三步,保存结果
这里只列举比较特殊的csv以及Mysql的保存方式
pycharm可以直接连接Mysql
CSV格式有挺多坑,比如中文乱码等问题

 with open('2.csv', 'a', encoding='utf-8-sig', newline='') as f: 
  # 保存csv时编码格式 utf-o-sig不然会乱码
        writer = csv.writer(f)
        list = ['商品:','价格','评论','店铺']
        writer.writerow(list)
        for item in data:
            writer.writerow(item)

数据库操作

 	 conn = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        passwd='helloworld',
        db='python',
        charset='utf8'
    )
    table_name = input('the name of sheme')
    cursor = conn.cursor()
    sql = 'CREATE TABLE %s ( number INT PRIMARY KEY AUTO_INCREMENT,name varchar(100) ,price varchar(10) not null,comment int(10) not null,store varchar(40)not null);' % table_name
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()
    sql = 'alter table %s AUTO_INCREMENT = 1;'%table_name
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()

将信息插入数据库

     for item in data:
        sql = 'INSERT INTO {name} values (number,%s,%s,%s,%s);'.format(name = table_name)
        try:
            cursor.execute(sql, item)
            conn.commit()
        except:
            conn.rollback()

结果
在这里插入图片描述
在这里插入图片描述
git-hub源码地址


#import urllib.parse
from selenium import webdriver
# from selenium.webdriver.common.by import By
# from selenium.webdriver.support import expected_conditions as EC
from lxml import etree
import pymysql
import time
import csv
import re
def crow(page,name,type):
    # url = 'http://www.baidu.com'
    url = 'http://www.kaola.com/'
    #不打开浏览器
    # chrome_options = webdriver.ChromeOptions()
    # chrome_options.add_argument('--headless')
    # driver = webdriver.Chrome(chrome_options=chrome_options)
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get(url)
    driver.find_element_by_xpath('//*[@id="topSearchInput"]').send_keys(name)
    # input = driver.find_element_by_id()
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="topSearchBtn"]').click()
    for i in range(page):
        print('你正在爬第%d页\n'%(i+1))
        html = driver.page_source
        data = get_product(html)
        time.sleep(1)
        if type == 1:
            downland(i,data,name)
        elif type == 2:
            table_name = input('the name of sheme')
            conn, cursor = connect_mysql(table_name)
            insert_into(data,table_name,conn,cursor)
            cursor.close()
            conn.close()
        else:
            show(data)
        time.sleep(1)
        if i < page and driver.find_element_by_xpath('//*[@class="nextPage"]'):
            driver.find_element_by_xpath('//*[@class="nextPage"]').click()
        else:
            i = page

def show(data):
    for item in data:
        print('商品名:'+item[0])
        print('价格'+item[1])
        print('评论:' + item[2])
        print('店铺' + item[3])
def get_product(html):
    result = etree.HTML(html)
    name = result.xpath('//div[@class="img"]/img/@alt')
    price =result.xpath('//div[@class="desc clearfix"]/p[1]/span[1]/text()')
    title = '¥'
    for i in range(len(price)):
        price[i] = title + price[i]
    comments =result.xpath('//div[@class="desc clearfix"]/p[3]//text()')
    comments = ' '.join(comments)
    comments = re.findall(r'\d+',comments)
    storename = result.xpath('//div[@class="desc clearfix"]/p[4]//text()')
    storename_list = []
    for item in storename:
        if item != '' and item != ' ' and item != '  ' and item != '   ':
            storename_list.append(item)
    date = zip(name,price,comments,storename_list)
    return date
def downland(i,data,name):
    with open('%s.csv'%name, 'a', encoding='utf-8-sig', newline='') as f:  # 保存csv时编码格式 utf-o-sig不然会乱码
        writer = csv.writer(f)
        if i == 0:
            list = ['商品:','价格','评论','店铺']
            writer.writerow(list)
        for item in data:
            writer.writerow(item)
def insert_into(data,table_name,conn,cursor):
    for item in data:
        sql = 'INSERT INTO {name} values (number,%s,%s,%s,%s);'.format(name = table_name)
        try:
            cursor.execute(sql, item)
            conn.commit()
        except:
            conn.rollback()
    # for item in data
def connect_mysql(table_name):
    conn = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        passwd='helloworld',
        db='python',
        charset='utf8'
    )
    cursor = conn.cursor()
    sql = 'CREATE TABLE %s ( number INT PRIMARY KEY AUTO_INCREMENT,' \
          'name varchar(100) ,price varchar(10) not null,' \
          'comment int(10) not null,' \
          'store varchar(40)not null);' % table_name
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()
    sql = 'alter table %s AUTO_INCREMENT = 1;' % table_name
    try:
        cursor.execute(sql)
        conn.commit()
    except:
        conn.rollback()
    return conn,cursor
if __name__=='__main__':
    name = input('please enter the name of the goods')
    page = int(input('please enter the page'))
    type = int(input('what type do you want to download? 1 csv 2 mysql 3 I just want to look'))
    crow(page, name, type)
    print('thanks for you try')
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/H__ello_world/article/details/102963468

智能推荐

最小二乘法构建线性回归方程_excel最小二乘法求线性回归方程-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏7次。文章目录一、线性回归的意义二、一、线性回归的意义线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。由于市场现象一般是受多种因素的影响,而并不是仅仅受一个因素的影响。所以应用一元线性回归分析预测法,必须对影响市场现象的多种因素做全面分析。只有当诸多的影响因素中,确实存在一个对因变量影响作用明显高于其他因素的变量,才能将它作为自变量,应用一元相关回归分析市场预测法进行_excel最小二乘法求线性回归方程

数据库语法总结(3)——多表联查-程序员宅基地

文章浏览阅读3.9k次,点赞2次,收藏15次。数据库语法总结(3)_多表联查

创建随机电话号码_java随机生成电话号码-程序员宅基地

文章浏览阅读636次。创建一个随机的电话号码,前面是5到8位数,后面有随机的区号3到5位数,可能有区号也可能没有。_java随机生成电话号码

python 学习笔记20 批量修改页眉页脚_python 替换word页眉页脚-程序员宅基地

文章浏览阅读692次,点赞9次,收藏10次。需求:修改指定目录下所有文件的页眉页脚,或者往里面添加内容。_python 替换word页眉页脚

答案很详细的MyBatis面试题(含示例代码)_mybatis 面试经典题及源码-程序员宅基地

文章浏览阅读1.5w次,点赞41次,收藏27次。MyBatis是一种优秀的持久层框架,它是一个轻量级的、优化的、功能强大的Java持久层框架,它的设计理念是贴近SQL、便于使用、高效并且功能丰富。通过MyBatis的使用,开发者能够更加专注于业务逻辑的实现,而不用过多关注底层的数据库操作。MyBatis通过XML或注解的方式配置SQL映射文件,并将Java的POJO(Plain Old Java Object,普通的Java对象)与数据库中的记录进行映射,使得开发人员能够以面向对象的方式来操作数据库,同时兼顾了SQL的灵活性和效率。灵活的SQL映射。_mybatis 面试经典题及源码

XML的基本使用_position: start_document seen <?xml version="1.0" -程序员宅基地

文章浏览阅读1.6k次。1 XML1.1 XML概述Extensible Markup Language可拓展标记语言用途:1. 数据存储,小型数据库,存在一定的CRUD操作可行性2. 网络端数据的传输3. JavaWEB框架项目配置文件Spring Druid …w3c万维网联盟指定的规范1.2 基本语法1. XML文件后缀名是.xml2. XML第一行是对于当前文件的定义声明3. XML..._position: start_document seen <?xml version="1.0" encoding="utf ... @1:34)</div>

随便推点

查看Oracle EBS报表输出,IE闪了一下就消失,报表没有打开_oracle report builder閃退-程序员宅基地

文章浏览阅读9.7k次。查看Oracle EBS报表输出,IE闪了一下就消失,报表无法打开。解决方法1:按住Ctrl键,再点报表“查看输出”解决方法2:退出所有IE窗口,重新打开一个空的IE,IE 选项 -> 安全 -> 自定义级别然后重新登陆EBS,查看报表输出。_oracle report builder閃退

TIA博途中如何调整LAD/FBD梯形图中字体大小?_博途字体大小设置-程序员宅基地

文章浏览阅读4.8k次。TIA博途中如何调整LAD/FBD梯形图中字体大小?_博途字体大小设置

在Unity3D中实现安卓平台的本地通知推送_unity 定时推送-程序员宅基地

文章浏览阅读4.8k次。这是我在网上看到的一个大神写的android本地推送的文章很好,很详细,特转载了过来,如果原作者看到,不让转载的话,我会立刻删除该博客,大神原链接:https://www.cnblogs.com/GuyaWeiren/p/4830854.html【前言】  对于手游来说,什么时候需要推送呢?玩过一些带体力限制的游戏就会发现,我的体力在恢复满后,手机会收到一个通知告诉我体力已完全恢复了..._unity 定时推送

AI大视觉(十六) | SPP(空间金字塔池化)_spp模块-程序员宅基地

文章浏览阅读3.9k次,点赞2次,收藏15次。本文来自公众号“AI大道理​SPP对于一个CNN模型,可以将其分为两个部分:前面包含卷积层、激活函数层、池化层的特征提取网络,下称CNN_Pre,后面的全连接网络,下称CNN_Post。许多CNN模型都对输入的图片大小有要求,实际上CNN_Pre对输入的图片没有要求,可以简单认为其将图片缩小了固定的倍数,而CNN_Post对输入的维度有要求。SPP:空间金字塔池化,无论CNN_Pre输出的feature maps尺寸是怎样,都能输出固定的维度传给CNN_Post。SP._spp模块

软碟通   linux_使用UltraISO软碟通制作乌班图Ubuntu安装U盘的步骤-程序员宅基地

文章浏览阅读1k次。开始之前需要先下载乌班图Ubuntu 镜像和制作软件 UltraISO 软碟通。官方最新版乌班图下载:https://cn.ubuntu.com/download官方旧版本乌班图下载:https://ubuntu.com/download/alternative-downloadsUltraISO 软碟通官网下载地址:https://cn.ezbsystems.com/支持正版,请订购软件。以..._软碟通制作u盘启动盘安装ubu

QT移植到海思平台上步骤-程序员宅基地

文章浏览阅读1.7k次。刚刚移植完海思。趁新鲜,赶紧写博客记录一下。刚换新公司,老公司用的平台都是三星的,对Qt等支持都非常好,不需要太多操心。新公司采用的是海思的平台,自带pdf是没有说明如何使用QT。QT版本采用Qt4.5.3海思使用的是Hi3520D。首先要安装海思的SDK1、hi3520D SDK包位置 在"hi3520D_V100R001***/01.software/board..._if (hi_success != sample_comm_vo_startchn(vodev, &stpubattr, stvomode)) ^~~~

推荐文章

热门文章

相关标签