Python爬虫淘宝基于selenium抓取淘宝商品数据2021年测试过滑动验证

2023-05-16

配置一下"可能需要修改的参数",就可以食用底部代码了,ps:可能已失效

  • 本文章代码功能
  • 准备工作
    • Python用到的库和准备工作
  • 可能需要修改的参数
    • 在CMD中打开一个Chrome浏览器并启用端口给Selenium调用
    • 导入模块
    • 调用刚打开的Chrome浏览器与Python建立连接
  • 全部代码复制可用
    • 在c盘新建一个app/chrome文件夹用来存放浏览器数据就行

本文章代码功能

  1. 淘宝搜索关键词,收集搜索到1到100页根据销量排名的各个商品信息:

    1. 商品本次排名
    2. 商品链接
    3. 商品搜索页的图片链接
    4. 商品店铺旺旺名称
    5. 商品标题
    6. 商品价格
    7. 商品销量
    8. 抓取的时间
    9. 商品ID
  2. 商品信息写入SQLite数据库,数据库表名为搜索的关键词
    如果商品ID和销量与表中的一样则不写入数据库,如果商品ID有了但是销量不一样则添加这条新的数据,即防止出现完全重复的数据又能记录每个商品在不同时间段销量的变化

  3. 第一次写文章,有什么不足的地方欢迎指点和探讨。

  4. 有收获的话点个赞,让小弟知道还有人在看这篇文章。

  5. 代码运行样式:在这里插入图片描述

  6. 数据库样式:在这里插入图片描述

  7. 测试查询100页没有问题

准备工作

淘宝反爬虫比较严格,所以使用Selenium比较贴近真实使用环境,出现验证滑动条比较容易过。然后用了SQLite数据库来储存数据,要是觉得SQLite数据库用的不方便可以在Python中加条函数导出到Excel。

参考代码:

from xlsxwriter.workbook import Workbook
import sqlite3
workbook = Workbook('output.xlsx')
worksheet = workbook.add_worksheet('男装')
content=sqlite3.connect('content.db')
c=conn.cursor()
ti=c.execute("select * from '男装'")
for i, row in enumerate(ti):
    for j, value in enumerate(row):
        worksheet.write(i, j, value)
workbook.close()

Python用到的库和准备工作

  1. Python3.7开发环境
  2. re库
  3. time库
  4. sqlite3库
  5. Selenium库 :调用Chrome浏览器的webdriver驱动文件,点击下载chromedrive 。将下载的浏览器驱动文件chromedriver丢到Chrome浏览器目录中的Application文件夹下,配置Chrome浏览器位置到PATH环境。
    Selenium 入门参考文献;
  6. SQLite数据库,安装和配置如下:
    1. SQLite下载链接 ,下载sqlite-tools-win32-**.zip 和 sqlite-dll-win32-*.zip 压缩文件。
    2. 在盘根目录创建sqlite文件夹,并添加到 PATH 环境变量。解压上面两个压缩文件(得到 sqlite3.def、sqlite3.dll 和 sqlite3.exe 文件)到sqlite文件夹。
    3. 在命令提示符下,使用 sqlite3 命令,显示如下就是安装成功了:
      C:\>sqlite3
      SQLite version 3.7.15.2 2013-01-09 11:53:05
      Enter ".help" for instructions
      Enter SQL statements terminated with a ";"
      sqlite>
      

可能需要修改的参数

在CMD中打开一个Chrome浏览器并启用端口给Selenium调用

remote-debugging-port= 浏览器使用的端口,自己定义一个就行。
user-data-dir= 新打开的浏览器文件目录,自己创建一个就行。
示例代码:

chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\App\Chrome"

第一次创建浏览器文件,在打开浏览器之后最好去登录一下淘宝

导入模块

from selenium import webdriver
import time
import re
import sqlite3
from selenium.webdriver.common.action_chains import ActionChains

调用刚打开的Chrome浏览器与Python建立连接

配置Chrome浏览浏览器

chromedriver.exe的目录根据自己放的位置自行修改

增加一个js代码,在页面打开前修改windows.navigator.webdriver检测结果为undefined
代码如下:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
chrome_driver = r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
Chrome = webdriver.Chrome(chrome_driver, options=chrome_options)
# 设置位置和宽高
Chrome.set_window_position(x=1000, y=353)
Chrome.set_window_size(width=900, height=500)
# 拦截webdriver检测代码
Chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """
              Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
              })
              """})

全部代码复制可用

路径配置没问题的话,新建一个.py文件就可以用了。
2021年1月24日更新代码

在c盘新建一个app/chrome文件夹用来存放浏览器数据就行

数据库中的两个值解读:

  1. key_id :主键,自增加的不用理会
  2. order_number:本次运行中的排名,每次运行都是从1开始添加的
from selenium import webdriver
import time
import re
import os
import sqlite3
from selenium.webdriver.common.action_chains import ActionChains
'''
根据关键词,在淘宝搜索页面按照销量排序,收集商品信息.
在cmd中运行: chrome.exe --remote-debugging-port=9222 --user-data-dir=""
数据库表查询:先根据id选取唯一值,根据time时间排序,根据sales观察销量变化
'''
def open_chrome():
    user_port = input('输入要使用的端口(回车默认9222):') or 9222
    find_port = os.popen('netstat -ano|findstr {}'.format(user_port)).read()
    while str(user_port) in find_port:
        print(user_port, '端口已被占用,正在更换端口')
        user_port += 1
        find_port = os.popen('netstat -ano|findstr {}'.format(user_port)).read()
    os.system(r'start chrome.exe --remote-debugging-port={} --user-data-dir="C:\app\chrome"'.format(user_port))
    print('使用端口:',user_port)

class ItemClass:
    def __init__(self, url_keyword, user_page):
        self.url_keyword = url_keyword
        self.user_page = user_page
        self.img_url = None
        self.item_url = None
        self.sales = None
        self.price = None
        self.detail_head = None
        self.shop_name = None
        self.order_number = 0
        self.t_dic = []
        self.conn = None
        self.cursor = None
        self.img_err = 0
        self.err_log = []
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:{}".format(user_port))
        chrome_driver = r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
        try:
            self.Chrome = webdriver.Chrome(chrome_driver, options=chrome_options)
        except Exception as err:
            print('开启浏览器错误:\n', err)
            print(r'cmd中打开chrome.exe --remote-debugging-port=9222 --user-data-dir=""')
            self.err_log.append(err)
        # 设置位置和宽高
        self.Chrome.set_window_position(x=1000, y=353)
        self.Chrome.set_window_size(width=900, height=500)
        # 拦截webdriver检测代码
        self.Chrome.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """
                      Object.defineProperty(navigator, 'webdriver', {
                      get: () => undefined
                      })
                      """})

    def searchwords(self):
        self.Chrome.get('https://taobao.com')
        self.Chrome.find_element_by_xpath('//*[@id="q"]').send_keys('{}'.format(self.url_keyword))
        time.sleep(0.3)
        self.Chrome.find_element_by_xpath('//button[@class="btn-search tb-bg"]').click()

    # 如果出现验证码拦截
    def intercept(self):
        if '验证码拦截' in self.Chrome.title:
            print('滑动验证码')
            slider = self.Chrome.find_element_by_xpath("//span[contains(@class, 'btn_slide')]")
            try:
                # 找到滑块
                # 判断滑块是否可见
                if slider.is_displayed():
                    # 点击并且不松开鼠标
                    ActionChains(self.Chrome).click_and_hold(on_element=slider).perform()
                    # 往右边移动258个位置
                    ActionChains(self.Chrome).move_by_offset(xoffset=258, yoffset=0).perform()
                    # 松开鼠标
                    ActionChains(self.Chrome).pause(0.5).release().perform()
            except Exception as err:
                print('验证码滑动出错')
                print(err)
                self.err_log.append(err)
            time.sleep(1)

    # 直接下拉到固定的最底栏
    def scrolldown(self):
        y_plus = 450
        y = 0
        for i in range(9):
            y += y_plus
            self.Chrome.execute_script("window.scroll(0,{})".format(y))
            time.sleep(0.2)
        # self.Chrome.execute_script("window.scroll(400,200)")

    # 下拉到最底栏第二种,检查是否到最底栏
    def scrolldown_two(self):
        t = True
        y = 400
        x = self.Chrome.execute_script("return document.body.scrollHeight;")
        while t:
            check_height = self.Chrome.execute_script("return document.body.scrollHeight;")
            x += y
            self.Chrome.execute_script("window.scroll(0,{})".format(x))
            time.sleep(0.5)
            check_height1 = self.Chrome.execute_script("return document.body.scrollHeight;")
            if check_height == check_height1:
                # print(str(check_height1))
                t = False
        self.Chrome.execute_script("window.scroll(0,200)")

    # 按照销量排序
    def sales_sort(self):
        time.sleep(1)
        self.Chrome.find_element_by_xpath('//a[@data-value="sale-desc"]').click()

    # 点击下一页
    def click_next(self):
        self.Chrome.execute_script("window.scroll(400,150)")
        self.Chrome.find_element_by_xpath('//a[@title="下一页"]').click()
        time.sleep(1)

    # 获得商品列表信息并储存
    def get_content(self):
        time.sleep(0.2)
        self.scrolldown()
        time.sleep(0.5)
        for item in self.Chrome.find_elements_by_xpath('.//*[@class="item J_MouserOnverReq  "]'):
            try:
                self.order_number += 1
                self.img_url = \
                    item.find_element_by_xpath('.//*[@class="J_ItemPic img"]').get_attribute('src').split('_360')[0]
                self.item_url = item.find_element_by_xpath('.//*[@class="pic-link J_ClickStat J_ItemPicA"]')\
                    .get_attribute('href').split('&')[0]
                sales_tem = item.find_element_by_xpath('.//*[@class="deal-cnt"]').text
                self.sales = int(''.join(re.findall(r'\d*\d', sales_tem)))
                self.price = float(item.find_element_by_xpath('.//*[@class="price g_price g_price-highlight"]/strong').text)
                self.detail_head = item.find_element_by_xpath('.//*[@class="J_ItemPic img"]').get_attribute('alt')
                self.shop_name = item.find_element_by_xpath('.//*[@class="shopname J_MouseEneterLeave J_ShopInfo"]').text
                if '万' in sales_tem:
                    self.sales = int(float(re.findall(r'\d+.\d*', sales_tem)[0])*10000)
                if '.gif' in self.img_url:
                    self.img_err += 1
                    print('排名第{}位:\t销量:{}件,\t价格为:{}元,  \t店铺名:{},  \t图片错误:{}'.format(self.order_number, self.sales, self.price, self.shop_name, self.img_url))
                else:
                    print('排名第{}位:\t销量:{}件,\t价格为:{}元,  \t店铺名:{}'.format(self.order_number, self.sales, self.price, self.shop_name))
                self.t_dic = [self.item_url, self.img_url, self.shop_name, self.detail_head, self.price, self.sales]
                # 储存在多张表
                # self.save_content()
                # 储存在一表
                self.save_content_one()
            except Exception as err:
                print('第{}号出错,出错代码为: '.format(self.order_number), err)
                self.err_log.append('第{}号,出错代码为:{} '.format(self.order_number, err))
                continue

    # 储存多张表
    def save_content(self):
        t_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        # 获取商品id
        id_and_table_name = int(self.item_url.split('=')[1])
        # 字典里增加时间和id
        self.t_dic.append(t_time)
        self.t_dic.append(id_and_table_name)
        # 创建表sql代码,如果不存在则创建表
        sql_if_exists = '''
                        CREATE TABLE IF NOT EXISTS [{}] (
                        sales       INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                        order_number       INT,
                        id          INT,
                        time        TEXT,
                        price       REAL,
                        header      TEXT,
                        shop        TXEXT,
                        item        TEXT,
                        img         TEXT);
                        '''
        # 写入表sql代码,如果表里有匹配到的数据,则写入否则不写入
        sql_insert_or_ignore = '''
                                INSERT INTO [{0}] (order_number,id,time,sales,price,header,shop,img,item) \
                                SELECT '{2}',{1[7]},'{1[6]}','{1[5]}','{1[4]}','{1[3]}','{1[2]}','{1[1]}','{1[0]}'
                                WHERE NOT EXISTS (SELECT *FROM [{0}] WHERE id='{1[7]}' AND sales='{1[5]}');
                                '''
        # 执行创建表sql代码,用商品id当表名
        self.cursor.execute(sql_if_exists.format(id_and_table_name))
        # 执行写入表sql代码
        self.cursor.execute(sql_insert_or_ignore.format(id_and_table_name, self.t_dic, self.order_number))
        # 保存
        self.conn.commit()
        # 字典归零
        self.t_dic = []

    # 储存在一张表中
    def save_content_one(self):
        # 时间
        t_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
        # 获取商品id
        t_id = int(self.item_url.split('=')[1])
        # 字典里加入时间
        self.t_dic.append(t_time)
        # 字典里加入商品id
        self.t_dic.append(t_id)
        # 用搜索关键词当表名
        table_name = self.url_keyword
        # 创建表sql代码,如果不存在则创建表
        sql_if_exists = '''
                        CREATE TABLE IF NOT EXISTS [{}] (
                        key_id       INTEGER NOT NULL PRIMARY KEY  AUTOINCREMENT,
                        order_number    INT,
                        id          INT,
                        time        TEXT,
                        sales       INT,
                        price       REAL,
                        header      TEXT,
                        shop        TXEXT,
                        item        TEXT,
                        img         TEXT);
                        '''
        # 写入表sql代码,如果表里有匹配到的数据,则写入否则不写入
        sql_insert_or_ignore = '''
                     INSERT INTO [{0}] (order_number,id,time,sales,price,header,shop,img,item) \
                     SELECT '{2}',{1[7]},'{1[6]}','{1[5]}','{1[4]}','{1[3]}','{1[2]}','{1[1]}','{1[0]}'
                     WHERE NOT EXISTS (SELECT *FROM [{0}] WHERE id='{1[7]}' AND sales='{1[5]}');
                     '''
        # 执行创建表sql代码
        self.cursor.execute(sql_if_exists.format(table_name))
        # 执行写入表sql代码
        self.cursor.execute(sql_insert_or_ignore.format(table_name, self.t_dic, self.order_number))
        # 保存
        self.conn.commit()
        # 字典归零
        self.t_dic = []

    # 开始
    def start(self, t_path=r'content.db'):
        print('开始运行')
        self.conn = sqlite3.connect(t_path)
        self.cursor = self.conn.cursor()
        get_page = 0  # 查询到了多少页
        # url = 'https://s.taobao.com/search?q={}'.format(self.url_keyword)
        # self.Chrome.get(url)
        self.searchwords()
        time.sleep(1)
        self.intercept()
        self.sales_sort()   # 按销量排序
        try:
            while get_page < self.user_page:
                get_page += 1
                print('抓取第{}页:'.format(get_page))
                self.get_content()
                if get_page != self.user_page:
                    self.click_next()
        except Exception as err:
            print('出现错误:', err)
            self.err_log.append(err)
            self.cursor.close()
            self.conn.commit()
            self.conn.close()
        else:
            print('抓取结束一共抓取了{}位'.format(self.order_number))
            self.cursor.close()
            self.conn.commit()
            self.conn.close()


if __name__ == '__main__':
    start_time = time.time()
    # 打开远程调用浏览器
    user_port = 9222
    # if '9222' not in os.popen('netstat -ano|findstr 9222').read():
        # print('打开chrome浏览器')
    open_chrome()
    # 程序开始
    browser = ItemClass(url_keyword=input('输入要查询的关键词(默认男童):') or '男童', user_page=int(input('查询的页数(默认10):') or 10))
    browser.start()

    # 程序结束打印信息
    end_time = time.time()
    run_time = '%.2f' % (end_time-start_time)
    print('运行了:{}秒'.format(run_time))
    # 写入日志
    with open('log.txt', 'a+') as f:
        f.write('\n程序运行结束日期:{}\n抓取数量:{}\n使用时间:{}秒\n图片获取错误:{}个\n程序出错信息:{}个\n'.format
                (time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())),
                 browser.order_number, run_time, browser.img_err, len(browser.err_log)))
        for err_tosrt in browser.err_log:
            f.write(str(err_tosrt)+'\n')

==如果有收获、点个赞哦=

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

Python爬虫淘宝基于selenium抓取淘宝商品数据2021年测试过滑动验证 的相关文章

  • 11.如何快速进门新技术

    在app后端的工作中 xff0c 经常会接触到新的技术 作为一名后端人员 xff0c 面对开发的压力 xff0c 快速地入门新的技术 xff0c 融入到项目当中 xff0c 这已经成了一个后端人员的必备技能 在这篇文章 xff0c 根据总结
  • 12.app后端如何选择合适的数据库产品

    app后端的开发中 xff0c 经常要面临的一个问题是 xff1a 数据放在哪里 mysql xff1f redis xff1f mongodb xff1f 现在有这么多优秀的开源数据库产品 xff0c 怎么根据业务场景来选择合适的数据 常
  • 13.app后端为什么要用到消息队列

    很多没有实际项目经验的小伙伴 xff0c 对消息队列系统非常陌生 xff0c 看着很多架构的介绍中 xff0c 都提到消息队列 但是 xff0c 不知道为什么要用消息队列 xff1f 什么是消息队列 xff1f 常见的消息队列产品有哪些 x
  • 14.app后端如何设计api

    app和后端的交互 xff0c 一般都是通过后端提供的api实现 api的设计 xff0c 估计很多刚进入app后端的小伙伴会一无头绪 xff0c 不知道怎么入门 下面根据自己3年的app后端经验 xff0c 总结出下几个api设计原则 x
  • 15.app后端怎么设计用户登录方案

    在很多app中 xff0c 都需要用户的登录操作 登录 xff0c 就需要用到用户名和密码 为了安全起见 xff0c 暴露明文密码的次数越少越好 怎么能最大程度避免泄露用户的密码呢 xff1f 在登录后 xff0c app后端怎么去验证和维
  • Struts 1 中DispatcherAction类原理浅析

    文章标题 Struts 1 中 DispatcherAction 类原理浅析 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xf
  • Python 高级编程技巧 第二讲 内置不可变类型并修改其实例化行为、slots属性、contextmanager上下文管理器、创建可管理对象属性、类比较操作

    第二讲 一 如何派生内置不可变类型并修改其实例化行为 这里有一道练习题 xff0c 我们想定义一个新类型的元组 xff0c 对于传入的可迭代对象 xff0c 我们只保留其中int类型并且值还要大于0 或许我们可以这么写 xff0c 尝试一下
  • 16.app后端如何保证通讯安全--url签名

    app和后端的通讯过程中 xff0c api请求有可能被别人截取或不小心泄露 那么 xff0c 怎么保证api请求的安全呢 xff1f 在这篇文章中 xff0c 介绍一种常见的保证api请求安全的做法 url签名 1 url签名详解 在前一
  • 17.app后端如何保证通讯安全--aes对称加密

    在上文 16 app后端如何保证通讯安全 url签名 提到 xff0c url签名有两个缺点 xff0c 这两个缺点 xff0c 如果使用对称加密方法的话 xff0c 则完全可以避免这两个缺点 在本文中 xff0c 会介绍对称加密的具体原理
  • 18.app后端如何实现LBS

    移动互联网 xff0c 除了一直在线这个特点外 xff0c 还有一个重要特点 xff0c 能定位到手机的位置 查找附近的人 附近的餐馆等服务 xff0c 以及大量的o2o应用 都需要使用LBS Location Based Services
  • 19.最省钱的app发短信方法

    在创业团队中 xff0c 一个重要的原则是能省就省 xff0c 该花就花 xff0c 把银子用在刀刃上 现在的app xff0c 为了获取用户的社交关系 xff0c 需要用户的手机号注册 用手机号注册就涉及到一个发送短信验证码的问题 xff
  • 20.如何从app业务逻辑提炼api接口

    在app后端的工作中 xff0c 设计api是一个很考验设计能力的工作 在项目的初始阶段 xff0c 只知道具体的业务逻辑 xff0c 那怎么把业务逻辑抽象和提炼 xff0c 设计出api呢 xff1f 通过阅读本文 xff0c 可解答以上
  • 21.app后端如何高效更新内容

    在app的主页或通知栏 xff0c 经常需要通过api取最新的数据 那么 xff0c 怎么在这部分上做优化 xff0c 使获取内容的效率更高呢 xff1f 在本文中 xff0c 通过推拉和增量更新 xff0c 实现了一种高效获取数据的策略
  • 22.在创业公司中的成长

    在 app后端 qq群中 xff0c 经常被问到的一个问题 xff1a 怎么设计一个应付高并发的架构 诚然 xff0c 设计一个能应付百万流量的高并发架构 xff0c 是很令人兴奋的技术挑战 xff0c 但在创业公司中的成长 xff0c 难
  • 23.app后端如何架设文件系统

    现在app展现内容的形式多种多样的 xff0c 有文字 xff0c 图片 xff0c 声音 xff0c 视频等等 xff0c 其中文件占了一个很大的比重 随着app不断运营 xff0c 文件会越来越多 xff0c 占用的磁盘空间也不断增大
  • 24.从公众号筹集10万股份学到的商业化思维

    1 忽然间看到了卖公众号的股份的玩法 昨天 xff0c 在公众号 老鹰说 id joeytalks 看到了他要弄一个新的玩法 xff0c 卖公众号的股份 xff0c 熟人1000块一股 xff0c 陌生人2000块一股 当时不以为然 xff
  • 25.创业真的需要app吗?真的需要外包吗?

    两个星期前 xff0c 一名亲戚的朋友打算投入自己的二十多万元去搞个摄影社交app xff0c 问我有没有靠谱的外包推荐 xff0c 我赶紧劝住他 xff0c 现在app的成本已经非常高了 xff0c 初期的研发就要十几万 xff0c 加上
  • HarmonyOS鸿蒙的测试体验

    HarmonyOS 2 0手机开发者Beta公测招募 xff0c 申请开发者账号 xff0c 报名 xff0c 就可以抢先体验 除了抢先体验 xff0c 使用真机测试外 xff0c 使用模拟器也可以尝试体验 那测试人员可以使用HVD和Clo
  • 单点登录 Ucenter 分析

    原文 xff1a http blog csdn net ebw123 article details 9417231 首先我们先来了解下 Ucenter登录步骤 1 用户登录discuz xff0c 通过logging php文件中的函数u
  • 当Ucenter和应用通信失败

    http blog sina com cn s blog 775f158f010135uz html 失败是常见的 对于初次接触Ucenter的人来讲 xff0c 添加一个自己的应用最头疼的就是发现通信失败 如果要解决这个问题 xff0c

随机推荐

  • 26.app后端怎么架设推送服务

    推送服务已经是app的标配了 架设推送服务 xff0c 除了可以使用第三方服务商外 xff0c 也有大量的开源技术可以选择 现在推送主要分两块 xff0c android推送和ios推送 xff0c 在下面分别论述 xff1a 1 Andr
  • 27.app后端搭建聊天服务器的经历

    现在 xff0c 聊天功能已经成了社交app的标配了 但是 xff0c 众多web开发出生的程序员对聊天相关的服务的不了解 xff0c 带来了很多开发上的困扰 在这篇文章中 xff0c 根据下面3个方面 xff0c 谈谈聊天服务 1 聊天服
  • 29.满大街创业团队的年代,一不小心就被忽悠

    长期呆在创业团队中 xff0c 我人品不咋的 xff0c 遇到过各种坑人的项目和团队 下面讲讲3件坑人的事情 1 不靠谱的项目 在第二个创业项目失败后一个星期 xff0c 以前的UI andy忽然找上我 xff0c 有个老板想投资个项目 x
  • (转)cookie和session机制之间的区别与联系

    出处为中国JAVA手机网 lt www cnjm net gt http www cnjm net tech article1113 html 具体来说cookie机制采用的是在客户端保持状态的方案 它是在用户端的会话状态的存贮机制 xff
  • 30.因为绘画,我在豆瓣上认识了老婆

    导读 xff1a 这篇文章的上半部分 xff0c 是我2011年在豆瓣上发表的 五天学会绘画 书评 xff0c 我和老婆就相识于这个书评 后记部分 xff0c 是对绘画 xff0c 和用互联网方法找女友的一些思考 五天学会绘画 xff0c
  • 对太极拳中的“势”有所领悟

    文章标题 对太极拳中的 势 有所领悟 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 今天帮一个亲戚搬杂物 xff0c 从三楼的杂物房搬到一楼的花园 开始领悟 势 是搬一个很重
  • 本人写的Android上RSS阅读器简单介绍

    文章标题 本人写的 Android 上 RSS 阅读器简单介绍 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 个人博客 http blog csdn net newjueqi
  • 整合 ucenter 注册自动激活

    http my oschina net banbo blog 311691 应用整合 UCenter xff0c 同步注册到 Discuz 的用户 xff0c 在 Discuz 登录时得手动激活 xff0c 用户体验很不好 xff0c 不过
  • switch case语句用法详解

    switch 开关 的意思 xff0c 是一种 选择 语句 xff0c 它用法非常简单 switch 是多分支选择语句 说得通俗点 xff0c 多分支就是多个 if语句的组合 从功能上说 xff0c switch 语句和 if 语句完全可以
  • 32.APP后端处理表情的一些技巧

    app应用中文字夹带表情是个很常见的现象 甚至一些40多岁的大叔级用户 xff0c 也喜欢在自己的昵称中夹带表情 xff0c 在产品运营后发现这个现象 xff0c 彻底颠覆了我的世界观 在后台处理表情的时间 xff0c 我遇到过下面3个问题
  • 33.APP后端处理视频的方案

    在当前的app应用中 xff0c 到处都能看到视频的身影 xff0c 例如 xff0c 在社交类的app上 xff0c 用户可以拍摄属于自己的小视频 xff0c 并发布到相应得栏目 xff0c 增加和好友们互动的机会 后台常见的视频处理有以
  • 34.如何获取app(apk和ipa)中的资源

    移动互联网中 xff0c 主要的两个平台是android和ios xff0c android上文件的安装包是后缀名为apk的文件 xff0c ios上文件的安装包是后缀名为ipa的文件 xff0c 在本文分析一下这两种文件的特点 xff0c
  • 35.app后端搜索入门

    现在人们的网络生活已经离不开搜索了 xff0c 遇到不懂的问题 xff0c 想知道的事情 xff0c 搜索一下 xff0c 就知道答案 在app中 xff0c 最常见的搜索情景就是搜索用户 只有几百 xff0c 几千的用户量时 xff0c
  • 36.如何使用定时任务

    lt span style 61 34 font family Arial Helvetica sans serif background color rgb 255 255 255 34 gt 在app后台开发中 xff0c 经常需要执行
  • goroutine背后的系统知识

    http www sizeofvoid net goroutine under the hood o语言从诞生到普及已经三年了 xff0c 先行者大都是Web开发的背景 xff0c 也有了一些普及型的书籍 xff0c 可系统开发背景的人在学
  • 37.创业团队不是天堂

    在媒体的报导中 xff0c 创业公司一直都是充满情怀的 xff1a 宽松的工作环境 xff0c 不差的薪水 xff0c 不断高涨的融资额 xff0c 吃不完的零食和喝不完的饮料 xff0c 一群年轻人为了实现自己的梦想而一起奋斗 种种诱人的
  • java小程序(1)

    文章标题 java 小程序 xff08 1 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出
  • java小程序(2)

    文章标题 java 小程序 xff08 2 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出
  • java小程序(3)

    文章标题 java 小程序 xff08 3 xff09 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出
  • Python爬虫淘宝基于selenium抓取淘宝商品数据2021年测试过滑动验证

    配置一下 34 可能需要修改的参数 34 xff0c 就可以食用底部代码了 ps 可能已失效 本文章代码功能准备工作Python用到的库和准备工作 可能需要修改的参数在CMD中打开一个Chrome浏览器并启用端口给Selenium调用导入模