selenium京东商城爬取

该项目主要参考与:http://c.biancheng.net/python_spider/selenium-case.html

你看完上述项目内容之后,会发现京东登录是一个比较坑的点,selenium控制浏览器没有登录京东,导致我们自动爬取网页被重定向到京东登录注册页面。

因此,我们要单独能一个登录注册。

但是,发现京东的验证功能 -- 滑动图片/发送验证码到手机目前我没办法解决,因此我们可以手动验证:我们启动浏览器,自己手动验证完之后,跳转到京东首页

1. 登录功能

python 复制代码
# 登录
    def login_html(self, loginname, password):
        self.browser.get(url=self.url)
        # 进入登录页面
        self.browser.find_element(by=By.LINK_TEXT, value='你好,请登录').click()
        time.sleep(2)
        # 选择账户登录方式
        self.browser.find_element(by=By.LINK_TEXT, value='账户登录').click()
        # 输入框输入账号和密码
        self.browser.find_element(value='loginname').send_keys(loginname)
        self.browser.find_element(value='nloginpwd').send_keys(password)
        time.sleep(2)
        # 登录
        self.browser.find_element(value='loginsubmit').click()
        # 登录成功会跳转到京东首页,并且没有请登录字段。
        # 延长30s,自己手工验证;30s,之内没验证,自动断开
        start_time = time.time()
        while True:
            condition = (self.browser.page_source.find('你好,请登录') == -1) and (
                    self.browser.current_url == 'https://www.jd.com/')
            # 如果登录成功,跳出循环
            if condition:
                return True
            time1 = int(time.time() - start_time)
            # 60s没验证成功,直接终止selenium进程
            if time1 >= 60:
                self.browser.quit()
                return False

2.完整代码

python 复制代码
from selenium import webdriver
import time
from selenium.webdriver.common.by import By


class JdSpider(object):
    def __init__(self):
        self.url = 'https://www.jd.com/'
        self.browser = webdriver.Chrome()  # 创建无界面参数的浏览器对象
        self.i = 0  # 计数,一共有多少件商品

    # 输入地址+输入商品+点击按钮,切记这里元素节点是京东首页的输入栏、搜索按钮
    def get_html(self):
        self.browser.find_element(by=By.XPATH, value='//*[@id="key"]').send_keys('python书籍')
        self.browser.find_element(by=By.XPATH, value="//*[@class='form']/button").click()

    # 登录
    def login_html(self, loginname, password):
        self.browser.get(url=self.url)
        # 进入登录页面
        self.browser.find_element(by=By.LINK_TEXT, value='你好,请登录').click()
        time.sleep(2)
        # 选择账户登录方式
        self.browser.find_element(by=By.LINK_TEXT, value='账户登录').click()
        # 输入框输入账号和密码
        self.browser.find_element(value='loginname').send_keys(loginname)
        self.browser.find_element(value='nloginpwd').send_keys(password)
        time.sleep(2)
        # 登录
        self.browser.find_element(value='loginsubmit').click()
        # 登录成功会跳转到京东首页,并且没有请登录字段。
        # 延长30s,自己手工验证;30s,之内没验证,自动断开
        start_time = time.time()
        while True:
            condition = (self.browser.page_source.find('你好,请登录') == -1) and (
                    self.browser.current_url == 'https://www.jd.com/')
            # 如果登录成功,跳出循环
            if condition:
                return True
            time1 = int(time.time() - start_time)
            # 60s没验证成功,直接终止selenium进程
            if time1 >= 60:
                self.browser.quit()
                return False

    def get_data(self):
        # 执行js语句,拉动进度条件, 把进度条件拉倒最底部+提取商品信息
        self.browser.execute_script(
            'window.scrollTo(0,document.body.scrollHeight)'
        )
        # 给页面元素加载时预留时间
        time.sleep(2)
        # 用 xpath 提取每页中所有商品,最终形成一个大列表
        li_list = self.browser.find_elements(by=By.XPATH, value='//*[@id="J_goodsList"]/ul/li')
        for li in li_list:
            # 构建空字典
            item = {}
            item['name'] = li.find_element(by=By.XPATH, value='.//div[@class="p-name"]/a/em').text.strip()
            item['price'] = li.find_element(by=By.XPATH, value='.//div[@class="p-price"]').text.strip()
            item['count'] = li.find_element(by=By.XPATH, value='.//div[@class="p-commit"]/strong').text.strip()
            item['shop'] = li.find_element(by=By.XPATH, value='.//div[@class="p-shopnum"]').text.strip()
            print(item)
            self.i += 1

    def run(self):
        is_login =  self.login_html(loginname, password)
        # 如果登录失败直接终结函数
        if not is_login :
            return

        self.get_html()
        # 循环执行点击"下一页"操作
        while True:
            # 获取每一页要抓取的数据
            self.get_data()
            # 判断是否是最一页
            if self.browser.page_source.find('pn-next disabled') == -1:
                self.browser.find_element(by=By.CLASS_NAME, value='pn-next').click()
                # 预留元素加载时间
                time.sleep(1)
            else:
                print('数量', self.i)
                break
        time.sleep(3)
        self.browser.quit()


if __name__ == '__main__':
    loginname = '用户名'
    password = '密码'
    spider = JdSpider()
    spider.run()
相关推荐
似璟如你4 分钟前
Java开发八股文之基础篇+spring+集合
java·开发语言·面试
本杰明1526 分钟前
2025/7/14——java学习总结
java·开发语言·学习
2345VOR11 分钟前
【C#地图显示教程:实现鼠标绘制图形操作】
开发语言·c#·计算机外设·地图显示鼠标交互
开开心心_Every17 分钟前
可增添功能的鼠标右键优化工具
开发语言·pdf·c#·计算机外设·电脑·音视频·symfony
星释17 分钟前
优雅的Java:01.数据更新如何更优雅
java·开发语言·spring boot
The_era_achievs_hero18 分钟前
微信131~140
开发语言·javascript·微信
LeonYangRyeon19 分钟前
解锁SQL“密码”:SELECT DISTINCT END AS的深度剖析与实战指南
java·开发语言
☆璇1 小时前
【数据结构】排序
c语言·开发语言·数据结构·算法·排序算法
我要成为c嘎嘎大王1 小时前
【C++】初识C++(1)
开发语言·c++
良木林1 小时前
JavaScript书写基础和基本数据类型
开发语言·前端·javascript