日期: 2021 年 4 月 28 日

搭建Kms服务器

下载vlmcsd项目文件并解压
wget https://github.com/Wind4/vlmcsd/releases/download/svn1112/binaries.tar.gz
tar zxf binaries.tar.gz
查看cpu架构一般现在多为Intel
cat /proc/cpuinfo
移动到解压出来的目录下
cd /root/binaries/Linux/intel/static
基本上是用的都是64位系统,所以启动64的
./vlmcsd-x64-musl-static
检查是否正常运行
ps -ef |grep vlmcsd-x64-musl-static
打开1688端口或者关闭防火墙
/etc/init.d/iptables stop
或者
sudo iptables -I INPUT -p tcp –dport 1688 -j ACCEPT
sudo service iptables save
完成搭建
激活
slmgr /skms 10.10.12.88
slmgr /ato
注意只能对批量授权可以使用
激活office 大致就这样参考下
cscript “C:\Program Files (x86)\Microsoft Office\Office16\OSPP.VBS” /sethst:192.168.1.101
cscript opss.vbs /act

VMware搭建KMS服务器(VLMCSD)

VMware搭建KMS服务器(VLMCSD)

仅需要其中的floppy144.flp

新建Linux虚拟机,硬件仅保留内存(*小14MB,推荐16MB)、处理器(1个1核心)、软盘(指向floppy144.flp)、网络适配器(桥接模式)、显示器

支持VL版本的Win Vista/7/8/8.1、WinSrv 2008/2008R2/2012/2012R2、Office/Project/Visio 2010/2013

管理员运行命令提示符cmd

Windows 激活命令:

CD “%SystemRoot%\SYSTEM32″

CSCRIPT /NOLOGO SLMGR.VBS /SKMS 192.168.0.xxx

CSCRIPT /NOLOGO SLMGR.VBS /ATO

CSCRIPT /NOLOGO SLMGR.VBS /XPR

Office/Project/Visio 2013(2010换下安装路径) 激活命令:

32位:CD “%ProgramFiles(x86)%\MICROSOFT OFFICE\OFFICE15″

64位:CD “%ProgramFiles%\MICROSOFT OFFICE\OFFICE15″

CSCRIPT OSPP.VBS /SETHST:192.168.0.xxx

CSCRIPT OSPP.VBS /ACT

CSCRIPT OSPP.VBS /DSTATUS

以上两处IP地址根据实际情况修改

HBase-scan API 通过scan读取表中数据

直接贴代码啦

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片

  1. /**
  2.      * 
  3.      * @param zkIp
  4.      * @param zkPort
  5.      * @param tablename
  6.      * @param startRow   传null扫全表
  7.      * @param stopRow 已~结尾
  8.      * @throws Exception
  9.      */
  10.     public static void scanTable(String zkIp,String zkPort,String tablename,String startRow,String stopRow) throws Exception {
  11.         HTablePool pool;
  12.         Configuration config = HBaseConfiguration.create();
  13.         config.set(“hbase.zookeeper.quorum”,zkIp);//
  14.         config.set(“hbase.zookeeper.property.clientPort”, zkPort);
  15.         pool = new HTablePool(config, 2);
  16.         HTableInterface hbTable = null;
  17.         try {
  18.             hbTable = pool.getTable(tablename); // 表名
  19.             ResultScanner rs = null;
  20.             Scan scan = new Scan();
  21.             // scan.addColumn(Bytes.toBytes(“cf1”),Bytes.toBytes(“qual1”));扫某一列
  22.             if (startRow != null) { // 设置扫描的范围
  23.                 scan.setStartRow(Bytes.toBytes(startRow));
  24.             }
  25.             if (stopRow != null) {
  26.                 scan.setStopRow(Bytes.toBytes(stopRow));
  27.             }
  28.             rs = hbTable.getScanner(scan);
  29.             hbTable.close();
  30.             for (Result r : rs) {// 按行去遍历
  31.                 for (KeyValue kv : r.raw()) {// 遍历每一行的各列
  32.                     StringBuffer sb = new StringBuffer()
  33.                             .append(Bytes.toString(kv.getRow())).append(“\t”)
  34.                             .append(Bytes.toString(kv.getFamily()))
  35.                             .append(“\t”)
  36.                             .append(Bytes.toString(kv.getQualifier()))
  37.                             .append(“\t”).append(Bytes.toString(kv.getValue()));
  38.                     System.out.println(sb.toString());
  39.                     // kv.getRow() key
  40.                     // kv.getFamily() cf1
  41.                     // kv.getQualifier() 列名
  42.                     // kv.getValue() value
  43.                 }
  44.             }
  45.         } catch (Exception e) {
  46.             System.out.println(e.getMessage());
  47.         }finally{
  48.             pool.close();
  49.         }
  50.     }

在Centos下搭建KMS服务器

1.在vlmcsd/binaries/Linux/intel/glibc/文件夹,找到该文件夹下的vlmcsd-x86-glibc,如果是64位则是vlmcsd-x64-glibc,其他系统自行选择,服务端主要是找vlmcsd这个程序。

2.复制文件

在/usr/local新建vlmcsd,拷贝vlmcsd-x86-glibc到该文件夹下

  1. mkdir /usr/local/vlmcsd
  2. cp vlmcsd-x86-glibc /usr/local/vlmcsd/

给vlmcsd-x86-glibc加入执行权限,并改名为vlmscd

  1. cd /usr/local/vlmcsd/
  2. chmod u+x vlmcsd-x86-glibc
  3. mv vlmcsd-x86-glibc vlmcsd

3.测试启动

./vlmcsd

查看执行的进程

ps aux|grep vlmcsd 

结果

  1. root 8227 0.0 0.0 2364 240 ? Ss 11:41 0:00 ./vlmcsd
  2. root 8279 0.0 0.0 2280 552 pts/1 S+ 11:42 0:00 grep vlmcsd

说明进程已经启动 kill pid可以关闭进程

如果有其他端口占用1688,会报如下错误

  1. Warning: 0.0.0.0:1688: Address already in use
  2. Fatal: Could not listen on any socket

找出占用的进程关闭即可,可以使用lsof命令和netstat命令

上文中supervisor关闭命令为

supervisorctl shutdown 

4.开机自启

把命令加到/etc/rc.local或/etc/rc.d/rc.local,并加上可执行权限,为了查看日志,加上vlmcsd -l /var/log/vlmcsd.log

  1. echo “/usr/local/vlmcsd/vlmcsd -l /var/log/vlmcsd.log > /dev/null 2>&1” >> /etc/rc.local
  2. chmod +x /etc/rc.local

注意:CentOS 7中系统启动管理已经由传统的Linux SysV init改为systemd,配置方法跟原来的不一样

5.重启服务器

reboot

6.客户端测试

windows找到\binaries\Windows\intel目录下的vlmcs-Windows-x86.exe对于64位的找vlmcs-Windows-x64.exe,将其改名为vlmcs.exe;cd跳转到改目录下.执行命令

vlmcs.exe -v -l 3 www.kms123.com

-v输出详细信息
-l 3表示发送Windows Server 2008 Datacenter的激活请求,具体版本对应列表可以通过vlmcs.exe -x查看

www.kms123.com表示KMS服务器的域名

  1. Request Parameters
  2. ==================
  3. Protocol version : 4.0
  4. Client is a virtual machine : No
  5. Licensing status : 2 (OOB grace)
  6. Remaining time (0 = forever) : 43200 minutes
  7. Application ID : 55c92734-d682-4d71-983e-d6ec3f16059f (Windows)
  8. Activation ID (Product) : 68b6e220-cf09-466b-92d3-45cd964b9509 (Windows Server 2008 Datacenter)
  9. Key Management Service ID : 8a21fdf3-cbc5-44eb-83f3-fe284e6680a7 (Windows 2008 C)
  10. Client machine ID : 53532ed6-0511-4848-ad75-40e3944c3b99
  11. Previous client machine ID : 00000000-0000-0000-0000-000000000000
  12. Client request timestamp (UTC) : 2015-12-16 05:39:30
  13. Workstation name : ftp.htc.info
  14. N count policy (minimum clients): 5
  15. Connecting to 1.2.3.4:1688 … successful
  16. Performing RPC bind …
  17. … NDR64 … BTFN … NDR32 … successful
  18. Sending activation request (KMS V4) 1 of 1
  19. Response from KMS server
  20. ========================
  21. Size of KMS Response : 160 (0xa0)
  22. Protocol version : 4.0
  23. KMS host extended PID : 03612-00206-183-962764-03-4108-10240.0000-2582015
  24. Client machine ID : 53532ed6-0511-4848-ad75-40e3944c3b99
  25. Client request timestamp (UTC) : 2015-12-16 05:39:30
  26. KMS host current active clients : 10
  27. Renewal interval policy : 10080
  28. Activation interval policy : 120

流式大数据处理的三种框架:Storm,Spark和Samza

许多分布式计算系统都可以实时或接近实时地处理大数据流。本文将对三种Apache框架分别进行简单介绍,然后尝试快速、高度概述其异同。

Apache Storm

Storm中,先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology)。这个拓扑将会被提交给集群,由集群中的主控节点(master node)分发代码,将任务分配给工作节点(worker node)执行。一个拓扑中包括spout和bolt两种角色,其中spout发送消息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在bolt中可以完成计算、过滤等操作,bolt自身也可以随机将数据发送给其他bolt。由spout发射出的tuple是不可变数组,对应着固定的键值对。

%title插图%num

Apache Spark

Spark Streaming是核心Spark API的一个扩展,它并不会像Storm那样一次一个地处理数据流,而是在处理前按时间间隔预先将其切分为一段一段的批处理作业。Spark针对持续性数据流的抽象称为DStream(DiscretizedStream),一个DStream是一个微批处理(micro-batching)的RDD(弹性分布式数据集);而RDD则是一种分布式数据集,能够以两种方式并行运作,分别是任意函数和滑动窗口数据的转换。

%title插图%num

Apache Samza

Samza处理数据流时,会分别按次处理每条收到的消息。Samza的流单位既不是元组,也不是Dstream,而是一条条消息。在Samza中,数据流被切分开来,每个部分都由一组只读消息的有序数列构成,而这些消息每条都有一个特定的ID(offset)。该系统还支持批处理,即逐次处理同一个数据流分区的多条消息。Samza的执行与数据流模块都是可插拔式的,尽管Samza的特色是依赖Hadoop的Yarn(另一种资源调度器)和Apache Kafka。

%title插图%num

共同之处

以上三种实时计算系统都是开源的分布式系统,具有低延迟、可扩展和容错性诸多优点,它们的共同特色在于:允许你在运行数据流代码时,将任务分配到一系列具有容错能力的计算机上并行运行。此外,它们都提供了简单的API来简化底层实现的复杂程度。

三种框架的术语名词不同,但是其代表的概念十分相似:

%title插图%num

对比图

下面表格总结了一些不同之处:

%title插图%num

数据传递形式分为三大类:

  1. *多一次(At-most-once):消息可能会丢失,这通常是*不理想的结果。
  2. *少一次(At-least-once):消息可能会再次发送(没有丢失的情况,但是会产生冗余)。在许多用例中已经足够。
  3. 恰好一次(Exactly-once):每条消息都被发送过一次且仅仅一次(没有丢失,没有冗余)。这是*佳情况,尽管很难保证在所有用例中都实现。

另一个方面是状态管理:对状态的存储有不同的策略,Spark Streaming将数据写入分布式文件系统中(例如HDFS);Samza使用嵌入式键值存储;而在Storm中,或者将状态管理滚动至应用层面,或者使用更高层面的抽象Trident。

用例

这三种框架在处理连续性的大量实时数据时的表现均出色而高效,那么使用哪一种呢?选择时并没有什么硬性规定,*多就是几个指导方针。

如果你想要的是一个允许增量计算的高速事件处理系统,Storm会是*佳选择。它可以应对你在客户端等待结果的同时,进一步进行分布式计算的需求,使用开箱即用的分布式RPC(DRPC)就可以了。*后但同样重要的原因:Storm使用Apache Thrift,你可以用任何编程语言来编写拓扑结构。如果你需要状态持续,同时/或者达到恰好一次的传递效果,应当看看更高层面的Trdent API,它同时也提供了微批处理的方式。

%title插图%num

使用Storm的公司有:Twitter,雅虎,Spotify还有The Weather Channel等。

说到微批处理,如果你必须有状态的计算,恰好一次的递送,并且不介意高延迟的话,那么可以考虑Spark Streaming,特别如果你还计划图形操作、机器学习或者访问SQL的话,Apache Spark的stack允许你将一些library与数据流相结合(Spark SQL,Mllib,GraphX),它们会提供便捷的一体化编程模型。尤其是数据流算法(例如:K均值流媒体)允许Spark实时决策的促进。

使用Spark的公司有:亚马逊,雅虎,NASA JPL,eBay还有百度等。

如果你有大量的状态需要处理,比如每个分区都有许多十亿位元组,那么可以选择Samza。由于Samza将存储与处理放在同一台机器上,在保持处理高效的同时,还不会额外载入内存。这种框架提供了灵活的可插拔API:它的默认execution、消息发送还有存储引擎操作都可以根据你的选择随时进行替换。此外,如果你有大量的数据流处理阶段,且分别来自不同代码库的不同团队,那么Samza的细颗粒工作特性会尤其适用,因为它们可以在影响*小化的前提下完成增加或移除的工作。

使用Samza的公司有:LinkedIn,Intuit,Metamarkets,Quantiply,Fortscale等。

结论

本文中我们只对这三种Apache框架进行了简单的了解,并未覆盖到这些框架中大量的功能与更多细微的差异。同时,文中这三种框架对比也是受到限制的,因为这些框架都在一直不断的发展,这一点是我们应当牢记的。

Vlmcsd: 自建 KMS 激活服务器

一、KMS搭建

环境:CentOS、关闭Selinux防火墙、iptables 放行1688端口

1、获取服务并部署

  1. yum install -y wget
  2. wget https://github.com/Wind4/vlmcsd/releases/download/svn1112/binaries.tar.gz
  3. tar -zxvf binaries.tar.gz
  4. cd /root/binaries/Linux/intel/static //进入对应的系统目录,CPU架构目录下;(我这里为Intel CPU架构)
  5. ./vlmcsd-x64-musl-static //运行这个脚本启动即可

2、检查服务是否启动

  • 查询脚本是否正常启动:ps -ef |grep vlmcsd-x64-musl-static
  • 查看端口启动:netstat -lntp //查看 1688 端口是否启动

二、使用方法

1. 激活 Windows

  1. 如果你的Windows是VL版本,那么只要在管理员权限的cmd或者powershell中执行下面两个命令就可以了。
    执行完*个命令后要等弹出提示窗,期间电脑必须联网。
    slmgr /skms kms.liyuans.com //kms.liyuans.com可以替换为你VPS的ip地址或者域名
    slmgr /ato
  2. 如果不是VL版本的,那么需要更换密钥获取你对应版本的KEY,操作如下:
    运行以下命令查看系统版本:wmic os get caption
    在文末找到对应的 key,在管理员权限的 cmd 或者 powershell 中执行下面命令
    slmgr /ipk xxxxx-xxxxx-xxxxx-xxxxx //安装 key
    然后跟上面说的一样设置 kms 服务器地址,激活。

2. 激活Office

Office 必须是 VOL 版本,否则无法激活,具体下载可以访问http://msdn.itellyou.cn ;激活期间电脑必须联网。
运行管理员权限的 cmd 或者 powershell ,执行下面命令:
cd "C:\Program Files (x86)\Microsoft Office\Office16" //进入 32 位 Office 2016 的安装目录
cd "C:\Program Files\Microsoft Office\Office16" //进入 64 位 Office 2016 的安装目录
cscript ospp.vbs /sethst:192.168.1.11 //192.168.1.11可以替换为你VPS的ip地址或者域名;执行完命令后要等待反馈提示。
cscript ospp.vbs /act //如果提示看到 successful 的字样,那么就是激活成功了,重新打开 office 就好。

三、 Windows VL 密钥对照表

1. Windows Server 2016

操作系统 KMS 激活序列号
Windows Server 2016 Datacenter CB7KF-BWN84-R7R2Y-793K2-8XDDG
Windows Server 2016 Standard WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY
Windows Server 2016 Essentials JCKRF-N37P4-C2D82-9YXRT-4M63B

2. Windows 10

操作系统 KMS 激活序列号
Windows 10 Professional W269N-WFGWX-YVC9B-4J6C9-T83GX
Windows 10 Professional N MH37W-N47XK-V7XM9-C7227-GCQG9
Windows 10 Enterprise NPPR9-FWDCX-D2C8J-H872K-2YT43
Windows 10 Enterprise N DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4
Windows 10 Education NW6C2-QMPVW-D7KKK-3GKT6-VCFB2
Windows 10 Education N 2WH4N-8QGBV-H22JP-CT43Q-MDWWJ
Windows 10 Enterprise 2015 LTSB WNMTR-4C88C-JK8YV-HQ7T2-76DF9
Windows 10 Enterprise 2015 LTSB N 2F77B-TNFGY-69QQF-B8YKP-D69TJ
Windows 10 Enterprise 2016 LTSB DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ
Windows 10 Enterprise 2016 LTSB N QFFDN-GRT3P-VKWWX-X7T3R-8B639

3. Windows Server 2012 R2 和 Windows 8.1

操作系统 KMS 激活序列号
Windows 8.1 Professional GCRJD-8NW9H-F2CDX-CCM8D-9D6T9
Windows 8.1 Professional N HMCNV-VVBFX-7HMBH-CTY9B-B4FXY
Windows 8.1 Enterprise MHF9N-XY6XB-WVXMC-BTDCT-MKKG7
Windows 8.1 Enterprise N TT4HM-HN7YT-62K67-RGRQJ-JFFXW
Windows Server 2012 R2 Server Standard D2N9P-3P6X9-2R39C-7RTCD-MDVJX
Windows Server 2012 R2 Datacenter W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9
Windows Server 2012 R2 Essentials KNC87-3J2TX-XB4WP-VCPJV-M4FWM

4. Windows Server 2012 和 Windows 8

操作系统 KMS 激活序列号
Windows 8 Professional NG4HW-VH26C-733KW-K6F98-J8CK4
Windows 8 Professional N XCVCF-2NXM9-723PB-MHCB7-2RYQQ
Windows 8 Enterprise 32JNW-9KQ84-P47T8-D8GGY-CWCK7
Windows 8 Enterprise N JMNMF-RHW7P-DMY6X-RF3DR-X2BQT
Windows Server 2012 BN3D2-R7TKB-3YPBD-8DRP2-27GG4
Windows Server 2012 N 8N2M2-HWPGY-7PGT9-HGDD8-GVGGY
Windows Server 2012 Single Language 2WN2H-YGCQR-KFX6K-CD6TF-84YXQ
Windows Server 2012 Country Specific 4K36P-JN4VD-GDC6V-KDT89-DYFKP
Windows Server 2012 Server Standard XC9B7-NBPP2-83J2H-RHMBY-92BT4
Windows Server 2012 MultiPoint Standard HM7DN-YVMH3-46JC3-XYTG7-CYQJJ
Windows Server 2012 MultiPoint Premium XNH6W-2V9GX-RGJ4K-Y8X6F-QGJ2G
Windows Server 2012 Datacenter 48HP8-DN98B-MYWDG-T2DCC-8W83P

5. Windows 7 and Windows Server 2008 R2

操作系统 KMS 激活序列号
Windows 7 Professional FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4
Windows 7 Professional N MRPKT-YTG23-K7D7T-X2JMM-QY7MG
Windows 7 Professional E W82YF-2Q76Y-63HXB-FGJG9-GF7QX
Windows 7 Enterprise 33PXH-7Y6KF-2VJC9-XBBR8-HVTHH
Windows 7 Enterprise N YDRBP-3D83W-TY26F-D46B2-XCKRJ
Windows 7 Enterprise E C29WB-22CC8-VJ326-GHFJW-H9DH4
Windows Server 2008 R2 Web 6TPJF-RBVHG-WBW2R-86QPH-6RTM4
Windows Server 2008 R2 HPC edition TT8MH-CG224-D3D7Q-498W2-9QCTX
Windows Server 2008 R2 Standard YC6KT-GKW9T-YTKYR-T4X34-R7VHC
Windows Server 2008 R2 Enterprise 489J6-VHDMP-X63PK-3K798-CPX3Y
Windows Server 2008 R2 Datacenter 74YFP-3QFB3-KQT8W-PMXWJ-7M648
Windows Server 2008 R2 for Itanium-based Systems GT63C-RJFQ3-4GMB6-BRFB9-CB83V

6. Windows Vista and Windows Server 2008

操作系统 KMS 激活序列号
Windows Vista Business YFKBB-PQJJV-G996G-VWGXY-2V3X8
Windows Vista Business N HMBQG-8H2RH-C77VX-27R82-VMQBT
Windows Vista Enterprise VKK3X-68KWM-X2YGT-QR4M6-4BWMV
Windows Vista Enterprise N VTC42-BM838-43QHV-84HX6-XJXKV
Windows Web Server 2008 WYR28-R7TFJ-3X2YQ-YCY4H-M249D
Windows Server 2008 Standard TM24T-X9RMF-VWXK6-X8JC9-BFGM2
Windows Server 2008 Standard without Hyper-V W7VD6-7JFBR-RX26B-YKQ3Y-6FFFJ
Windows Server 2008 Enterprise YQGMW-MPWTJ-34KDK-48M3W-X4Q6V
Windows Server 2008 Enterprise without Hyper-V 39BXF-X8Q23-P2WWT-38T2F-G3FPG
Windows Server 2008 HPC RCTX3-KWVHP-BR6TB-RB6DM-6X7HP
Windows Server 2008 Datacenter 7M67G-PC374-GR742-YH8V4-TCBY3
Windows Server 2008 Datacenter without Hyper-V 22XQ2-VRXRG-P8D42-K34TD-G3QQC
Windows Server 2008 for Itanium-Based Systems 4DWFP-JF3DJ-B7DTH-78FJB-PDRHK

 

爬虫学习之小说爬取

爬虫学习之小说爬取

数据解析之bs4解析

基础使用
#导包
from bs4 import BeautifulSoup
import lxml
import requests
import re

“””
bs4进行数据解析

“””
if __name__==”__main__”:
#将本地的HTML文件加载到该对象中
fp=open(‘./w.html’,’r’,encoding=’utf-8′)
soup=BeautifulSoup(fp,’lxml’)
#将互联网上获取的页面源码加载到该对象中
#page_text=response.text
#soup=BeautifulSoup(page_text,’lxml’)
# print(soup.a)#soup.tagName 返回的是Html中*次出现的tagname标签
#print(soup.div)
#等价
#print(soup.find(‘div’))

#class_ /id_ 等 属性定位
# print(soup.find(‘div’,class_=’excerpts-wrapper’))

#find_all 查找a的所有标签, 返回列表
# ls=soup.find_all(‘a’)
# for i in ls:
# print(i)

#select 选择器, 可以是id, class, 标签…选择器, 返回列表
#print(soup.select(‘header’))
#层级分隔符> ‘ ‘空格表示多个层级,>表示一个层级
# ls=soup.select(‘.sitenav>ul>li>a’)[0]
# print(soup.select(‘.sitenav li>a’)[0])
# print(ls)

#获取标签中的文本内容
#text/get_text():可以获取某一个标签下的所有文本内容
#string:只可以获取该标签下直系的文本内容
# print(soup.find(‘div’, class_=’excerpts-wrapper’).text)
# print(soup.find(‘div’, class_=’excerpts-wrapper’).string)
# print(soup.select(‘.sitenav li>a’)[0].string)
# print(soup.select(‘.sitenav li>a’)[1].get_text())

#获取href值
# print(soup.select(‘.excerpts-wrapper a’)[1][‘href’])

使用流程:
– 导包:from bs4 import BeautifulSoup
– 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容
(1)转化本地文件:
– soup = BeautifulSoup(open(‘本地文件’), ‘lxml’)
(2)转化网络文件:
– soup = BeautifulSoup(‘字符串类型或者字节类型’, ‘lxml’)
(3)打印soup对象显示内容为html文件中的内容
基础巩固:
(1)根据标签名查找
– soup.a 只能找到*个符合要求的标签
(2)获取属性
– soup.a.attrs 获取a所有的属性和属性值,返回一个字典
– soup.a.attrs[‘href’] 获取href属性
– soup.a[‘href’] 也可简写为这种形式
(3)获取内容
– soup.a.string
– soup.a.text
– soup.a.get_text()
【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
(4)find:找到*个符合要求的标签
– soup.find(‘a’) 找到*个符合要求的
– soup.find(‘a’, title=”xxx”)
– soup.find(‘a’, alt=”xxx”)
– soup.find(‘a’, class_=”xxx”)
– soup.find(‘a’, id=”xxx”)
(5)find_all:找到所有符合要求的标签
– soup.find_all(‘a’)
– soup.find_all([‘a’,’b’]) 找到所有的a和b标签
– soup.find_all(‘a’, limit=2) 限制前两个
(6)根据选择器选择指定的内容
select:soup.select(‘#feng’)
– 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
– 层级选择器:
div .dudu #lala .meme .xixi 下面好多级
div > p > a > .lala 只能是下面一级
【注意】select选择器返回永远是列表,需要通过下标提取指定的对象

上代码
import re
from bs4 import BeautifulSoup
import lxml
import os
import requests
headers = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36 Edg/89.0.774.77’
}
def fun(url_1):
if not os.path.exists(“./小说”):
os.mkdir(‘./小说’)
Path=’./小说’
else:
Path = ‘./小说’
url=url_1
page_text=requests.get(url=url,headers=headers).text
soup=BeautifulSoup(page_text,’lxml’)
volume_list=soup.select(‘ .col-4>a’)
Novel_name=soup.select(‘.book-meta>h1′)[0].string
if not os.path.exists(f'{Path}/{Novel_name}’):
os.mkdir(f'{Path}/{Novel_name}’)
path=f'{Novel_name}’
else:
path = f'{Novel_name}’
xd_data = ”
for i in volume_list:
url=i[‘href’]
detail_page=requests.get(url=url,headers=headers).text
title_soup=BeautifulSoup(detail_page,’lxml’)
content_data=title_soup.select(‘.content>p’)
xd_data+=(i.text+”\n”)
for j in content_data:
xd_data+=j.text+’\n’
print(f”{i.text}爬取成功!”)
with open(f'{Path}/{path}/{path}.txt’, ‘w’, encoding=’utf-8′) as f:
f.write(xd_data)
print(“已爬取完毕!”)

def find():
url=”http://search.zongheng.com/s?”
data=input(“请输入想查找的小说名(模糊查找也可以): “).strip()
page_data={
‘keyword’:data
}
search=requests.get(url=url,headers=headers,params=page_data).text
soup=BeautifulSoup(search,’lxml’)
search_sum=soup.find(‘div’,’search-tips’)
search_data=soup.select(‘.tit>a’)
search_url=soup.select(‘.btn>a’)
url_sum=[]
for i in range(0,len(search_url),2):
url_sum.append(search_url[i][‘href’])
n=0
for i in search_data:
print(f”{n}.{i.text}”)
n+=1
select_n=int(input(“请输入编号:”).strip())
Selected_url=url_sum[select_n]
return Selected_url
def index():
index_url=find()
index_page_text=requests.get(url=index_url,headers=headers).text
index_soup=BeautifulSoup(index_page_text,’lxml’)
index_url_data=index_soup.select(‘.all-catalog’)
y_n=input(‘是否开始下载?Y or N:’).strip()
if y_n==’Y’:
fun(index_url_data[0][‘href’])
else:
exit()
if __name__==”__main__”:
index()

 

python基础:统计小说词频

python基础:统计小说词频

题目要求:用Python统计小说中各单词出现的频次,并按频次由高到低排序。
读取文件
f = open(‘C:/Users/dell/Desktop/散文.txt’,’r’)
txt = f.read(100)
f.close()
print(txt)

f = open(‘C:/Users/dell/Desktop/散文.txt’,’r’)
txt_lines = f.readlines()#换行符
f.close()
print(txt_lines)

统计txt中单词的频次
import re
f = open(‘C:/Users/dell/Desktop/散文.txt’,’r’)
txt = f.read(1000)
f.close()
txt = txt.lower()
txt = re.sub(‘[,.?:”\’!-]’, ‘ ‘, txt)
word = txt.split() #先用正则表达式做预处理再进行分割因为正则和lower()都是对字符串进行处理而非列表
print(txt)
print(word)

词频统计
words_fre = {}
for i in word:
if i not in words_fre.keys():
words_fre[i] = 1
else:
words_fre[i] += 1
print(words_fre)

词频排序
sorted(words_fre.items(),key = xxx,revers = True)#把字典中所有的键值对取出并进行排序的声明

使用numpy实现group by操作

使用numpy实现group by操作

Pandas下的group by操作速度慢,在百万级数据量下可以使用PyFunctional下的group by,千万级速度又吃不消了,可以借助numpy,但实现有点麻烦,记录一下。

一、问题描述
【推荐场景】输入二维数组a,千万行,3列,*列是用户id,第二列是物品id,第三列是分值。先计算每个用户下分值*高的物品(Top1推荐),然后按照物品将这些用户组合起来(推送名单)。

二、实现代码

a = a[a[:, 0].argsort()] # 按照user_id排序(排序是使用np.split进行分组的前提)
a = np.split(a, np.unique(a[:, 0], return_index=True)[1][1:]) # 按照user_id分组
a = np.array([tmp[tmp[:, 2].argsort()[-1], :2] for tmp in a]) # 取分组下分值*高的item_id
a = a[a[:, 1].argsort()]
item_ids, ind = np.unique(a[:, 1], return_index=True)
a = np.split(a[:, 0], ind[1:])
result = dict(zip(item_ids, a))

一文读懂python中的闭包

一文读懂python中的闭包

【干货满满】

昨日突然有小伙伴来问我python中的闭包到底是个神马东东,一想到我当初学习闭包时也是稀里糊涂的,所以特意写了一篇文章来讲解python中的闭包到底应该怎么用,希望能给大家带来帮助。

一、闭包的基本理解
在介绍闭包之前,先简单理解下两种函数概念。

外函数:嵌套函数中*外层的函数称之为外函数。

内函数:嵌套函数中*内层的函数称之为内函数。

闭包的特点:

①:闭包是一种特殊的函数,由外函数和内函数嵌套而成;

②:内函数引用了外函数的临时变量;

③:将使用临时变量的内函数作为外函数的返回值。

二、闭包写法介绍
闭包的基本格式如下:

def 外函数(参数a):
外函数临时变量b = 某值
def 内函数(参数c):
print(运算操作)
return 内函数

res = 外函数(参数a)
res(参数c)

其中:

①:外函数中可传入多个参数,也可不传入参数;

②:外函数中可定义一个或多个临时变量,用于内函数对其引用;

③:内函数可传入多个参数,也可不传入参数;

④:内函数中可对外函数中的参数、临时变量以及内函数中的参数进行相关运算操作;

⑤:然后用一个变量(这里命名为res)接收外函数的返回结果;

⑥:由于外函数的返回的结果为内函数,若直接输出res则会显示对应的内函数内存地址,因此需要写成res(参数c)的形式,才会显示内函数中运算操作的结果。

直接上案例:

def outer(a):
b = 12
def inner(c):
print(a + b + c)
return inner

res = outer(10)
res(5)

此时,*终输出的结果为27。

具体流程为外函数接收了参数a = 10,内函数接收了参数c = 5,同时外函数中的临时变量b被内函数引用,在内函数中打印出(a + b + c)的结果,并将内函数作为外函数的返回结果进行返回,*后直接调用外函数,将返回结果赋为res,再调用内函数,返回*终结果27。

三、 闭包中内函数修改外函数临时变量
下面介绍一种常用的修改外函数临时变量的方法:

利用nonlocal关键字声明临时变量

def outer(a):
b = 12
def inner(c):
nonlocal b
b = 22
print(a+b+c)
return inner
res = outer(10)
res(5)

由于我们在内函数中使用nonlocal关键字声明了临时变量b,并对其重新赋值,所以,此时的计算结果为37。

四、闭包注意事项
一般情况下,函数在运行结束后会将临时变量都释放给内存。但是闭包比较特殊,由于内函数中会用到外函数的临时变量,因此它会将外函数的临时变量与内函数捆绑在一起,在外函数运行结束后,使其临时变量会在后续中继续被内函数调用。

闭包主要用在装饰器中,接下来我将再出一篇python装饰器讲解文章,包含常用装饰器的使用方法和应用案例,欢迎大家评论关注哦。

特此说明
以上介绍仅是个人对于python闭包的理解,衷心希望能对各位小伙伴有所帮助,如有不妥之处欢迎大家批评指正!

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速