当前位置:

首页 > 编程开发 > Python怎么爬取京东商品信息评论存并进MySQL

Python怎么爬取京东商品信息评论存并进MySQL

构建mysql数据表问题:使用SQLalchemy时,非主键不能设置为自增长,但是我想让这个非主键仅仅是为了作为索引,autoincrement=True无效,该怎么实现让它自增长呢?fromsqlalchemyimportString,Integer,Text,Columnfromsqlalchemyimportcreate_enginefromsqlalchemy.ormimportsessionmakerfromsqlalchemy.ormimportscoped_sessionfromsqlalc

本文目录

    构建mysql数据表

    问题:使用SQL alchemy时,非主键不能设置为自增长,但是我想让这个非主键仅仅是为了作为索引,autoincrement=True无效,该怎么实现让它自增长呢?

    from sqlalchemy import String,Integer,Text,Column
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.orm import scoped_session
    from sqlalchemy.ext.declarative import declarative_base
     
    engine=create_engine(
        "mysql+pymysql://root:root@127.0.0.1:3306/jdcrawl?charset=utf8",
        pool_size=200,
        max_overflow=300,
        echo=False
    )
     
    BASE=declarative_base() # 实例化
     
    class Goods(BASE):
        __tablename__='goods'
        id=Column(Integer(),primary_key=True,autoincrement=True)
        sku_id = Column(String(200), primary_key=True, autoincrement=False)
        name=Column(String(200))
        price=Column(String(200))
        comments_num=Column(Integer)
        shop=Column(String(200))
        link=Column(String(200))
     
    class Comments(BASE):
        __tablename__='comments'
        id=Column(Integer(),primary_key=True,autoincrement=True,nullable=False)
        sku_id=Column(String(200),primary_key=True,autoincrement=False)
        comments=Column(Text())
     
    BASE.metadata.create_all(engine)
    Session=sessionmaker(engine)
    sess_db=scoped_session(Session)

    第一版:

    问题:爬取几页评论后就会爬取到空白页,添加refer后依旧如此

    尝试解决方法:将获取评论地方的线程池改为单线程,并每获取一页评论增加延时1s

    # 不能爬太快!!!不然获取不到评论
     
    from bs4 import BeautifulSoup
    import requests
    from urllib import parse
    import csv,json,re
    import threadpool
    import time
    from jd_mysqldb import Goods,Comments,sess_db
     
    headers={
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
        'Cookie': '__jdv=76161171|baidu|-|organic|%25E4%25BA%25AC%25E4%25B8%259C|1613711947911; __jdu=16137119479101182770449; areaId=7; ipLoc-djd=7-458-466-0; PCSYCityID=CN_410000_0_0; shshshfpa=07383463-032f-3f99-9d40-639cb57c6e28-1613711950; shshshfpb=u8S9UvxK66gfIbM1mUNrIOg%3D%3D; user-key=153f6b4d-0704-4e56-82b6-8646f3f0dad4; cn=0; shshshfp=9a88944b34cb0ff3631a0a95907b75eb; __jdc=122270672; 3AB9D23F7A4B3C9B=SEELVNXBPU7OAA3UX5JTKR5LQADM5YFJRKY23Z6HDBU4OT2NWYGX525CKFFVHTRDJ7Q5DJRMRZQIQJOW5GVBY43XVI; jwotest_product=99; __jda=122270672.16137119479101182770449.1613711948.1613738165.1613748918.4; JSESSIONID=C06EC8D2E9384D2628AE22B1A6F9F8FC.s1; shshshsID=ab2ca3143928b1b01f6c5b71a15fcebe_5_1613750374847; __jdb=122270672.5.16137119479101182770449|4.1613748918',
        'Referer': 'https://www.jd.com/'
    }
     
    num=0   # 商品数量
    comments_num=0   # 评论数量
     
    # 获取商品信息和SkuId
    def getIndex(url):
        session=requests.Session()
        session.headers=headers
        global num
        res=session.get(url,headers=headers)
        print(res.status_code)
        res.encoding=res.apparent_encoding
        soup=BeautifulSoup(res.text,'lxml')
        items=soup.select('li.gl-item')
        for item in items[:3]:  # 爬取3个商品测试
            title=item.select_one('.p-name a em').text.strip().replace(' ','')
            price=item.select_one('.p-price strong').text.strip().replace('¥','')
            try:
                shop=item.select_one('.p-shopnum a').text.strip()   # 获取书籍时查找店铺的方法
            except:
                shop=item.select_one('.p-shop a').text.strip()  #   获取其他商品时查找店铺的方法
            link=parse.urljoin('https://',item.select_one('.p-img a').get('href'))
            SkuId=re.search('\d+',link).group()
            comments_num=getCommentsNum(SkuId,session)
            print(SkuId,title, price, shop, link, comments_num)
            print("开始存入数据库...")
            try:
                IntoGoods(SkuId,title, price, shop, link, comments_num)
            except Exception as e:
                print(e)
                sess_db.rollback()
            num += 1
            print("正在获取评论...")
            # 获取评论总页数
            url1 = f'https://club.jd.com/comment/productPageComments.action?productId={SkuId}&score=0&sortType=5&page=0&pageSize=10'
            headers['Referer'] = f'https://item.jd.com/{SkuId}.html'
            headers['Connection']='keep-alive'
            res2 = session.get(url1,headers=headers)
            res2.encoding = res2.apparent_encoding
            json_data = json.loads(res2.text)
            max_page = json_data['maxPage']  # 经测试最多可获取100页评论,每页10条
            args = []
            for i in range(0, max_page):
                # 使用此链接获取评论得到的为json格式
                url2 = f'https://club.jd.com/comment/productPageComments.action?productId={SkuId}&score=0&sortType=5&page={i}&pageSize=10'
                # 使用此链接获取评论得到的非json格式,需要提取
                # url2_2=f'https://club.jd.com/comment/productPageComments.action?callback=jQuery9287224&productId={SkuId}&score=0&sortType=5&page={i}&pageSize=10'
                args.append(([session,SkuId,url2], None))
            pool2 = threadpool.ThreadPool(2)   # 2个线程
            reque2 = threadpool.makeRequests(getComments,args)  # 创建任务
            for r in reque2:
                pool2.putRequest(r) # 提交任务到线程池
            pool2.wait()
     
    # 获取评论总数量
    def getCommentsNum(SkuId,sess):
        headers['Referer']=f'https://item.jd.com/{SkuId}.html'
        url=f'https://club.jd.com/comment/productCommentSummaries.action?referenceIds={SkuId}'
        res=sess.get(url,headers=headers)
        try:
            res.encoding=res.apparent_encoding
            json_data=json.loads(res.text)  # json格式转为字典
            num=json_data['CommentsCount'][0]['CommentCount']
            return num
        except:
            return 'Error'
     
    # 获取评论
    def getComments(sess,SkuId,url2):
        global comments_num
        print(url2)
        headers['Referer'] = f'https://item.jd.com/{SkuId}.html'
        res2 = sess.get(url2,headers=headers)
        res2.encoding='gbk'
        json_data=res2.text
        '''
        # 如果用url2_2需要进行如下操作提取json
        start = res2.text.find('jQuery9287224(') + len('jQuery9287224(')
        end = res2.text.find(');')
        json_data=res2.text[start:end]
        '''
        dict_data = json.loads(json_data)
        try:
            comments=dict_data['comments']
            for item in comments:
                comment=item['content'].replace('\n','')
                # print(comment)
                comments_num+=1
                try:
                    IntoComments(SkuId,comment)
                except Exception as e:
                    print(e)
                    sess_db.rollback()
        except:
            pass
     
    # 商品信息入库
    def IntoGoods(SkuId,title, price, shop, link, comments_num):
        goods_data=Goods(
            sku_id=SkuId,
            name=title,
            price=price,
            comments_num=comments_num,
            shop=shop,
            link=link
        )
        sess_db.add(goods_data)
        sess_db.commit()
     
    # 评论入库
    def IntoComments(SkuId,comment):
        comments_data=Comments(
            sku_id=SkuId,
            comments=comment
        )
        sess_db.add(comments_data)
        sess_db.commit()
     
    if __name__ == '__main__':
        start_time=time.time()
        urls=[]
        KEYWORD=parse.quote(input("请输入要查询的关键词:"))
        for i in range(1,2):    # 爬取一页进行测试
            url=f'https://search.jd.com/Search?keyword={KEYWORD}&wq={KEYWORD}&page={i}'
            urls.append(([url,],None))  # threadpool要求必须这样写
        pool=threadpool.ThreadPool(2)  # 2个线程的线程池
        reque=threadpool.makeRequests(getIndex,urls)    # 创建任务
        for r in reque:
            pool.putRequest(r)  # 向线程池提交任务
        pool.wait() # 等待所有任务执行完毕
        print("共获取{}件商品,获得{}条评论,耗时{}".format(num,comments_num,time.time()-start_time))

    第二版 :

    经测试,的确不会出现空白页的情况

    进一步优化:同时获取2个以上商品的评论

    # 不能爬太快!!!不然获取不到评论
    from bs4 import BeautifulSoup
    import requests
    from urllib import parse
    import csv,json,re
    import threadpool
    import time
    from jd_mysqldb import Goods,Comments,sess_db
     
    headers={
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
        'Cookie': '__jdv=76161171|baidu|-|organic|%25E4%25BA%25AC%25E4%25B8%259C|1613711947911; __jdu=16137119479101182770449; areaId=7; ipLoc-djd=7-458-466-0; PCSYCityID=CN_410000_0_0; shshshfpa=07383463-032f-3f99-9d40-639cb57c6e28-1613711950; shshshfpb=u8S9UvxK66gfIbM1mUNrIOg%3D%3D; user-key=153f6b4d-0704-4e56-82b6-8646f3f0dad4; cn=0; shshshfp=9a88944b34cb0ff3631a0a95907b75eb; __jdc=122270672; 3AB9D23F7A4B3C9B=SEELVNXBPU7OAA3UX5JTKR5LQADM5YFJRKY23Z6HDBU4OT2NWYGX525CKFFVHTRDJ7Q5DJRMRZQIQJOW5GVBY43XVI; jwotest_product=99; __jda=122270672.16137119479101182770449.1613711948.1613738165.1613748918.4; JSESSIONID=C06EC8D2E9384D2628AE22B1A6F9F8FC.s1; shshshsID=ab2ca3143928b1b01f6c5b71a15fcebe_5_1613750374847; __jdb=122270672.5.16137119479101182770449|4.1613748918',
        'Referer': 'https://www.jd.com/'
    }
     
    num=0   # 商品数量
    comments_num=0   # 评论数量
     
    # 获取商品信息和SkuId
    def getIndex(url):
        session=requests.Session()
        session.headers=headers
        global num
        res=session.get(url,headers=headers)
        print(res.status_code)
        res.encoding=res.apparent_encoding
        soup=BeautifulSoup(res.text,'lxml')
        items=soup.select('li.gl-item')
        for item in items[:2]:  # 爬取2个商品测试
            title=item.select_one('.p-name a em').text.strip().replace(' ','')
            price=item.select_one('.p-price strong').text.strip().replace('¥','')
            try:
                shop=item.select_one('.p-shopnum a').text.strip()   # 获取书籍时查找店铺的方法
            except:
                shop=item.select_one('.p-shop a').text.strip()  #   获取其他商品时查找店铺的方法
            link=parse.urljoin('https://',item.select_one('.p-img a').get('href'))
            SkuId=re.search('\d+',link).group()
            headers['Referer'] = f'https://item.jd.com/{SkuId}.html'
            headers['Connection'] = 'keep-alive'
            comments_num=getCommentsNum(SkuId,session)
            print(SkuId,title, price, shop, link, comments_num)
            print("开始将商品存入数据库...")
            try:
                IntoGoods(SkuId,title, price, shop, link, comments_num)
            except Exception as e:
                print(e)
                sess_db.rollback()
            num += 1
            print("正在获取评论...")
            # 获取评论总页数
            url1 = f'https://club.jd.com/comment/productPageComments.action?productId={SkuId}&score=0&sortType=5&page=0&pageSize=10'
            res2 = session.get(url1,headers=headers)
            res2.encoding = res2.apparent_encoding
            json_data = json.loads(res2.text)
            max_page = json_data['maxPage']  # 经测试最多可获取100页评论,每页10条
            print("{}评论共{}页".format(SkuId,max_page))
            if max_page==0:
                IntoComments(SkuId,'0')
            else:
                for i in range(0, max_page):
                    # 使用此链接获取评论得到的为json格式
                    url2 = f'https://club.jd.com/comment/productPageComments.action?productId={SkuId}&score=0&sortType=5&page={i}&pageSize=10'
                    # 使用此链接获取评论得到的非json格式,需要提取
                    # url2_2=f'https://club.jd.com/comment/productPageComments.action?callback=jQuery9287224&productId={SkuId}&score=0&sortType=5&page={i}&pageSize=10'
                    print("开始获取第{}页评论:{}".format(i+1,url2) )
                    getComments(session,SkuId,url2)
                    time.sleep(1)
     
    # 获取评论总数量
    def getCommentsNum(SkuId,sess):
        url=f'https://club.jd.com/comment/productCommentSummaries.action?referenceIds={SkuId}'
        res=sess.get(url)
        try:
            res.encoding=res.apparent_encoding
            json_data=json.loads(res.text)  # json格式转为字典
            num=json_data['CommentsCount'][0]['CommentCount']
            return num
        except:
            return 'Error'
     
    # 获取评论
    def getComments(sess,SkuId,url2):
        global comments_num
        res2 = sess.get(url2)
        res2.encoding=res2.apparent_encoding
        json_data=res2.text
        '''
        # 如果用url2_2需要进行如下操作提取json
        start = res2.text.find('jQuery9287224(') + len('jQuery9287224(')
        end = res2.text.find(');')
        json_data=res2.text[start:end]
        '''
        dict_data = json.loads(json_data)
        comments=dict_data['comments']
        for item in comments:
            comment=item['content'].replace('\n','')
            # print(comment)
            comments_num+=1
            try:
                IntoComments(SkuId,comment)
            except Exception as e:
                print(e)
                sess_db.rollback()
     
    # 商品信息入库
    def IntoGoods(SkuId,title, price, shop, link, comments_num):
        goods_data=Goods(
            sku_id=SkuId,
            name=title,
            price=price,
            comments_num=comments_num,
            shop=shop,
            link=link
        )
        sess_db.add(goods_data)
        sess_db.commit()
     
    # 评论入库
    def IntoComments(SkuId,comment):
        comments_data=Comments(
            sku_id=SkuId,
            comments=comment
        )
        sess_db.add(comments_data)
        sess_db.commit()
     
    if __name__ == '__main__':
        start_time=time.time()
        urls=[]
        KEYWORD=parse.quote(input("请输入要查询的关键词:"))
        for i in range(1,2):    # 爬取一页进行测试
            url=f'https://search.jd.com/Search?keyword={KEYWORD}&wq={KEYWORD}&page={i}'
            urls.append(([url,],None))  # threadpool要求必须这样写
        pool=threadpool.ThreadPool(2)  # 2个线程的线程池
        reque=threadpool.makeRequests(getIndex,urls)    # 创建任务
        for r in reque:
            pool.putRequest(r)  # 向线程池提交任务
        pool.wait() # 等待所有任务执行完毕
        print("共获取{}件商品,获得{}条评论,耗时{}".format(num,comments_num,time.time()-start_time))

    第三版:

     。。。。不行,又出现空白页了

    # 不能爬太快!!!不然获取不到评论
    from bs4 import BeautifulSoup
    import requests
    from urllib import parse
    import csv,json,re
    import threadpool
    import time
    from jd_mysqldb import Goods,Comments,sess_db
     
    headers={
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
        'Cookie': '__jdv=76161171|baidu|-|organic|%25E4%25BA%25AC%25E4%25B8%259C|1613711947911; __jdu=16137119479101182770449; areaId=7; ipLoc-djd=7-458-466-0; PCSYCityID=CN_410000_0_0; shshshfpa=07383463-032f-3f99-9d40-639cb57c6e28-1613711950; shshshfpb=u8S9UvxK66gfIbM1mUNrIOg%3D%3D; user-key=153f6b4d-0704-4e56-82b6-8646f3f0dad4; cn=0; shshshfp=9a88944b34cb0ff3631a0a95907b75eb; __jdc=122270672; 3AB9D23F7A4B3C9B=SEELVNXBPU7OAA3UX5JTKR5LQADM5YFJRKY23Z6HDBU4OT2NWYGX525CKFFVHTRDJ7Q5DJRMRZQIQJOW5GVBY43XVI; jwotest_product=99; __jda=122270672.16137119479101182770449.1613711948.1613738165.1613748918.4; JSESSIONID=C06EC8D2E9384D2628AE22B1A6F9F8FC.s1; shshshsID=ab2ca3143928b1b01f6c5b71a15fcebe_5_1613750374847; __jdb=122270672.5.16137119479101182770449|4.1613748918',
        'Referer': 'https://www.jd.com/'
    }
     
    num=0   # 商品数量
    comments_num=0   # 评论数量
     
    # 获取商品信息和SkuId
    def getIndex(url):
        global num
        skuids=[]
        session=requests.Session()
        session.headers=headers
        res=session.get(url,headers=headers)
        print(res.status_code)
        res.encoding=res.apparent_encoding
        soup=BeautifulSoup(res.text,'lxml')
        items=soup.select('li.gl-item')
        for item in items[:3]:  # 爬取3个商品测试
            title=item.select_one('.p-name a em').text.strip().replace(' ','')
            price=item.select_one('.p-price strong').text.strip().replace('¥','')
            try:
                shop=item.select_one('.p-shopnum a').text.strip()   # 获取书籍时查找店铺的方法
            except:
                shop=item.select_one('.p-shop a').text.strip()  #   获取其他商品时查找店铺的方法
            link=parse.urljoin('https://',item.select_one('.p-img a').get('href'))
            SkuId=re.search('\d+',link).group()
            skuids.append(([SkuId,session],None))
            headers['Referer'] = f'https://item.jd.com/{SkuId}.html'
            headers['Connection'] = 'keep-alive'
            comments_num=getCommentsNum(SkuId,session)  # 评论数量
            print(SkuId,title, price, shop, link, comments_num)
            print("开始将商品存入数据库...")
            try:
                IntoGoods(SkuId,title, price, shop, link, comments_num)
            except Exception as e:
                print(e)
                sess_db.rollback()
            num += 1
        print("开始获取评论并存入数据库...")
        pool2=threadpool.ThreadPool(3)   # 可同时获取3个商品的评论
        task=threadpool.makeRequests(getComments,skuids)
        for r in task:
            pool2.putRequest(r)
        pool2.wait()
     
    # 获取评论
    def getComments(SkuId,sess):
        # 获取评论总页数
        url1 = f'https://club.jd.com/comment/productPageComments.action?productId={SkuId}&score=0&sortType=5&page=0&pageSize=10'
        res2 = sess.get(url1, headers=headers)
        res2.encoding = res2.apparent_encoding
        json_data = json.loads(res2.text)
        max_page = json_data['maxPage']  # 经测试最多可获取100页评论,每页10条
        print("{}评论共{}页".format(SkuId, max_page))
        if max_page == 0:
            IntoComments(SkuId, '0')
        else:
            for i in range(0, max_page):
                # 使用此链接获取评论得到的为json格式
                url2 = f'https://club.jd.com/comment/productPageComments.action?productId={SkuId}&score=0&sortType=5&page={i}&pageSize=10'
                # 使用此链接获取评论得到的非json格式,需要提取
                # url2_2=f'https://club.jd.com/comment/productPageComments.action?callback=jQuery9287224&productId={SkuId}&score=0&sortType=5&page={i}&pageSize=10'
                print("开始获取第{}页评论:{}".format(i + 1, url2))
                getComments_one(sess, SkuId, url2)
                time.sleep(1)
     
    # 获取评论总数量
    def getCommentsNum(SkuId,sess):
        url=f'https://club.jd.com/comment/productCommentSummaries.action?referenceIds={SkuId}'
        res=sess.get(url)
        try:
            res.encoding=res.apparent_encoding
            json_data=json.loads(res.text)  # json格式转为字典
            num=json_data['CommentsCount'][0]['CommentCount']
            return num
        except:
            return 'Error'
     
    # 获取单个评论
    def getComments_one(sess,SkuId,url2):
        global comments_num
        res2 = sess.get(url2)
        res2.encoding=res2.apparent_encoding
        json_data=res2.text
        '''
        # 如果用url2_2需要进行如下操作提取json
        start = res2.text.find('jQuery9287224(') + len('jQuery9287224(')
        end = res2.text.find(');')
        json_data=res2.text[start:end]
        '''
        dict_data = json.loads(json_data)
        comments=dict_data['comments']
        for item in comments:
            comment=item['content'].replace('\n','')
            # print(comment)
            comments_num+=1
            try:
                IntoComments(SkuId,comment)
            except Exception as e:
                print(e)
                print("rollback!")
                sess_db.rollback()
     
    # 商品信息入库
    def IntoGoods(SkuId,title, price, shop, link, comments_num):
        goods_data=Goods(
            sku_id=SkuId,
            name=title,
            price=price,
            comments_num=comments_num,
            shop=shop,
            link=link
        )
        sess_db.add(goods_data)
        sess_db.commit()
     
    # 评论入库
    def IntoComments(SkuId,comment):
        comments_data=Comments(
            sku_id=SkuId,
            comments=comment
        )
        sess_db.add(comments_data)
        sess_db.commit()
     
    if __name__ == '__main__':
        start_time=time.time()
        urls=[]
        KEYWORD=parse.quote(input("请输入要查询的关键词:"))
        for i in range(1,2):    # 爬取一页进行测试
            url=f'https://search.jd.com/Search?keyword={KEYWORD}&wq={KEYWORD}&page={i}'
            urls.append(([url,],None))  # threadpool要求必须这样写
        pool=threadpool.ThreadPool(2)  # 2个线程的线程池
        reque=threadpool.makeRequests(getIndex,urls)    # 创建任务
        for r in reque:
            pool.putRequest(r)  # 向线程池提交任务
        pool.wait() # 等待所有任务执行完毕
        print("共获取{}件商品,获得{}条评论,耗时{}".format(num,comments_num,time.time()-start_time))
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python MySQL
    相关文章 更多
    navicat导入数据库步骤详解及常见问题处理教程
    navicat导入数据库步骤详解及常见问题处理教程

    详解Navicat导入数据库的标准步骤,涵盖SQL脚本执行与CSV数据导入两种核心场景。针对导入过程中常见的字符集乱码、主键冲突及外键约束错误,提供具体的设置方法与修复建议,确保数据迁移准确无误。

    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    SQL主键约束和唯一约束有什么区别
    SQL主键约束和唯一约束有什么区别

    深入理解SQL PRIMARY KEY与UNIQUE约束的区别。文章从行标识与重复限制的目标出发,详解主键的非空特性、外键引用角色以及多数据库对NULL值的处理差异。结合users表实战示例,指导开发者如何根据字段稳定性与业务语义合理选择约束类型,避免设计误区。

    SQL约束有哪些类型及作用
    SQL约束有哪些类型及作用

    刚开始设计关系型数据库?了解PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK、DEFAULT等约束的作用、语法和排错方法。本文以PostgreSQL语法为主,结合用户订单场景,清晰展示如何防止脏数据并处理常见约束冲突。

    SQL游标常见错误排查:死锁与资源未释放问题
    SQL游标常见错误排查:死锁与资源未释放问题

    深入解析SQL游标导致的死锁与资源未释放问题。通过PostgreSQL与MySQL语法对比,展示如何识别长事务持锁、分析锁等待链,并提供短事务提交、异常清理及批量处理的最佳实践,确保数据库连接与锁资源及时释放。

    SQL中怎么创建和删除约束
    SQL中怎么创建和删除约束

    后端开发者在维护数据库时,常需对现有表添加主键、唯一或外键约束。若直接执行ADD CONSTRAINT,往往因存量数据不合规导致报错。本文详解操作前的数据清洗步骤、标准SQL语法及MySQL等特殊写法,帮助你在生产环境安全完成结构变更。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    SQL分组统计查询:GROUP BY与HAVING子句用法示例
    SQL分组统计查询:GROUP BY与HAVING子句用法示例

    针对 SQL 初学者的分组统计实战指南。深入解析 GROUP BY 分组机制、WHERE 与 HAVING 的执行时机差异,以及 COUNT 函数对 NULL 值的处理逻辑。通过具体代码示例演示如何正确筛选聚合结果,并排查因 JOIN 连接导致的统计数据异常,提升报表准确性。

    SQL Server与MySQL游标基本语法及完整代码示例
    SQL Server与MySQL游标基本语法及完整代码示例

    本文详细对比SQL Server和MySQL中游标的基本用法。从DECLARE声明到FETCH遍历,再到CLOSE关闭与DEALLOCATE/Handler清理,解析两者在语法结构、变量接收及异常处理上的核心差异。通过标准代码示例展示如何安全使用游标,避免资源泄漏,适用于需要进行数据库存储过程开发或跨平台迁移的开发者。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。