爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

这篇具有很好参考价值的文章主要介绍了爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先淘宝需要登录,这一点如果用selenium如何解决,只能手动登录?如果不用selenium,用cookies登录也可。但是验证码又是一个问题,现在的验证码五花八门,难以处理。

我们回到正题,假设你已经登录上淘宝了,接着我们需要找到输入框和搜索按钮,输入“手机”,点击搜索即可,如何找到对应的元素呢?
淘宝爬虫,爬虫,爬虫
接着来到搜索得到的页面,首先找到父类容器的位置。


items = doc('div.PageContent--contentWrap--mep7AEm > div.LeftLay--leftWrap--xBQipVc > div.LeftLay--leftContent--AMmPNfB > div.Content--content--sgSCZ12 > div > div').items()

这行代码是使用Python的pyquery库来解析HTML并提取特定元素。代码是在doc(一个pyquery对象)中查找符合特定CSS选择器的元素。
这个CSS选择器匹配一个具有特定类名的div元素,该元素是另一个具有特定类名的div元素的直接子元素,以此类推。>符号表示“直接子元素”。
.items()方法是获取所有匹配的元素,并返回一个生成器,可以用于迭代每个匹配的元素。
淘宝爬虫,爬虫,爬虫
接着运用找输入框和搜索按钮的方法找到你想要爬取内容的位置,下面展示其中一个的例子
淘宝爬虫,爬虫,爬虫


title = item.find('.Title--title--jCOPvpf span').text()

这行代码是使用Python的BeautifulSoup库来解析HTML并提取特定元素的文本内容。
item.find(‘.Title–title–jCOPvpf span’)是在item(一个BeautifulSoup对象)中查找具有类名Title–title–jCOPvpf的元素,并且这个元素下的span子元素。

接着找到下一页的按钮,完成翻页的操作!
淘宝爬虫,爬虫,爬虫
最后创建数据库,将数据插入即可。


# 删除同名的旧表
drop_table_sql = "DROP TABLE IF EXISTS {}".format(MYSQL_TABLE)
cursor.execute(drop_table_sql)

# 创建新表的SQL语句
create_table_sql = """
CREATE TABLE {} (
    price VARCHAR(255),
    deal VARCHAR(255),
    title VARCHAR(255),
    shop VARCHAR(255),
    location VARCHAR(255),
    postFree VARCHAR(255)
)
""".format(MYSQL_TABLE)

# 执行SQL语句
cursor.execute(create_table_sql)

最后的结果如下(使用Navicat Premium可视化):
淘宝爬虫,爬虫,爬虫
这次共爬取4800件商品。

完整代码如下所示:


import pymysql
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import time
import random

# 要搜索的商品的关键词
KEYWORD = '手机'
# 数据库中要插入的表
MYSQL_TABLE = 'phone'

# MySQL 数据库连接配置,根据自己的本地数据库修改
db_config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '123456',
    'database': 'myh',
    'charset': 'utf8mb4',
}

# 创建 MySQL 连接对象
conn = pymysql.connect(**db_config)
cursor = conn.cursor()

# 删除同名的旧表(如果存在)
drop_table_sql = "DROP TABLE IF EXISTS {}".format(MYSQL_TABLE)
cursor.execute(drop_table_sql)

# 创建新表的SQL语句
create_table_sql = """
CREATE TABLE {} (
    price VARCHAR(255),
    deal VARCHAR(255),
    title VARCHAR(255),
    shop VARCHAR(255),
    location VARCHAR(255),
    postFree VARCHAR(255)
)
""".format(MYSQL_TABLE)

# 执行SQL语句
cursor.execute(create_table_sql)

# 提交事务
conn.commit()

options = webdriver.ChromeOptions()
# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式
options.add_experimental_option("excludeSwitches", ['enable-automation'])
 
# 把chrome设为selenium驱动的浏览器代理;
driver = webdriver.Chrome(options=options)
# 窗口最大化
driver.maximize_window()
 
# wait是Selenium中的一个等待类,用于在特定条件满足之前等待一定的时间(这里是15秒)。
# 如果一直到等待时间都没满足则会捕获TimeoutException异常
wait = WebDriverWait(driver, 15)




# 打开页面后会强制停止10秒,请在此时手动扫码登陆
def search_goods(start_page, total_pages):
    print('正在搜索: ')
    try:
        driver.get('https://www.taobao.com')
        # 强制停止10秒,请在此时手动扫码登陆
        time.sleep(10)
        driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",
                           {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})
        # 找到搜索输入框
        input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))
        # 找到“搜索”按钮
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
        input.send_keys(KEYWORD)
        submit.click()
        # 搜索商品后会再强制停止10秒,如有滑块请手动操作
        time.sleep(10)
        
        # 如果不是从第一页开始爬取,就滑动到底部输入页面然后跳转
        if start_page != 1 :
            # 滑动到页面底端
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            # 滑动到底部后停留1-3s
            random_sleep(1, 3)
 
            # 找到输入页面的表单
            pageInput = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/span[3]/input')))
            pageInput.send_keys(start_page)
            # 找到页面跳转的确定按钮,并且点击
            admit = wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="root"]/div/div[3]/div[1]/div[1]/div[2]/div[4]/div/div/button[3]')))
            admit.click()
 
        get_goods()
 
        for i in range(start_page + 1, start_page + total_pages):
            page_turning(i)
    except TimeoutException:
        print("search_goods: error")
        return search_goods()
# 进行翻页处理
def page_turning(page_number):
    print('正在翻页: ', page_number)
    try:
        # 找到下一页的按钮
        submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/button[2]')))
        submit.click()
        # 判断页数是否相等
        wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="sortBarWrap"]/div[1]/div[2]/div[2]/div[8]/div/span/em'), str(page_number)))
        get_goods()
    except TimeoutException:
        page_turning(page_number)
#获取每一页的商品信息;
def get_goods():
    # 获取商品前固定等待2-4秒
    random_sleep(2, 4)
 
    html = driver.page_source
    doc = pq(html)
    # 提取所有商品的共同父元素的类选择器
    items = doc('div.PageContent--contentWrap--mep7AEm > div.LeftLay--leftWrap--xBQipVc > div.LeftLay--leftContent--AMmPNfB > div.Content--content--sgSCZ12 > div > div').items()
    
    for item in items:
        # 定位商品标题
        title = item.find('.Title--title--jCOPvpf span').text()
        # 定位价格
        price_int = item.find('.Price--priceInt--ZlsSi_M').text()
        price_float = item.find('.Price--priceFloat--h2RR0RK').text()
        if price_int and price_float:
            price = float(f"{price_int}{price_float}")
        else:
            price = 0.0
        # 定位交易量
        deal = item.find('.Price--realSales--FhTZc7U').text()
        # 定位所在地信息
        location = item.find('.Price--procity--_7Vt3mX').text()
        # 定位店名
        shop = item.find('.ShopInfo--TextAndPic--yH0AZfx a').text()
        # 定位包邮的位置
        postText = item.find('.SalesPoint--subIconWrapper--s6vanNY span').text()
        result = 1 if "包邮" in postText else 0
 
        # 构建商品信息字典
        product = {
            'title': title,
            'price': price,
            'deal': deal,
            'location': location,
            'shop': shop,
            'isPostFree': result
        }
        save_to_mysql(product)
# 在 save_to_mysql 函数中保存数据到 MySQL
def save_to_mysql(result):
    try:
        sql = "INSERT INTO {} (price, deal, title, shop, location, postFree) VALUES (%s, %s, %s, %s, %s, %s)".format(MYSQL_TABLE)
        print("sql语句为:  "  + sql)
        cursor.execute(sql, (result['price'], result['deal'], result['title'], result['shop'], result['location'], result['isPostFree']))
        conn.commit()
        print('存储到MySQL成功: ', result)
    except Exception as e:
        print('存储到MYsql出错: ', result, e)
# 强制等待的方法,在timeS到timeE的时间之间随机等待
def random_sleep(timeS, timeE):
    # 生成一个S到E之间的随机等待时间
    random_sleep_time = random.uniform(timeS, timeE)
    time.sleep(random_sleep_time)
# 在 main 函数开始时连接数据库
def main():
    try:
        pageStart = int(input("输入您想开始爬取的页面数: "))
        pageAll = int(input("输入您想爬取的总页面数: "))
        search_goods(pageStart, pageAll)
    except Exception as e:
        print('main函数报错: ', e)
    finally:
        cursor.close()
        conn.close()
 
#启动爬虫
if __name__ == '__main__':
    main()

请大家关注一下我的公众号。
淘宝爬虫,爬虫,爬虫文章来源地址https://www.toymoban.com/news/detail-846664.html

到了这里,关于爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 牛刀小试 - C++ 实现2048(可存档)

    借助了这位大佬的开发思路, 开发过程中学到了很多 C语言实现《2048游戏》 system调整控制台大小的问题 unsigned and 符号位 C++对齐输出(左对齐和右对齐) C++ goto语句详解

    2024年01月25日
    浏览(32)
  • 工欲善其事必先利其器--CMake牛刀小试

    这里假设用户已经安装好MinGW编译套件!并配置好环境变量!具体怎么下载和配置网上教程非常多,这里贴上一个链接:不仅教你安装MinGW还教你安装VScode配置 1、学习c plus plus编码为什么要学习CMake? 在Windows下使用集成开发环境(IDE)开发项目时,一般会使用IDE自带的构建工

    2024年02月06日
    浏览(33)
  • 爬虫小试牛刀(爬取学校通知公告)

    完成抓取并解析DGUT通知公告12页数据,并提交excel文件格式数据,数据需要包含日期标题,若能够实现将详情页主体内容与发布人信息数据也一并抓取更佳 提交内容:Excel数据文件 首先看到页面呈现规则的各个方框,这意味着它们之间的一定是一样的 此处该有图 我们点开后

    2024年02月09日
    浏览(34)
  • selenium爬虫框架爬取某壁纸网站

    基础知识 环境配置 开始爬虫 简单分析目标网站 写函数 获取浏览器对象: 下载每一张图片: 获取每一页的源代码: 运行print_result_every_page python基础语法 面向对象基础 html基础 xpath基础 selenium框架的基本使用 request库 lxml库      3.安装浏览器xpath插件         打开谷歌浏览

    2024年02月05日
    浏览(35)
  • python 使用selenium等爬虫技术爬取某华网

    本程序可以根据时间要求获取某华网上不同模块的新闻内容,时间要求包括设置截止日期,以及时间间隔,比如说获取距离2023-04-20一天以内的新闻。主要使用了selenium有关的爬虫技术,具体实现如下: 目录 目录 一、SpiderXinhua类的基础属性 二、日期获取与格式转换的函数ti

    2024年01月16日
    浏览(30)
  • Python爬虫实战系列:如何爬取某乎热搜榜单

    本篇文章将带你通过Python爬虫实战,学习如何爬取某乎平台的热搜榜单。

    2024年02月11日
    浏览(56)
  • 【爬虫】一次爬取某瓣top电影前250的学习记录

    先贴上爬取的脚本: import requests import re for i in range(1,11):     num=(i-1)*25     url=f\\\"https://movie.douban.com/top250?start={num}filter=\\\"     head={\\\"User-Agent\\\":\\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36\\\"}#伪造请求头     res=requests.get(url,headers=head)    

    2024年02月06日
    浏览(42)
  • 爬虫不会写?找ChatGPT不就完了,实战爬取某手办网~~~

    💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互

    2024年02月04日
    浏览(33)
  • Mapreduce小试牛刀(1)

    1.与hdfs一样,mapreduce基于hadoop框架,所以我们首先要启动hadoop服务器 --------------------------------------------------------------------------------------------------------------------------------- 2.修改hadoop-env.sh位置JAVA_HOME配置,在JAVA_HOME前面加上export,重启主虚拟机,最好也把另外两个节点同位置的

    2024年02月04日
    浏览(32)
  • 网页学习-小试牛刀

    分为三大部分: HTML 、 CSS 和 JavaScript 。 HTML(Hyper Text Markup Language,即超文本标记语言),网页骨架。 CSS(Cascading Style Sheets,层叠样式表),使页面变得美观、优雅,网页皮肤。 JavaScript(简称JS,是一种脚本语言),实现实时、动态、交互的页面功能,网页肌肉。 学习目的

    2023年04月22日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包