英国雷迪RD1000非金属管线探测仪

见过的最全的网络爬虫干货总结!

·  阅读 41156

这可能是你见过的最全的网络爬虫干货总结!

昨天的时候我参加了掘金组织的一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结,整个直播从昨天下午 1 点一直持续到下午 5 点,整整四个小时。

整个分享分为三个阶段,第一阶段先介绍了自己从大学以来从事编程开发以来的相关历程,第二阶段是正式的网络爬虫分享流程,详细总结了网络爬虫开发的一些要点,第三阶段是解答一些提问,并抽奖送出一些礼品。所以在这里我会对我昨天分享的主要内容做下总结,另外还会附上视频回放、PPT,另外还会为大家送上一些福利,希望大家可以支持!

总括

整个分享的主题叫做《健壮高效的网络爬虫》,本次分享从抓取、解析、存储、反爬、加速五个方面介绍了利用 Python 进行网络爬虫开发的相关知识点和技巧,介绍了不同场景下如何采取不同措施高效地进行数据抓取的方法,包括 Web 抓取、App 抓取、数据存储、代理选购、验证码破解、分布式抓取及管理、智能解析等多方面的内容,另外还结合了不同场景介绍了常用的一些工具包,全部内容是我在从事网络爬虫研究过程以来的经验精华总结。

爬取

对于爬取来说,我们需要学会使用不同的方法来应对不同情景下的数据抓取任务。

爬取的目标绝大多数情况下要么是网页,要么是 App,所以这里就分为这两个大类别来进行了介绍。

对于网页来说,我又将其划分为了两种类别,即服务端渲染和客户端渲染,对于 App 来说,我又针对接口的形式进行了四种类别的划分——普通接口、加密参数接口、加密内容接口、非常规协议接口。

所以整个大纲是这样子的:

  • 网页爬取
    • 服务端渲染
    • 客户端渲染
  • App 爬取
    • 普通接口
    • 加密参数接口
    • 加密内容接口
    • 非常规协议接口

爬取 / 网页爬取

服务端渲染的意思就是页面的结果是由服务器渲染后返回的,有效信息包含在请求的 HTML 页面里面,比如猫眼电影这个站点。客户端渲染的意思就是页面的主要内容由 JavaScript 渲染而成,真实的数据是通过 Ajax 接口等形式获取的,比如淘宝、微博手机版等等站点。

服务端渲染的情况就比较简单了,用一些基本的 HTTP 请求库就可以实现爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,其中应用最多的可能就是 requests 了。

对于客户端渲染,这里我又划分了四个处理方法:

  • 寻找 Ajax 接口,此种情形可以直接使用 Chrome/Firefox 的开发者工具直接查看 Ajax 具体的请求方式、参数等内容,然后用 HTTP 请求库模拟即可,另外还可以通过设置代理抓包来查看接口,如 Fiddler/Charles。
  • 模拟浏览器执行,此种情形适用于网页接口和逻辑较为复杂的情况,可以直接以可见即可爬的方式进行爬取,如可以使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等来实现。
  • 直接提取 JavaScript 数据,此种情形适用于真实数据没有经过 Ajax 接口获取,而是直接包含在 HTML 结果的某个变量中,直接使用正则表达式将其提取即可。
  • 模拟执行 JavaScript,某些情况下直接模拟浏览器执行效率会偏低,如果我们把 JavaScript 的某些执行和加密逻辑摸清楚了,可以直接执行相关的 JavaScript 来完成逻辑处理和接口请求,比如使用 Selenium、PyExecJS、PyV8、js2py 等库来完成即可。

爬取 / App 爬取

对于 App 的爬取,这里分了四个处理情况:

  • 对于普通无加密接口,这种直接抓包拿到接口的具体请求形式就好了,可用的抓包工具有 Charles、Fiddler、mitmproxy。
  • 对于加密参数的接口,一种方法可以实时处理,例如 Fiddler、mitmdump、Xposed 等,另一种方法是将加密逻辑破解,直接模拟构造即可,可能需要一些反编译的技巧。
  • 对于加密内容的接口,即接口返回结果完全看不懂是什么东西,可以使用可见即可爬的工具 Appium,也可以使用 Xposed 来 hook 获取渲染结果,也可以通过反编译和改写手机底层来实现破解。
  • 对于非常规协议,可以使用 Wireshark 来抓取所有协议的包,或者使用 Tcpdump 来进行 TCP 数据包截获。

以上便是爬取流程的相关分类和对应的处理方法。

解析

对于解析来说,对于 HTML 类型的页面来说,常用的解析方法其实无非那么几种,正则、XPath、CSS Selector,另外对于某些接口,常见的可能就是 JSON、XML 类型,使用对应的库进行处理即可。

这些规则和解析方法其实写起来是很繁琐的,如果我们要爬上万个网站,如果每个网站都去写对应的规则,那么不就太累了吗?所以智能解析便是一个需求。

智能解析意思就是说,如果能提供一个页面,算法可以自动来提取页面的标题、正文、日期等内容,同时把无用的信息给刨除,例如上图,这是 Safari 中自带的阅读模式自动解析的结果。

对于智能解析,下面分为四个方法进行了划分:

  • readability 算法,这个算法定义了不同区块的不同标注集合,通过权重计算来得到最可能的区块位置。
  • 疏密度判断,计算单位个数区块内的平均文本内容长度,根据疏密程度来大致区分。
  • Scrapyly 自学习,是 Scrapy 开发的组件,指定⻚页⾯面和提取结果样例例,其可⾃自学习提取规则,提取其他同类⻚页⾯面。
  • 深度学习,使⽤用深度学习来对解析位置进⾏行行有监督学习,需要⼤大量量标注数据。

如果能够容忍一定的错误率,可以使用智能解析来大大节省时间。

目前这部分内容我也还在探索中,准确率有待继续提高。

存储

存储,即选用合适的存储媒介来存储爬取到的结果,这里还是分为四种存储方式来进行介绍。

  • 文件,如 JSON、CSV、TXT、图⽚、视频、⾳频等,常用的一些库有 csv、xlwt、json、pandas、pickle、python-docx 等。
  • 数据库,分为关系型数据库、非关系型数据库,如 MySQL、MongoDB、HBase 等,常用的库有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift。
  • 搜索引擎,如 Solr、ElasticSearch 等,便于检索和实现⽂本匹配,常用的库有 elasticsearch、pysolr 等。
  • 云存储,某些媒体文件可以存到如七⽜牛云、又拍云、阿里云、腾讯云、Amazon S3 等,常用的库有 qiniu、upyun、boto、azure-storage、google-cloud-storage 等。

这部分的关键在于和实际业务相结合,看看选用哪种方式更可以应对业务需求。

反爬

反爬这部分是个重点,爬虫现在已经越来越难了,非常多的网站已经添加了各种反爬措施,在这里可以分为非浏览器检测、封 IP、验证码、封账号、字体反爬等。

下面主要从封 IP、验证码、封账号三个方面来阐述反爬的处理手段。

反爬 / 封 IP

对于封 IP 的情况,可以分为几种情况来处理:

  • 首先寻找手机站点、App 站点,如果存在此类站点,反爬会相对较弱。
  • 使用代理,如抓取免费代理、购买付费代理、使用 Tor 代理、Socks 代理等。
  • 在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用。
  • 搭建 ADSL 拨号代理,稳定高效。

反爬 / 验证码

验证码分为非常多种,如普通图形验证码、算术题验证码、滑动验证码、点触验证码、手机验证码、扫二维码等。

  • 对于普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习、深度学习来进行模型训练,当然打码平台是最方便的方式。
  • 对于算术题验证码,推荐直接使用打码平台。
  • 对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口。
  • 对于点触验证码,推荐使用打码平台。
  • 对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证。
  • 对于扫二维码,可以人工扫码,也可以对接打码平台。

反爬 / 封账号

某些网站需要登录才能爬取,但是一个账号登录之后请求过于频繁会被封号,为了避免封号,可以采取如下措施:

  • 寻找手机站点或 App 站点,此种类别通常是接口形式,校验较弱。
  • 寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口。
  • 维护 Cookies 池,使⽤用批量账号模拟登录,使⽤时随机挑选可用 Cookies 使⽤即可,实现:https://github.com/Python3WebSpider/CookiesPool。

加速

当爬取的数据量非常大时,如何高效快速地进行数据抓取是关键。

常见的措施有多线程、多进程、异步、分布式、细节优化等。

加速 / 多线程、多进程

爬虫是网络请求密集型任务,所以使用多进程和多线程可以大大提高抓取效率,如使用 threading、multiprocessing 等。

加速 / 异步

将爬取过程改成非阻塞形式,当有响应式再进行处理,否则在等待时间内可以运行其他任务,如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等。

加速 / 分布式

分布式的关键在于共享爬取队列,可以使用 celery、huey、rq、rabbitmq、kafka 等来实现任务队列的对接,也可以使用现成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等。

加速 / 优化

可以采取某些优化措施来实现爬取的加速,如:

  • DNS 缓存
  • 使用更快的解析方法
  • 使用更高效的去重方法
  • 模块分离化管控

加速 / 架构

如果搭建了分布式,要实现高效的爬取和管理调度、监控等操作,我们可以使用两种架构来维护我们的爬虫项目。

  • 将 Scrapy 项目打包为 Docker 镜像,使用 K8S 控制调度过程。
  • 将 Scrapy 项目部署到 Scrapyd,使用专用的管理工具如 SpiderKeeper、Gerapy 等管理。

以上便是我分享的全部内容,所有的内容几乎都展开说了,一共讲了一个半小时。

上面的文字版的总结可能比较简略,非常建议大家如有时间的话观看原版视频分享,里面还能看到我本人的真面目哦,现在已经上传到了 Bilibili,链接为:www.bilibili.com/video/av343…,欢迎大家观看学习和收藏~

另外对于这部分内容,其实还有我制作的更丰富的思维导图,预览图如下:

点击图片,获取爬虫思维导图高清图片

另外还有原演讲稿我也一并分享给大家,都放在我的公众号了。

获取方式如下:

  • 回复”爬虫讲稿“,获取本次分享的 PPT 内容。

Linux磁盘扩容三种方式

 

Hlroliu

于 2020-11-18 10:43:14 发布

7708
收藏 78
分类专栏: Linux磁盘扩容 磁盘扩容 文章标签: linux
版权

Linux磁盘扩容
同时被 2 个专栏收录
1 篇文章0 订阅
订阅专栏

磁盘扩容
1 篇文章0 订阅
订阅专栏
Linux在使用过程中由于数据量不断增大,导致磁盘空间不足,需要增加磁盘空间,主要有以下三种方式
1、直接给 / 分区(或者某一分区)扩容,直接在原有磁盘上增大空间
2、给虚拟机新增一块磁盘,为这块磁盘新建一个分区
3、给虚拟机新增一块磁盘,并把磁盘空间扩容到原有分区

1、给 / 分区扩容
查看磁盘空间大小,目前 / 分区大小为50G,并且只有一块磁盘

给/dev/vda 增加50G的空间,并把这50G扩容到 / 分区

/dev/vda 目前为100G,接下来对磁盘进行分区,创建物理卷,把新增的物理卷加到卷组里

对磁盘分区,使用fdisk /dev/vda ,输入n 新建分区,然后一直回车,最后输入 w 保存配置;创建完成之后,可输入 p 查看;/dev/vda3 即为新建的分区

输入partprobe 让系统识别新增的分区,然后创建物理卷,使用pvcreate /dev/vda3
扩展卷组,使用vgextend centos /dev/vda3命令,卷组信息可通过 vgdisplay 查看

扩展 / 的大小,增加50G,使用lvresize -L +30G /dev/mapper/centos-root命令,其中

重新识别 / 分区的大小,而ext4格式磁盘使用resize2fs /dev/mapper/centos-root

2、新增一块磁盘并划分独立分区,新增一块100G的磁盘,划分为/data

对磁盘 /dev/vdb 进行分区,格式化,挂载
磁盘分区

格式化

创建挂载点 /data,挂载分区

实现开机自动挂载(编辑 /etc/fstab 文件),保存退出后,执行 mount -a 无报错则配置成功

3、新增一块磁盘,并扩容到原有分区
新增一块磁盘 /dev/vdc 大小为50G,并把空间扩容至 / 分区

对 /dev/vdc 进行分区,并设置分区属性
t: 修改分区文件系统id,选择8e,LVM(与原有分区一致)
L:列出所有Hex代码

输入partprobe 让系统识别新增的分区,然后创建物理卷,使用pvcreate /dev/vdc1;pvdisplay查看

扩展卷组,扩展分区

查看磁盘大小

 

————————————————
版权声明:本文为CSDN博主「Hlroliu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Hlroliu/article/details/109764269

Linux下使用fdisk扩大分区容量(不丢失数据)

原创

sandshell博主文章分类:Linux©著作权

文章标签Linux使用fdisk扩大文章分类Linux系统/运维阅读数4.4万

环境:

模拟新加一块磁盘,并分区,挂载,永久挂载,然后写入数据,然后对分区扩容,测试扩容后分区里面的内容是否丢失。

查看所有分区:

[root@backup ~]# fdisk -l
Disk /dev/sda: 1073.7 GB, 1073741824000 bytes
255 heads, 63 sectors/track, 130541 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00040b96
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1070     8388608   82  Linux swap / Solaris
/dev/sda3            1070       13055    96263168   83  Linux
Disk /dev/sdb: 1073.7 GB, 1073741824000 bytes
255 heads, 63 sectors/track, 130541 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

开始分区:

[root@backup ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xc6e44e94.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p            #p是打印当前磁盘所有分区

Disk /dev/sdb: 1073.7 GB, 1073741824000 bytes
255 heads, 63 sectors/track, 130541 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc6e44e94

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n            #n是新建分区
Command action
   e   extended
   p   primary partition (1-4)
p                                  #新建主分区
Partition number (1-4): 1          #给主分区编号为1,从1开始编号
First cylinder (1-130541, default 1):     #回车,默认从1开始,也可以手动输入1
Using default value 1                        #起始分区的位置
Last cylinder, +cylinders or +size{K,M,G} (1-130541, default 130541):     #直接回车,默认把磁盘所有空间分配到此分区。这里支持K,M,G,如果想给此分区分配100M空间,就输入+100M;如果要分配100G那么就输入+100G
Using default value 130541                    #结束分区的位置

Command (m for help): w                #w为写入分区信息并保存,然后退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

查看刚刚分区的信息:/dev/sdb1

[root@backup ~]# fdisk -l
Disk /dev/sda: 1073.7 GB, 1073741824000 bytes
255 heads, 63 sectors/track, 130541 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00040b96
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        1070     8388608   82  Linux swap / Solaris
/dev/sda3            1070       13055    96263168   83  Linux
Disk /dev/sdb: 1073.7 GB, 1073741824000 bytes
255 heads, 63 sectors/track, 130541 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc6e44e94
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      130541  1048570551   83  Linux
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

格式化分区:mkfs.ext4 /dev/sdb1

[root@backup ~]# mkfs.ext4 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536000 inodes, 262142637 blocks
13107131 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
8000 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: 
done
This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

挂载分区:

[root@backup backup]# mkdir /backup
[root@backup backup]# mount /dev/sdb1 /backup/
[root@backup backup]# df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda3      ext4    91G  2.2G   84G   3% /
tmpfs          tmpfs  1.9G     0  1.9G   0% /dev/shm
/dev/sda1      ext4   190M   38M  142M  21% /boot
/dev/sdb1      ext4   985G   72M  935G   1% /backup
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

挂载磁盘:(永久挂载)

通过vi编辑器编辑/etc/fstab文件,内容如下,(最后一行是刚添加上去的):

 

[root@backup ~]# cat /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Mon May 14 02:01:11 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=7d223255-1b77-4f58-bd72-262928547fcf /                       ext4    defaults        1 1
UUID=284d6b31-8723-497b-bc7b-3c12ede23ee6 /boot                   ext4    defaults        1 2
UUID=5d36c1b3-df6e-480d-80ca-72befc66f5e9 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sdb1                   /backup                 ext4    defaults        0 0
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

 

第四列挂载参数:通过查看man mount 来查看

第五列是否要备份:(0为不备份,1为要备份,一般情况下不用做备份)

第六列自检程序  (0为不自检,1或2为要自检,如果是根分区要设置1,其它分区只能是2)

[root@backup ~]# echo backup >/backup/backup.txt
[root@backup ~]# cat /backup/backup.txt 
backup
  • 1.
  • 2.
  • 3.

此时机器不关机,用vmware vspere client扩容磁盘大小。

[root@backup ~]# fdisk -l /dev/sdb
Disk /dev/sdb: 1073.7 GB, 1073741824000 bytes
255 heads, 63 sectors/track, 130541 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc6e44e94
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      130541  1048570551   83  Linux
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

此时发现扩容的磁盘容量看不到,所以还是重启一下吧,建议关机时候再扩容。

[root@backup ~]# umount /dev/sdb1    #取消挂载
[root@backup ~]# fdisk /dev/sdb    
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').
Command (m for help): p
Disk /dev/sdb: 1181.1 GB, 1181116006400 bytes
255 heads, 63 sectors/track, 143595 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc6e44e94
   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1      130541  1048570551   83  Linux
Command (m for help): d        #因为此磁盘只有一个分区sdb1,所以按d删除时候默认不会让选择要删除的分区,如果有多个分区会提示要删除的分区。
Selected partition 1
Command (m for help): p        #打印当前分区,发现分区已删除
Disk /dev/sdb: 1181.1 GB, 1181116006400 bytes
255 heads, 63 sectors/track, 143595 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xc6e44e94
   Device Boot      Start         End      Blocks   Id  System
Command (m for help): n        #新建分区
Command action
   e   extended
   p   primary partition (1-4)
p                                #新建主分区
Partition number (1-4): 1        #和扩容前的分区标号必须一样
First cylinder (1-143595, default 1):     #默认是1,比如要和扩容前的分区其实点一样,扩容前的分区起始也是1,这个是扩容的重点地方。
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-143595, default 143595): #终止的位置是默认是硬盘柱体的尾部,即使最大值,这个是要扩容的点,回车。
Using default value 143595
Command (m for help): w                           #w报错,并退出。
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

3、调整分区

e2fsck -f /dev/sdb1 #检查分区信息

resize2fs /dev/sdb1 #调整分区大小

 

[root@backup ~]# e2fsck -f /dev/sdb1    #由于磁盘容量很大,数据多的情况下需要等待一段时间
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdb1: 12/65536000 files (0.0% non-contiguous), 4164250/262142637 blocks
[root@backup ~]# resize2fs /dev/sdb1     #由于磁盘容量很大,数据多的情况下需要等待一段时间
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/sdb1 to 288356701 (4k) blocks.
The filesystem on /dev/sdb1 is now 288356701 blocks long.
[root@backup ~]# mount /dev/sdb1 /backup/
[root@backup ~]# cat /backup/
backup.txt  lost+found/ 
[root@backup ~]# cat /backup/backup.txt 
backup
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

发现扩容成功,扩容前的内容没有丢失。

参考内容:

https://blog.csdn.net/wuweilong/article/details/7538634

https://blog.csdn.net/jackyu651/article/details/53070607

https://blog.csdn.net/a746742897/article/details/52689285

shell脚本–设置定期自动备份日志文件

 

Hlroliu

每周五23:50自动备份/var/log下的所有日志文件到/root/Backup目录下 ,并以日期命名;

#vim backup.sh
[ -d /root/Backup ] && echo “Backup is ready” || mkdir /root/Backup > /dev/null

#先判断备份文件保存目录是否存在,不存在则创建
tar -czfP /root/Backup/log-`date +%Y%m%d`.tar.gz /var/log

## tar默认为相对路径,可以使用-P参数使用绝对路径
##保存并退出脚本,编写计划任务,以下命令在系统命令界面设置

#chmod +x /root/backup.sh #添加可执行权限
#crontab -e
30 23 * * 5 /root/backup.sh
每天备份前一天的日志,保留30天日志并定期清理30天前的备份日志

vim logbak.sh
#!/bin/bash
#获取备份的前一天时间
DAY=`TZ=”TAIST+16″ date +%Y-%m-%d`
#备份前一天的日志文件
tar cvf /u01/mics/log_archive/$DAY.tar /u01/mics/log/$DAY /u01/mics/log/*.log
gzip -r /u01/mics/log_archive/$DAY.tar
#清除备份目录下30天前的备份文件
find /u01/mics/log_archive/ -mtime +30 -exec rm -rf {} \;

#设定计划任务。每天00:30备份昨天的日志
crontab -e
30 00 * * * sh /u01/mics/baklog
————————————————
版权声明:本文为CSDN博主「Hlroliu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Hlroliu/article/details/102751788

Linux 定时执行shell 脚本

spearhead_cai

于 2019-12-30 13:30:00 发布

5965
收藏 29
版权
2019年第 85 篇文章,总第 109 篇文章

本文大约2000字,阅读大约需要6分钟

crontab 可以在指定的时间执行一个shell脚本以及执行一系列 Linux 命令。

定时执行shell 脚本
简单给出执行 shell 脚本的步骤。

首先是编写一个测试脚本–test.sh

# 创建脚本
$ vim test.sh
# 在脚本中做写入文件操作
date >> data.txt
修改脚本的权限,确保脚本有执行的权限

chmod 777 test.sh
设置 crontab 定时任务

# 打开定时任务配置文件
crontab -e
# 在配置文件中写入定时任务的操作, 这里就是指定每天12点定时执行脚本,并把执行脚本的日志写入文件 test.log
0 12 * * * sh test.sh > test.log
保存退出,也就是 :wq

如果有错,linux 会在执行的时候发送一份邮件给你

cat /var/spool/mail/root
注意:

crontab 是运行在系统默认环境里,如果运行的脚本是执行 python 代码,即脚本的内容可能是:

python test.py
这里的 python 会是系统默认的 python 版本,而如果你是运行在 conda 环境里,那么这里就需要采用当前环境里 python 版本的执行文件的绝对路径,即先用以下命令查找当前 python 版本的执行文件位置:

$ which python
# 假设输出的文件位置为:
/root/anaconda3/py3/bin/python
这里输出的路径,直接替换脚本里的 python:

/root/anaconda3/py3/bin/python test.py
这样才能保证运行不出错,否则可能因为版本问题出错;

crontab命令详解
常用命令
crontab –e //修改 crontab 文件,如果文件不存在会自动创建。
crontab –l //显示 crontab 文件。
crontab -r //删除 crontab 文件。
crontab -ir //删除 crontab 文件前提醒用户。

service crond status //查看crontab服务状态
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
所以如果需要取消某个定时任务,就是可以删除在配置文件中的对应命令,即 crontab -e 打开文件,然后删除对应哪行的命令即可

基本格式
*  *  *  *  *  command
分 时  日  月  周  命令
第1列表示分钟 00~59 每分钟用*或者 */1表示

第2列表示小时 00~23(0表示0点)

第3列表示日期 01~31

第4列表示月份 01~12

第5列标识号星期 0~6(0表示星期天)

第6列要运行的命令

此外每一列除了数字,还可以有这些符号,其含义如下所示:

* 代表任何时间,比如第一个 * 就代表一小时中的每分钟都执行
, 代表不连续的时间,比如 0 8,12,16 * * * 代表每天8,12,16点0分执行
– 代表连续的时间范围,比如0 5 * * 1-6 代表在周一到周六凌晨5点0分执行
*/n 代表每个多久执行一次,比如*/10 * * * *代表每隔10分钟执行一次
示例
1、在 凌晨00:10运行

10 0 * * * sh test.sh
2、每个工作日23:59都进行备份作业。

59 23 * * 1,2,3,4,5 sh test.sh
或者
59 23 * * 1-5 sh test.sh
3、每分钟运行一次命令

*/1 * * * * sh test.sh
4、每个月的1号 14:10 运行

10 14 1 * * sh test.sh
5、每10分钟定时请求一个地址

0 */10 * * * /usr/bin/curl http://www.aaa.com/index.php
注意,一般最好不要同时采用几号和每周几,可能会出现混淆;

正确、错误日志的输出是否写入到文件方法

1.不输出任何内容(建议使用方法一)

*/1 * * * * /root/XXXX.sh >/dev/null 2>&1

*/1 * * * * /root/XXXX.sh &>/dev/null //&表示任何内容
2.将正确和错误日志都输出到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log 2>&1
3.只输出正确日志到 /tmp/load.log

*/1 * * * * /root/XXXX.sh > /tmp/load.log

*/1 * * * * /root/XXXX.sh 1> /tmp/load.log //1可以省略
4.只输出错误日志到 /tmp/load.log

*/1 * * * * /root/XXXX.sh 2> /tmp/load.log
部分解释:

/dev/null 代表空设备文件
> 代表重定向到哪里
1 表示stdout标准输出,系统默认值是1,所以”>/dev/null”等同于”1>/dev/null”
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1

————————————————
版权声明:本文为CSDN博主「spearhead_cai」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lc013/article/details/103775702

VMware下Linux根分区磁盘扩容

一、VMware虚拟机硬盘扩容
1、硬盘扩容
开启虚拟机前,打开VMware的虚拟机设置——硬盘——扩容——选择空间大小——确定。

sudo fdisk -l
1
可以看到新扩容的磁盘,但是使用下面命令看到磁盘是未分配状态

df -h
1
二、Linux分区挂载
1、分区
打开虚拟机,打开命令行,输入

sudo fdisk /dev/sda
1
命令(输入 m 获取帮助): m

添加新分区:n

此时,fdisk会让你选择添加为逻辑分区呢(编号从5开始)还是主分区(编号1到4)。 选择主分区,则键入p;选择逻辑分区键入l。

选择主分区:p

选择主分区的编号:enter(默认,如果有sda1,那就添加sda2,或sda3,sda4)

选择该分区的Start 值(start cylinder)和结束值;enter(默认全部使用)

保存所有并退出,分区划分完毕”:w

2、格式化分区
格式化指定的分区

mkfs -t ext3 /dev/sda3
1
或者

mkfs.ext3 /dev/sda3
1
3、挂载分区
手动挂载,则键入:

mount /dev/sda3 /home/work/
1
“表示将该新分区挂载到/home/user/up这个目录下面”

开机自动挂载,则修改/etc/fstab文件,在这个文件里面添加一行:

/dev/sda2 /home/user/up ext4 defaults 1 2
1
自动挂载方法二:

vim .bashrc

mount /dev/sda2 /home/user/up
或者(两者的区别未测试)
vim etc/profile
mount /dev/sda2 /home/user/up

reboot重启之后,你会发现有新的分区,但是需要将磁盘的权限打开即可:

sudo chmod 777 xxx
1
/etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。

当系统启动的时候,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。下面我来介绍如何在此文件下填写信息。

原文链接:https://blog.csdn.net/richerg85/article/details/17917129
————————————————
版权声明:本文为CSDN博主「WeSiGJ」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wesigj/article/details/115441326

linux扩展分区大小 centos7.6 (成功案例)

 1.先选中虚拟机,右击设置
VMware下Linux根分区磁盘扩容_虚拟机
2.选择添加->硬盘->下一步
VMware下Linux根分区磁盘扩容_卷组_02
3.一值点下一步,到设置容量大小,输入1,然后下一步,选择存储位置(一路下一步就搞定了)
4.最后确定,进入系统。df -h查看当前系统文件系统情况
VMware下Linux根分区磁盘扩容_扩容_03
5.使用fdisk -l查看硬盘情况,可以看见我新增的那块硬盘区间

VMware下Linux根分区磁盘扩容_PV_04
6.对新加的硬盘进行分区,格式化,因为我的磁盘名称是/dev/sdc,所以输入 fdisk /dev/sdc命令:

依次输入:m

n  添加新分区

p  创建为主分区,回车使用默认分区号

回车两次使用默认起始扇区和最后扇区
VMware下Linux根分区磁盘扩容_卷组_05
这里可以看见设置的类型是Linux类型,大小实际上不足1GB。但是我的根分区是Linux LVM类型的,所以还需要一次转换。
VMware下Linux根分区磁盘扩容_虚拟机_06
继续输入t,输入8e,回车。输入w,保存退出。
VMware下Linux根分区磁盘扩容_VG_07
这个时候再输入fdisk -l,就可以看见创建的分区了。
VMware下Linux根分区磁盘扩容_扩容_08
7.注意不要将新建的磁盘分区挂载到Linux的文件系统中,我们是要对/进行扩容,而不是添加一个区。顺便记录一下,挂载命令是mount /dev/sdc1 /指定位置空文件夹/。如果要开机自动挂载,需要修改/etc/fstab文件的内容,添加一行:/dev/sdc1 /挂载文件夹 ext4 defaults 0 0.挂载使用之前,需要将磁盘先格式化:mkfs.ext4 /dev/sdc1 格式化成ext4,同理ext3,2就是修改一下数字。
回归正题。

创建物理卷:pvcreate /dev/sdc1

查看当前卷组情况:vgdisplay
VMware下Linux根分区磁盘扩容_虚拟机_09
扩展卷组:CentOS:vgextend /dev/centos /dev/sdc1

再查看就会发现VG的大小增加了:
VMware下Linux根分区磁盘扩容_卷组_10
最后就是要扩展我们的根目录容量了:
VMware下Linux根分区磁盘扩容_虚拟机_11
根分区叫root,最后一级,centos是卷组名称,命令如下:

扩展逻辑卷centos-root的容量:lvextend -L +1024M /dev/centos/root
VMware下Linux根分区磁盘扩容_VG_12
可能会出现大小不够的情况,将1024稍微调小点就可以了。

重置根分区的容量:resize2fs /dev/centos/root.

注: 扩展卷组:CentOS:vgextend /dev/centos /dev/sdc1
之后发现VG size 增加后,扩容报错也可以使用下面自动扩展命令

xfs_growfs /dev/centos/root

 之后再df -h 查看已经扩容完成了。

暗网系列之:利用Python + OnionScan 打造自己的安全威胁情报平台(一)

2017-08-02 16:40

 

MottoIN暗网系列专题的目标,是让大家更加全面、更深入的了解暗网,这当中自然涉及安全威胁情报分析平台的话题。

OnionScan 是一个用来在暗网中寻找潜在的泄露数据的利器,最新版本中还加入了一些炫酷的可视化效果,尽管项目的管理团队并没有公布实现深度扫描的技术细节,也没有说明那些看起来非常酷的可视化效果是如何生成的。

不过,没关系,接下来,就让我们一起尝试使用 Python + OnionScan完成安全威胁情报平台的搭建,探讨如何在暗网中进行深度探索、寻找感兴趣的信息、分析有用的情报,顺便也提高一下数据可视化的技能。

通常让我们感到恐怖的,不是看不到的东西,而是看到了却不明白的东西”,深入暗网深处,看看能找到那些可怕的/宝贵的信息。

第一部分(Part  1)

流程简介

初始工作的简单流程,如下所述:

  1. 拥有一台可以7*24小时运行的服务器,扫描工作需要花费大量的时间(自己有服务器的话最好,练手的话也可以使用云服务器);
  2. 在服务器上运行Tor 软件;
  3. 安装 OnionScan;
  4. 编写Python脚本,处理扫描工作,并将扫描结果进行数据管理;
  5. Python进阶,优化数据分析结果的可视化展示效果

搭建合适的服务器及运行环境

第一步,创建服务器环境。推荐使用Ubuntu16.4(下文中也将以此作为演示环境)。根据自己的主机环境,选择合适的连接到服务器的方式。

  • windows系统:Putty;
  • Mac OS X或Linux系统:直接使用ssh命令(sshroot@IPADDRESS)

第二步,配置服务器的环境。连接到Ubuntu服务器上,运行如下命令:

apt-get update

apt-get install tor git bison libexif-dev

apt-get install python-pip

pip install stem

第三步:安装Go语言的运行环境。OnionScan是用Go语言编写的,参考Ryan Frankel 《http://www.hostingadvice.com/how-to/install-golang-on-ubuntu/》 的教程,在服务器上执行下列命令:

bash<<(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

[[ -s “$HOME/.gvm/scripts/gvm” ]] && source “$HOME/.gvm/scripts/gvm”

source /root/.gvm/scripts/gvm

gvm install go1.8–binary

gvm use go1.8

也可以通过离线下载的方式进行安装:https://golang.org/dl/

第四步,安装OnionScan。命令如下:

go get github.com/s-rah/onionscan

go install github.com/s-rah/onionscan

完成上述步骤后,在终端输入:

onionscan

如果返回“onionscan”的命令行使用信息,恭喜你,onionscan已经安装成功了;

关闭终端后,如果发现不能运行onionscan的话,可以在终端输入下列命令解决该问题:

gvm use go1.8

第五步,修改Tor的配置

为了便于我们编写的Python脚本可以请求一个新的标识(一个新的IP地址),在这里需要对Tor的配置做一些小小的改动。后边在扫描的过程中如果遇到障碍,会用到这部分的内容。

在终端运行如下命令:

tor —hash-passwordYourPasswd

可以根据自己的喜好,设置“YourPasswd”的内容。这时你会接收到一串输出,把它们复制下来,然后在终端执行下来命令:

vim -w /etc/tor/torrc

此时会打开 torrc文件的编辑视图,跳转到文本底部,将之前复制的那串字符粘贴过来,效果类似下图所示:

 

完成之后,保存退出,在终端输入下来命令用于重启Tor服务:

service tor restart

至此,服务器环境搭建工作基本上就已经完成了。(不算太难,不是吗?)

在正式开始编写Python代码之前,还需要添加感兴趣的.onion地址清单,这样才能在暗网中顺利的执行扫描任务。例如:

wget https://raw.githubusercontent.com/automatingosint/osint_public/master/onionrunner/onion_master_list.txt

Tips:使用SSH连接到远程服务器后,执行一些扫描任务比较耗时,这种情况下,可以使用 Screen 命令,创建多个虚拟终端,在虚拟终端里执行命令,断开之前先把 Screen 挂起,重新启用时可以直接连接到之前的Screen上。

编写Python脚本,封装OnionScan

OnionScan是一款伟大的工具,为了能够更好的利用它为我们服务,需要对其进行封装,何况Tor的连接是出了名的不稳定,我们需要能够杀掉一个卡住的扫描进程,也需要能够从Tor网络中抓取新的IP地址。所以,是事后运用你的Python编码能力了。打开一个新的Python文件,并将其命名为onionrunner.py(完整代码参见文章末尾的更多资料部分)

 

第1-12行:载入脚本中所需的模块;

第14-15行:初始化两空链表,分别保存我们完整的 onion列表和正在进行的会话的onion扫描列表。

第17-18行:利用一个事件对象协调两个将被执行的线程。必须首先设置 Event对象,以便默认情况下主线程可以执行。。

接下来还需要构建一些辅助函数,这些函数将处理 main onions列表,并确保能够继续将新发现的onions添加到列表:

 

第23行:定义get_onion_list函数,主要用于加载我们的扫描清单。

第26-33行:一个判断,如果onion_master_list.txt文件存在(26),那么打开它,并祖杭阅读,将结果添加到stored_onions(30);如果文件不存在,则输出一条错误消息(32)并退出脚本(33)。

第35-37行:简单地输出加载的onions的总数(35),Return。

第41行:定义store_onion函数,它接受一个参数(onion),这是我们希望添加到master列表中的隐藏服务(onion网址)。

第45-46行:打开onion_master_list.txt列表文件(45),然后写入隐藏服务的onion地址(46)。

现在我们将实施与运行onionscan二进制做实际的扫描工作处理功能。保持你的编辑器添加代码:

接下来,将处理与运行onionscan二进制文件执行扫描任务相关的代码。

 

更多源代码的分析,感兴趣的话,可以自行阅读。

终端下,运行一下殒命,就可以开始扫描工作了:

python onionrunner.py

此时,你会看到如下所示的输出:

# python onionrunner.py

[*] Total onions for scanning: 7182

[*] Running 0 of 7182.

[*] Onionscanningnfokjthabqzfndmj.onion

[*] Running 1 of 7182.

[*] Onionscanning gmts3xxfrbfxdm3a.onion

检查 onionscan_results 目录,你会看到新增的一些JSON 文件,这些文件一扫描的隐藏服务的地址命名。让它继续运行吧,如果你真的想收集这些目标的信息的话。当然了,如果你使用了本文中所列的Onions列表,那么可以选择直接下载扫描结果:

https://github.com/automatingosint/osint_public/tree/master/onionrunner

利用Shodan搜索引擎扩大暗网 OSNIT的能力

Shodan 搜索引擎可以说是安全专业人员的最常用工具之一,它的搜索能力极其强大,所以,我们需要想办法把它集成到我们的威胁情报分析平台中。幸运的是,Shodan提供了Python接口,这便于我们利用其API进行一些低水平的交互。

首先,安装Shodan。

Windows: pip install shodan

Mac/Linux: sudo pip install shodan

一般情况下,人们不会将同一台服务器同时托管在“公共网络”和“暗网”中,但是也不能排除这种可能。接下来,我们就以检索暗网中的SSH密钥信息为例,进行测试,看看能否碰撞出一些奇妙的结果。

依照咱们的惯例,依然需要编写一个Python脚本来完成此项工作。这一次我们创建一个名为 “sshkeys.py”的脚本(下载链接参见文末更多资料部分):

sshkeys.py 脚本的代码如下图所示:

 

第3行:加载了shodan 模块;

第19-20行:如果扫描结果中包含一个 SSH 密钥,打印出一个友好的提示;

第22-25行:如果 key_to_hosts字典里已经包含了该SSH 密钥(22),添加当前隐藏的服务并存储在密钥列表里(23)。这里之所以使用一个密钥列表,是因为存在同一个SSH 密钥关联多个隐藏服务的情况,这确实很有趣。如果key_to_hosts 字典中没有该SSH 密钥,那么用一个新的列表初始化字典,并添加当前的隐藏服务(25);

第27-35行:当上边的循环代码遍历完所有的JSON文件,我们需要针对每个密钥做一个快速的分析,判断它是否被多个隐藏服务共享。

第37-50行:利用 Shodan 的API,检查密钥的指纹信息(公共网络中的IP地址)。

你可以使用下列命令,直接运行该脚本:

# python sshkeys.py

至此,你可以去检索一下这些公共网络中的IP地址与暗网中隐藏服务的潜在联系了。当然你也可以使用现成的威胁情报分析工具来自动化完成分析工作。

结论

关于暗网中情报的收集和分析,有很多有趣的工作可以去做。

本文只是一个开始,我们希望读者能更多的从信息安全和隐私保护的角度看待暗网,走进暗网,利用智能的情报分析,帮助我们更多地保护客户。

更多资料

http://www.hostingadvice.com/how-to/install-golang-on-ubuntu/

https://raw.githubusercontent.com/automatingosint/osint_public/master/onionrunner/onionrunner.py

https://github.com/automatingosint/osint_public/blob/master/onionrunner/analysis/sshkeys.py

https://www.hunch.ly

前端 onionscan + tor 实现暗网爬取

trainer-co · 2019年12月11日 · 22 次阅读

1、安装相关依赖

123456
yum update
yum install git bison libexif-devyum install toryum install epel-release
yum install python-pippip install stem

2、 安装 go 语言环境

12345678910111213141516
wget https://dl.google.com/go/go1.12.6.linux-amd64.tar.gz# 解压tar -C /usr/local -xzf go1.12.6.linux-amd64.tar.gz# 创建go项目路径mkdir -p /root/gopath# 添加环境变量vi /etc/profile# 添加内容GOROOT=/usr/local/goGOPATH=/root/gopath
export GOROOT
export GOPATH
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin# 使环境变量生效
source /etc/profile

 

3、安装 onionscan

12345678910
# 由于golang.org被墙,不能直接下载文件,所以需要从镜像仓库手动下载相应的依赖文件
mkdir -p /root/gopath/src/golang.org/x

cd /root/gopath/src/golang.org/x/git clone https://github.com/golang/net.git git clone https://github.com/golang/crypto.gitgit clone https://github.com/golang/sys.git# 安装onionscan
go get github.com/s-rah/onionscan
go install github.com/s-rah/onionscan

在命令行输入onionscan返回相应的命令信息表示 onionscan 安装成功

4、Tor 的配置

由于 onionscan 是通过 tor 代理进行访问暗网,而 tor 在国内不能直接连接上,所以需要进行代理配置

1234567891011121314
# 编辑tor配置文件vi /etc/tor/torrc# 在文件最后添加Socks4Proxy 192.98.203.92:1088 #socks4代理地址,也支持http代理和sock5代理
# tor不能用root用户运行,创建一个用户来运行toruseradd tor# 创建tor运行所需的目录,以及赋予权限mkdir -p /run/tor
chown -R tor:tor /run/tor
# 用tor用户登录su tor# 启动tortor

出现如下图输出,表示 tor 启动成功

 

onionscan 的使用

123456
# 创建onionscan数据存储目录mkdir -p /opt/onionscandb
# 使用onionscan进行爬取onionscan -dbdir /opt/onionscandb  -torProxyAddress 127.0.0.1:9050 -depth 1 -jsonReport -verbose wallstyizjhkrvmj.onion

参数说明:

  1. -dbdir 指定爬取数据存储目录,未指定情况下会保存在当前路径下
  2. -torProxyAddress 使用 tor 代理
  3. -depth 指定扫描暗网的深度
  4. -jsonReport 扫描结果生成 json 报告
  5. -verbose 控制台输出详细信息

扫描结果效果图

 

参考资料

  1. 暗网系列之:利用 Python + OnionScan 打造自己的安全威胁情报平台
  2. 用好 OnionScan,自己动手制作暗网爬虫

Ubuntu 添加存储库

Ubuntu Add Repository

When installing packages using the Ubuntu Software Center or the command line utilities such as apt or apt-get the packages are downloaded from one or more apt software repositories. An APT repository is a network server or a local directory containing deb packages and metadata files that are readable by the APT tools.

While there are thousands of application available in the default Ubuntu repositories, sometimes you may need to install software from a 3rd party repository.

In this tutorial, we will show you two ways to add apt repository on Ubuntu and Debian systems. The first method is by using the add-apt-repository command and the second one is to manually add the repository using a text editor.

Apt Sources

On Ubuntu and all other Debian based distributions, the apt software repositories are defined in the /etc/apt/sources.list file or in separate files under the /etc/apt/sources.list.d/ directory.

The names of the repository files inside the /etc/apt/sources.list.d/ directory must end with .list.

The general syntax of the /etc/apt/sources.list file takes the following format:

deb http://repo.tld/ubuntu distro component...

  • The first entry in the line defines the type of the archive. The archive type can be either deb or deb-src. Deb implies that the repository contains .deb packages while deb-src implies source packages.
  • The second entry is the repository URL.
  • The third entry specifies the distribution code name, such as beaver, xenial and so on.
  • The last entries are the repository components or categories. The default Ubuntu repositories are split into four components – main, restricted, universe and multiverse. Generally, third-party repositories have only one category.

The format for the files under the /etc/apt/sources.list.d/ directory is the same as for the regular sources.list file.

Most repositories are providing a public key to authenticate downloaded packages which need to be downloaded and imported.

To be able to add or remove a repository you need to be logged in as either a user with sudo access or root.

Usually, the instructions about how to enable a certain repository are included in the software documentation.

Installing add-apt-repository (add-apt-repository command not found )

add-apt-repository is a Python script that allows you to add an APT repository to either /etc/apt/sources.list or to a separate file in the /etc/apt/sources.list.d directory. The command can also be used to remove an already existing repository.

If the add-apt-repository is not available on your system you will get an error message saying “add-apt-repository command not found”.

The add-apt-repository utility is included in the software-properties-common package. To install it run the following commands:

sudo apt updatesudo apt install software-properties-common

Adding Repositories with add-apt-repository

The basic syntax of the add-apt-repository command is as follows:

add-apt-repository [options] repository

Where repository can be either a regular repository entry that can be added to the sources.list file like deb http://repo.tld/ubuntu distro component or a PPA repository in the ppa:<user>/<ppa-name> format.

To see all available options of the add-apt-repository command type man add-apt-repository in your terminal.

By default, on ubuntu 18.04 and newer the add-apt-repository will also update the package index if the repository public key is imported.

The package index is a database that holds records of available packages from the repositories enabled in your system.

Let’s say you want to install MongoDB from their official repositories.

 

First import the repository public key:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

Add the MongoDB repository using the command below.

sudo add-apt-repository 'deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse'

The repository will be appended to sources.list file.

You can now install any of the packages from the newly enabled repository:

sudo apt install mongodb-org

If for any reasons you want to remove a previously enabled repository, use the --remove option:

sudo add-apt-repository --remove 'deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse'

Adding PPA Repositories

Personal Package Archives (PPA) is a service that allows users to upload Ubuntu source packages that are built and published with Launchpad as an apt repository.

When adding a PPA repository the add-apt-repository command creates a new file under the /etc/apt/sources.list.d/ directory.

For example, to add the Jonathon F’s PPA which provides FFmpeg version 4.x you would run:

sudo add-apt-repository ppa:jonathonf/ffmpeg-4

When prompted press Enter an the repository will be enabled.

Press [ENTER] to continue or Ctrl-c to cancel adding it.

The PPA repository public key will be automatically downloaded and registered.

Once the PPA is added to your system you can install the repository packages:

sudo apt install ffmpeg

The apt command will install the package and all its dependencies.

Manually Adding Repositories

If you want to have more control over how your sources are organized you can manually edit the /etc/apt/sources.list file and add the apt repository line to the file.

For demonstration, we will enable the CouchDB repository and install the software. CouchDB is a free and open-source fault-tolerant NoSQL database maintained by the Apache Software Foundation.

To add the repository open the sources.list file with your text editor :

sudo nano /etc/apt/sources.list

Add the repository line to the end of the file:

/etc/apt/sources.list
deb https://apache.bintray.com/couchdb-deb bionic main

Instead of editing the file with a text editor you can use the following command to append the repository line to the sources.list file:

echo "deb https://apache.bintray.com/couchdb-deb $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list

$(lsb_release -cs) will print the Ubuntu codename. For example, if you have Ubuntu version 18.04 the command will print bionic.

Another option is to create a new the repository file under the /etc/apt/sources.list.d/ directory.

When manually configuring a repository you also need to manually import the public repository key to your system. To do that use either wget or curl :

curl -L https://couchdb.apache.org/repo/bintray-pubkey.asc | sudo apt-key add -

The command above should output OK which means that the GPG key has been successfully imported and packages from this repository will be considered trusted.

Before installing the packages from the newly added repository you must update the package index:

sudo apt update

Once the package index is updated you can install packages from the newly added repository:

sudo apt install couchdb

Conclusion

We have shown you how to add apt repositories in Ubuntu. The same instructions apply any Debian based distribution, including Kubuntu, Linux Mint and Elementary OS.

Feel free to leave a comment if you have any questions.

GOOGLE翻译
==========================================================================

使用 Ubuntu 软件中心或命令行实用程序(如 apt 或 apt-get)安装软件包时,软件包是从一个或多个 apt 软件存储库下载的。 APT 存储库是一个网络服务器或本地目录,其中包含可由 APT 工具读取的 deb 包和元数据文件。

虽然默认 Ubuntu 存储库中有数千个应用程序可用,但有时您可能需要从 3rd 方存储库安装软件。

在本教程中,我们将向您展示在 Ubuntu 和 Debian 系统上添加 apt 存储库的两种方法。第一种方法是使用 add-apt-repository 命令,第二种方法是使用文本编辑器手动添加存储库。

适当的来源
在 Ubuntu 和所有其他基于 Debian 的发行版上,apt 软件存储库在 /etc/apt/sources.list 文件或 /etc/apt/sources.list.d/ 目录下的单独文件中定义。

/etc/apt/sources.list.d/ 目录中的存储库文件的名称必须以 .list 结尾。

/etc/apt/sources.list 文件的一般语法采用以下格式:

deb http://repo.tld/ubuntu 发行版组件…
复制
行中的第一个条目定义存档的类型。归档类型可以是 deb 或 deb-src。 Deb 表示存储库包含 .deb 包,而 deb-src 表示源包。
第二个条目是存储库 URL。
第三个条目指定分发代码名称,例如beaver、xenial等。
最后的条目是存储库组件或类别。默认的 Ubuntu 存储库分为四个组件 – main、restricted、universe 和 multiverse。通常,第三方存储库只有一个类别。
/etc/apt/sources.list.d/ 目录下的文件格式与常规 sources.list 文件的格式相同。

大多数存储库都提供了一个公钥来验证需要下载和导入的下载包。

为了能够添加或删除存储库,您需要以具有 sudo 访问权限的用户或 root 用户身份登录。

通常,有关如何启用某个存储库的说明包含在软件文档中。

安装 add-apt-repository (add-apt-repository command not found )
add-apt-repository 是一个 Python 脚本,允许您将 APT 存储库添加到 /etc/apt/sources.list 或 /etc/apt/sources.list.d 目录中的单独文件。该命令还可用于删除已经存在的存储库。

如果您的系统上没有 add-apt-repository,您将收到一条错误消息,提示“找不到 add-apt-repository 命令”。

add-apt-repository 实用程序包含在 software-properties-common 包中。要安装它,请运行以下命令:

sudo apt 更新
sudo apt install software-properties-common
复制复制
使用 add-apt-repository 添加存储库
add-apt-repository 命令的基本语法如下:

add-apt-repository [选项] 存储库
复制
其中存储库可以是可以添加到 sources.list 文件(如 deb http://repo.tld/ubuntu 发行版组件)的常规存储库条目,也可以是 ppa:<user>/<ppa-name> 格式的 PPA 存储库.

要查看 add-apt-repository 命令的所有可用选项,请在终端中键入 man add-apt-repository。

默认情况下,在 ubuntu 18.04 和更新版本上,如果存储库公钥被导入,add-apt-repository 也会更新包索引。

包索引是一个数据库,它保存系统中启用的存储库中可用包的记录。

假设您想从他们的官方存储库安装 MongoDB。

首先导入存储库公钥:

sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 9DA31620334BD75D9DCB49F368818C72E52529D4
复制
使用以下命令添加 MongoDB 存储库。

sudo add-apt-repository ‘deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse’
复制
存储库将附加到 sources.list 文件。

您现在可以从新启用的存储库安装任何软件包:

sudo apt install mongodb-org
复制
如果出于任何原因要删除以前启用的存储库,请使用 –remove 选项:

sudo add-apt-repository –remove ‘deb [arch=amd64] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse’
复制
添加 PPA 存储库
Personal Package Archives (PPA) 是一项服务,允许用户上传使用 Launchpad 作为 apt 存储库构建和发布的 Ubuntu 源包。

添加 PPA 存储库时,add-apt-repository 命令会在 /etc/apt/sources.list.d/ 目录下创建一个新文件。

例如,要添加提供 FFmpeg 版本 4.x 的 Jonathon F 的 PPA,您将运行:

sudo add-apt-repository ppa:jonathonf/ffmpeg-4
复制
出现提示时按 Enter 将启用存储库。

按 [ENTER] 继续或 Ctrl-c 取消添加。
复制
PPA 存储库公钥将是自动的

Golang 1.13: 解决国内 go get 无法下载的问题

更新日期: 2020-03-06 阅读次数: 36511 字数: 197 分类: golang

下载并安装 go 1.13 之后,安装 golang gin 依赖包的时候,发现长时间没有响应,无法下载,从返回的错误信息看应该是国内无法访问 golang.org。

$ go get -u github.com/gin-gonic/gin

package golang.org/x/sys/unix: unrecognized import path "golang.org/x/sys/unix" (https fetch: Get https://golang.org/x/sys/unix?go-get=1: dial tcp 216.239.37.1:443: connect: connection refused)

解决办法

使用国内七牛云的 go module 镜像。

参考 https://github.com/goproxy/goproxy.cn。

golang 1.13 可以直接执行:

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

然后再次使用 go get 下载 gin 依赖就可以了。为七牛云点个赞。

阿里云 Go Module 国内镜像仓库服务

除了七牛云,还可以使用阿里云的 golang 国内镜像。

https://mirrors.aliyun.com/goproxy/

设置方法

go env -w GO111MODULE=on
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

golang 版本

> go version
go version go1.13 linux/amd64

tags: Golang 下载 gin 安装 超时

Window 下安装Redis服务

下载地址:https://github.com/MSOpenTech/redis/releases

Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 D:\Development_Tools\Redis

安装完成后,安装目录下大概会有以下几个文件:

redis-server.exe:服务端程序,提供redis服务

redis-cli.exe: 客户端程序,通过它连接redis服务并进行操作

redis-check-dump.exe:本地数据库检查

redis-check-aof.exe:更新日志检查

redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).

redis.windows.conf: 配置文件,将redis作为普通软件使用的配置,命令行关闭则redis关闭

redis.windows-service.conf:配置文件,将redis作为系统服务的配置,用以区别开两种不同的使用方式

查看及修改redis配置文件http://www.cnblogs.com/ningskyer/articles/5730611.html

打开cmd 窗口 使用cd命令切换目录到 D:\Development_Tools\Redis 运行

redis-server.exe redis.windows.conf

*注:可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。

输入之后,会显示如下界面:

这时候另启一个cmd窗口,原来的不要关闭,不然就无法访问服务端了。

安装服务

redis-server --service-install redis.windows.conf

OK,大功告成,看看本地的服务,是不是加入了Redis了。

启动服务(安装服务之后,Redis并没有启动):

redis-server --service-start

停止服务

redis-server --service-stop

测试:

切换到redis目录下运行

 redis-cli.exe -h 127.0.0.1 -p 6379

设置键值对 set myKey abc

取出键值对 get myKey

 

介绍一款好用的redis可视化工具:Redis Desktop Manager

下载地址:https://redisdesktop.com/download

 

参考文章1:http://www.runoob.com/redis/redis-install.html

参考文章2:http://www.cnblogs.com/ningskyer/articles/5730611.html

python定时爬取网站更新_详解python定时简单爬取网页新闻存入数据库并发送邮件…

于 2020-12-21 11:08:32 发布

一、项目要求

1、程序可以从北京工业大学首页上爬取新闻内容:http://www.bjut.edu.cn

 

2、程序可以将爬取下来的数据写入本地MySQL数据库中。

3、程序可以将爬取下来的数据发送到邮箱。

4、程序可以定时执行。

二、项目分析

1、爬虫部分利用requests库爬取html文本,再利用bs4中的BeaultifulSoup库来解析html文本,提取需要的内容。

2、使用pymysql库连接MySQL数据库,实现建表和插入内容操作。

3、使用smtplib库建立邮箱连接,再使用email库将文本信息加工成邮件消息并发送。

4、使用schedule库实现定时执行该程序。

三、代码分析

1、导入需要的库:

# 爬虫相关模块

import requests

from bs4 import BeautifulSoup

import pymysql

# 发邮件相关模块

import smtplib

from email.mime.text import MIMEText

from email.header import Header

import time

# 定时模块

import schedule

2、获取html文件:

# 连接获取html文本

def getHTMLtext(url):

try:

headers={undefined

“user-agent”:”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36″,

} # 浏览器请求头

r = requests.get(url, headers = headers, timeout = 30) # 获取连接

r.raise_for_status() # 测试连接是否成功,若失败则报异常

r.encoding = r.apparent_encoding # 解析编码

return r.text

except:

return “”

其中必须添加请求头headers否则get请求时会返回错误页面。

raise_for_status()可以根据状态码判断连接对象的状态,如果成功便继续执行,若连接失败则抛出异常,因此利用try-except捕获。

apparent_encoding()方法可以解析判断可能的编码方式。

3、解析html提取数据:

首先观察网页源码确定新闻标签位置:

 

# 解析html提取数据

def parseHTML(news, html):

soup = BeautifulSoup(html, “html.parser”) # 获取soup

for i in soup.find(attrs = {‘class’ : ‘list’}).find_all(‘li’): # 存放新闻的li标签

date = i.p.string + ‘-‘ + i.h2.string # 日期

href = i.a[‘href’] # 链接

title = i.find(‘h1’).string # 标题

content = i.find_all(‘p’)[1].string # 梗概

news.append([date, href, title, content]) # 添加到列表中

可见所有新闻内容全部存放在class为”list”的div标签中,而每条新闻又存放在li标签中,因此利用find和find_all方法遍历所有li标签。

每个li标签中a标签的href属性存放新闻链接,h1标签存放新闻标题,h2标签存放日期,第一个p标签存放年、月,第二个p标签存放新闻梗概。依次取出对应标签中的文本内容,并将年月日拼接后依次存入news列表中。

4、存入数据库

# 存入数据库

def toMysql(news):

conn = pymysql.connect(host = ‘localhost’, port = 3306, user = ‘root’, passwd = ‘数据库密码’, db = ‘数据库名称’,charset = ‘gbk’, connect_timeout = 1000)

cursor = conn.cursor()

sql = ”’

create table if not exists tb_news(

日期 date,

链接 varchar(400),

标题 varchar(400),

梗概 varchar(400))

”’

cursor.execute(sql) # 建表

for new in news: # 循环存入数据

sql = ‘insert into tb_news(日期, 链接, 标题, 梗概) values(%s, %s, %s, %s)’

date = new[0]

href = new[1]

title = new[2]

content = new[3]

cursor.execute(sql, (date, href, title, content))

conn.commit()

conn.close()

由于新闻字数较多,存取时可能会有乱码以及数据过长存储失败的问题,与数据库编码有关,可以在MySQL的my.ini配置文件中修改默认编码为gbk。

5、发送邮件

# 发送邮件

def sendMail(news):

from_addr = ‘发送邮箱’ # 发送邮箱

password = ’16位授权码’ # 邮箱授权码

to_addr = ‘接收邮箱’ # 接收邮箱

mailhost = ‘smtp.qq.com’ # qq邮箱的smtp地址

qqmail = smtplib.SMTP() # 建立SMTP对象

qqmail.connect(mailhost, 25) # 25为SMTP常用端口

qqmail.login(from_addr, password) # 登录邮箱

content = ”

for new in news: # 拼接邮件内容字符串

content += ‘新闻时间:’ + new[0] + ‘\n’ + ‘新闻链接:’ + new[1] + ‘\n’ + ‘新闻标题:’ + new[2] + ‘\n’ + ‘新闻梗概:’ + new[3] + ‘\n’

content += ‘======================================================================\n’

# 拼接题目字符串

subject = time.strftime(‘%Y-%m-%d %X’, time.localtime(time.time())) + ‘时爬取的北工大首页主要新闻\n’

# 加工邮件message格式

msg = MIMEText(content, ‘plain’, ‘utf-8’)

msg[‘subject’] = Header(subject, ‘utf-8’)

try:

qqmail.sendmail(from_addr, to_addr, msg.as_string())

print(‘发送成功’)

except:

print(‘发送失败’)

qqmail.quit()

注意其中的密码不是指邮箱的登录密码,而是指邮箱的smtp授权码,qq邮箱可以再设置中开启smtp服务,并获取授权码。

 

6、主函数

# 主函数

def main():

news = []

url = “http://www.bjut.edu.cn/”

html = getHTMLtext(url)

parseHTML(news, html)

toMysql(news)

print(news)

sendMail(news)

输入北京工业大学官网的url并新建一个列表news用来存放消息,然后依次调用函数爬取新闻存入数据库并发到邮箱。为了检验上述程序是否可以完成任务,先调用依次main()函数并print(news)看看结果:

main() #测试需要,之后会删除

结果如下:

 

 

 

由此可见程序执行正常。

7、定时执行

# 定时执行整个任务

schedule.every().monday.at(“08:00”).do(main) # 每周一早上八点执行main函数

while True:

schedule.run_pending()

time.sleep(1)

用死循环保证schedule一直运行。设定的是每周一早上8:00执行程序。

为了方便检查效果,先将运行时间改为每5s运行一次:

schedule.every(5).seconds.do(main)

 

每5s便可以收到一封邮件,由此可见满足定时需求。至此程序结束。

四、完整代码

# 爬虫相关模块

import requests

from bs4 import BeautifulSoup

import pymysql

# 发邮件相关模块

import smtplib

from email.mime.text import MIMEText

from email.header import Header

import time

# 定时模块

import schedule

# 连接获取html文本

def getHTMLtext(url):

try:

headers={undefined

“user-agent”:”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36″,

} # 浏览器请求头

r = requests.get(url, headers = headers, timeout = 30) # 获取连接

r.raise_for_status() # 测试连接是否成功,若失败则报异常

r.encoding = r.apparent_encoding # 解析编码

return r.text

except:

return “”

# 解析html提取数据

def parseHTML(news, html):

soup = BeautifulSoup(html, “html.parser”) # 获取soup

for i in soup.find(attrs = {‘class’ : ‘list’}).find_all(‘li’): # 存放新闻的li标签

date = i.p.string + ‘-‘ + i.h2.string # 日期

href = i.a[‘href’] # 链接

title = i.find(‘h1’).string # 标题

content = i.find_all(‘p’)[1].string # 梗概

news.append([date, href, title, content]) # 添加到列表中

# 存入数据库

def toMysql(news):

conn = pymysql.connect(host = ‘localhost’, port = 3306, user = ‘root’, passwd = ‘数据库密码’, db = ‘数据库名称’,charset = ‘gbk’, connect_timeout = 1000)

cursor = conn.cursor()

sql = ”’

create table if not exists tb_news(

日期 date,

链接 varchar(400),

标题 varchar(400),

梗概 varchar(400))

”’

cursor.execute(sql) # 建表

for new in news: # 循环存入数据

sql = ‘insert into tb_news(日期, 链接, 标题, 梗概) values(%s, %s, %s, %s)’

date = new[0]

href = new[1]

title = new[2]

content = new[3]

cursor.execute(sql, (date, href, title, content))

conn.commit()

conn.close()

# 发送邮件

def sendMail(news):

from_addr = ‘发送邮箱’ # 发送邮箱

password = ’16位授权码’ # 邮箱授权码

to_addr = ‘接收邮箱’ # 接收邮箱

mailhost = ‘smtp.qq.com’ # qq邮箱的smtp地址

qqmail = smtplib.SMTP() # 建立SMTP对象

qqmail.connect(mailhost, 25) # 25为SMTP常用端口

qqmail.login(from_addr, password) # 登录邮箱

content = ”

for new in news: # 拼接邮件内容字符串

content += ‘新闻时间:’ + new[0] + ‘\n’ + ‘新闻链接:’ + new[1] + ‘\n’ + ‘新闻标题:’ + new[2] + ‘\n’ + ‘新闻梗概:’ + new[3] + ‘\n’

content += ‘======================================================================\n’

# 拼接题目字符串

subject = time.strftime(‘%Y-%m-%d %X’, time.localtime(time.time())) + ‘时爬取的北工大首页主要新闻\n’

# 加工邮件message格式

msg = MIMEText(content, ‘plain’, ‘utf-8’)

msg[‘subject’] = Header(subject, ‘utf-8’)

try:

qqmail.sendmail(from_addr, to_addr, msg.as_string())

print(‘发送成功’)

except:

print(‘发送失败’)

qqmail.quit()

# 主函数

def main():

news = []

url = “http://www.bjut.edu.cn/”

html = getHTMLtext(url)

parseHTML(news, html)

print(news)

sendMail(news)

# 定时执行整个任务

schedule.every().monday.at(“08:00”).do(main) # 每周一早上八点执行main函数

while True:

schedule.run_pending()

time.sleep(1)

相关文章
————————————————
版权声明:本文为CSDN博主「weixin_39997695」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39997695/article/details/111783667

python程序定时或隔时运行

python怎么设置每隔几秒执行脚本?

python设置每隔几秒执行脚本的方法:

1、利用python死循环实现每10s执行一次脚本

#!/usr/bin/env python
import os,time
#how to run it?
#nohup python -u example.py >> /data/logs/example.log 2>&1 &
while True:
        os.system('command')//执行系统命令
        time.sleep(10)//推迟执行、休眠

2、设置1-10s执行一次脚本

#!/usr/bin/env python
import os,time,random
#how to run it?
#nohup python -u example.py >> /data/logs/example.log 2>&1 &
while True:
        sleeptime=random.randint(0, 10)//1-10随机数
        os.system('command')
        time.sleep(sleeptime)

更多Python知识请关注Python自学网

给定需要的时间执行此函数,每隔5秒执行一次的完整代码如下

import time

def sleeptime(hour, min, sec):
return hour * 3600 + min * 60 + sec

second = sleeptime(0, 0, 5)
while 1 == 1:
time.sleep(second)
print(‘do action’)
# 这是隔5秒执行一次
————————————————
版权声明:本文为CSDN博主「夕闻」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43207144/article/details/110367052

python每天定时9点执行_Python实现定时任务,定时采集数据,定时执行脚本程序都可以…

写后端的同学们可能都知道,工作中可能需要周期性执行一些任务,俗称定时任务。Linux环境下,可以借助于系统自带的crontab完成定时任务。但是很多时候,开发的同学们可能并没有权限去操作crontab,所以就催生了一些不太好的解决方案,比如基于Python/Java里面的Timer去弄一个周期性执行的工具。

很多人学习python,不知道从何学起。

很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。

很多已经做案例的人,却不知道如何去学习更加高深的知识。

那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!

大佬们,醒醒,主角出场了。今天给大家分享一个Python轻量级定时任务解决方案,schedule,可以满足常用的周期性任务需求。

安装

pipinstall schedule

使用

schedule提供了多种方法去描述执行周期,比如:

#1,按照某个时间间隔

every(10).seconds.do(task),表示每隔10秒执行task任务。当然可以把间隔换成其他单位,比如minutes,hours,days

#2,按照一个固定的时间点

every().day.at(‘9:30’).do(task),表示每天9:30执行任务

#encoding=utf-8

fromdatetimeimportdatetime

importtime

importschedule

defjob1(*args):

withopen(‘tasks’,’a’)asf:

f.write(‘[{}]{}\n’.format(datetime.now().strftime(‘%Y-%m-%d %H:%M:%S.%f’),’msg’))

# 每隔5秒执行一次job1

schedule.every(5).seconds.do(job1)

# 每天9:30执行任务

schedule.every().day.at(’09:30′).do(job1)

if__name__ ==’__main__’:

whileTrue:

schedule.run_pending()

time.sleep(1)

效果

如何让任务只执行一次?

只需要在任务最后加上这句话就行,return schedule.CancelJob

#encoding=utf-8

fromdatetimeimportdatetime

importtime

importscheduledef job_run_once(*args):

print(‘Job run only once’)

#

returnschedule.CancelJob

# 只执行一次任务

schedule.every(3).seconds.do(job_run_once)

if__name__ ==’__main__’:

whileTrue:

schedule.run_pending()

time.sleep(1)

就是这么简单,你学会了吗?

  • 实现定时刷新
from time import sleep
from selenium import webdriver
driver= webdriver.Chrome() #  需要 下载 对应浏览器 驱动到 python 安装目录
driver.get("https://blog.csdn.net/qq_27061049/article/details/90577597") # 刷新网址
for i in range(10000): # 刷新次数
    driver.refresh()  # 刷新网页
    sleep(5) # 五秒一次