全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 10956|回复: 45

【python】放出杰奇后台全自动多线程采集,同步目标站最...

  [复制链接]
发表于 2015-9-12 10:46:51 | 显示全部楼层 |阅读模式
本帖最后由 jsenet 于 2015-9-13 13:02 编辑

以前就弄好了,忘了放出来,懂的拿去用吧。
多线程采集,字数对比,目标站更新一版30秒内同步。

转载注明作者:vpskk.com(还未上线,嘿嘿)   

  1. #!coding=UTF-8
  2. import urllib
  3. import urllib2
  4. import commands
  5. import time
  6. import threading
  7. import os
  8. import re
  9. import sys

  10. thlen = 10
  11. #定义同时采集的线程数
  12. books = []
  13. #定义需要采集的书库
  14. tsk = []
  15. #定义采集线程数组
  16. bookdict = {}
  17. #定义已采集图书字典,key为目标站书号,value为字数


  18. domain = 'yoursite.domain.com'
  19. adminuser = 'admin'
  20. adminpass = '******'
  21. siteid = '23'
  22. # notaddnew = '0'

  23. frompage = 'http://all.17k.com/lib/book/2_0_0_0_0_0_2_0_1.html'



  24. def addbooklist():
  25.     while 1:
  26.         time.sleep(30)
  27.         print '[' + time.strftime('%H:%M:%S')  + '] 采集更新列表线程启动。'
  28.         start = time.time()
  29.         try:
  30.             response = urllib2.urlopen(frompage, timeout = 12)
  31.             content = response.read()
  32.         except:
  33.             continue
  34.         response.close()
  35.         elapsed = (time.time() - start)
  36.         bookattr = re.findall(r'<a class="jt" rel="/tip\.xhtml\?book\.id=([0-9]+)\&difference[^>]+>([^<]+)</a>*[\s\S]*?<td class="td5">([0-9]+)</td>',content,re.M)
  37.         print '[' + time.strftime('%H:%M:%S')  + '] 采集更新列表结束,用时:' + str(elapsed) + '秒'
  38.         for ii in range(len(bookattr)):
  39.             newbookid = bookattr[ii][0]
  40.             newbookname = bookattr[ii][1]
  41.             newbooksize = bookattr[ii][2]
  42.             inlist = False
  43.             for tt in range(len(books)):
  44.                 if (books[tt][0]==newbookid):
  45.                     inlist = True
  46.             if not inlist:
  47.             #书号不在待采集数组里
  48.                 if (newbookid in bookdict.keys()):
  49.                 #书号在已采集过的字典里(需要根据字数来判断是否有更新)
  50.                     if (int(newbooksize)>int(bookdict[newbookid])):
  51.                     #采集到书籍字数大于已采集字典里的字数(添加到待采集列表)
  52.                         books.append([newbookid,newbookname,newbooksize])
  53.                         print '书号:' + newbookid + '有更新,旧字数:'+ bookdict[newbookid] + ' 新字数:'+ newbooksize + '  添加到待采集列表。'
  54.                 else:
  55.                 #书号不在已采集过的字典里(添加到待采集列表)
  56.                     books.append([newbookid,newbookname,newbooksize])
  57.                     print '书号:' + newbookid + '最近未采集,添加到待采集列表。'
  58.         print '[' + time.strftime('%H:%M:%S')  + '] 采集更新列表线程完成,线程休眠。'


  59. def caiji(bookid,bookname,booksize):
  60.         print '正在采集 书号[' + bookid + '] 书名:' + bookname   
  61.         url = 'http://'+ domain + '/modules/article/admin/batchcollect.php?action=bcollect&siteid=' + siteid + '&batchids=' + bookid + '&jieqi_username=' + adminuser + '&jieqi_userpassword=' + adminpass
  62.         start = time.time()
  63.         page = urllib2.urlopen(url,timeout=3600)
  64.         data = page.read(8192)
  65.         while data:
  66.            data = page.read(8192)
  67.         page.close()
  68.         elapsed = (time.time() - start)
  69.         time.sleep(5) #采集完等5秒生成全书
  70.         print '书号[' + bookid + '] 书名:' + bookname + '字数:' + booksize + 'k 采集完成! 用时:' + str(elapsed) + '秒'
  71.         print '书号[' + bookid + '] 书名:' + bookname + '字数:' + booksize + 'k 添加到最近采集书目字典。'


  72. # 从网页获取要采集的文章ID和文章名字(首次)   
  73. start = time.time()
  74. response = urllib2.urlopen(frompage, timeout = 12)
  75. content = response.read()
  76. response.close()
  77. elapsed = (time.time() - start)
  78. getattr = re.findall(r'<a class="jt" rel="/tip\.xhtml\?book\.id=([0-9]+)\&difference[^>]+>([^<]+)</a>*[\s\S]*?<td class="td5">([0-9]+)</td>',content,re.M)
  79. #getsize = re.findall(r'<td class="td5">([0-9]+)</td>',content,re.M)
  80. print '首次获取要采集的文章共' + str(len(getattr)) +'篇,用时:' + str(elapsed) + '秒'
  81. books = books + getattr
  82. if (len(books)<3):
  83.     print('获取列表页失败,退出!')
  84.     exit()

  85. #启动书籍列表采集线程
  86. thaddbooklist = threading.Thread(target=addbooklist,name='taddbooklist')   
  87. thaddbooklist.start()
  88.    
  89. for x in range(thlen):
  90.     bookid = books[0][0]
  91.     bookname = books[0][1]
  92.     booksize = books[0][2]
  93.     tname = 't' + str(x)
  94.     th = threading.Thread(target=caiji,name=tname,args=(bookid,bookname,booksize))
  95.     th.start()
  96.     del books[0]
  97.     bookdict[bookid] = booksize
  98.     tsk.append(th)

  99. #检测空闲线程,当线程闲置时,若待采集列表不为空时,启用该线程进行采集
  100. while 1:
  101.     time.sleep(5)
  102.     for i in range(len(tsk)):
  103.         if not tsk[i].is_alive():
  104.             print tsk[i].name + '线程空闲'
  105.             if len(books) > 0:
  106.                 bookid = books[0][0]
  107.                 bookname = books[0][1]
  108.                 booksize = books[0][2]
  109.                 th = threading.Thread(target=caiji,name=tsk[i].name,args=(bookid,bookname,booksize))
  110.                 th.start()
  111.                 del books[0]
  112.                 bookdict[bookid] = booksize
  113.                 tsk[i] = th
复制代码



效果演示:同步17k,当然,我只采集VIP小说。后台挂着,只要17k有vip小说更新,则自动同步。
caiji.png (124.12 KB, 下载次数: 11)

评分

参与人数 1威望 +25 收起 理由
欧阳逍遥 + 25 赞一个!

查看全部评分

发表于 2015-9-12 10:47:52 | 显示全部楼层
帮顶下,  虽然什么都看不懂,

点评

搭车出售python.cc,2888不议价  发表于 2015-9-16 21:51
发表于 2015-9-12 10:50:33 | 显示全部楼层
很需要,但是要研究下怎么用
 楼主| 发表于 2015-9-12 10:51:53 | 显示全部楼层
配合后台采集规则。当然 这个py里的那个获取源站列表的正则要自己改下。
其他全自动了。
发表于 2015-9-12 10:52:33 | 显示全部楼层
谢谢楼主啊
 楼主| 发表于 2015-9-12 10:54:39 | 显示全部楼层
比crontab后台采集好处很多:
1.crontab你不能确定采集一次要多长时间,会重复采集造成章节出错。
2.多线程,速度远快于用crontab
3.字数比对,不用浪费时间去检测。
4.因为带了比对和多线程,采集间隔我设置是30秒检测,这样源站一旦更新,30秒内就能同步。

其他自己体会吧,这个是我自己小说站写的,放弃关关
发表于 2015-9-12 10:55:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2015-9-12 10:58:59 | 显示全部楼层
天也就这么大 发表于 2015-9-12 10:55
还是看不懂,用关关不是好很多吗

实测,采集效率比关关高的多。

当然还有个很重要的原因,用这个,则不需要windows,全linux做个小说站不是很酷炫吗?

windows用关关,我挺怕毒的
发表于 2015-9-12 11:01:01 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| 发表于 2015-9-12 11:01:56 | 显示全部楼层
补充运行输出:

[11:10:44] 采集更新列表线程启动。
[11:10:45] 采集更新列表结束,用时:0.368046998978秒
书号:1257715无更新,旧字数:508549 新字数:508549  忽略。
书号:437108无更新,旧字数:3070245 新字数:3070245  忽略。
书号:590918无更新,旧字数:3810696 新字数:3810696  忽略。
书号:620124无更新,旧字数:4076192 新字数:4076192  忽略。
书号:751367无更新,旧字数:483636 新字数:483636  忽略。
书号:1025286无更新,旧字数:1010276 新字数:1010276  忽略。
书号:1209867无更新,旧字数:402752 新字数:402752  忽略。
书号:1236313无更新,旧字数:412536 新字数:412536  忽略。
书号:1248996无更新,旧字数:624019 新字数:624019  忽略。
书号:1069691无更新,旧字数:632495 新字数:632495  忽略。
书号:1238897无更新,旧字数:1446324 新字数:1446324  忽略。
书号:450860无更新,旧字数:5390083 新字数:5390083  忽略。
书号:963814无更新,旧字数:2842104 新字数:2842104  忽略。
书号:1044983无更新,旧字数:862496 新字数:862496  忽略。
书号:1178582无更新,旧字数:1016061 新字数:1016061  忽略。
书号:1255119无更新,旧字数:616432 新字数:616432  忽略。
书号:864061无更新,旧字数:3370699 新字数:3370699  忽略。
书号:1274700无更新,旧字数:420318 新字数:420318  忽略。
书号:1023720无更新,旧字数:1166304 新字数:1166304  忽略。
书号:1294239无更新,旧字数:427892 新字数:427892  忽略。
书号:957915无更新,旧字数:2136523 新字数:2136523  忽略。
书号:1277060无更新,旧字数:402957 新字数:402957  忽略。
书号:1249950无更新,旧字数:474150 新字数:474150  忽略。
书号:1031064无更新,旧字数:1588539 新字数:1588539  忽略。
书号:1045140无更新,旧字数:420024 新字数:420024  忽略。
书号:1085231无更新,旧字数:1275791 新字数:1275791  忽略。
书号:1151002无更新,旧字数:591414 新字数:591414  忽略。
书号:947110无更新,旧字数:394048 新字数:394048  忽略。
书号:1027863无更新,旧字数:1080509 新字数:1080509  忽略。
书号:1190382无更新,旧字数:750707 新字数:750707  忽略。
[11:10:45] 采集更新列表线程完成,线程休眠。
t0线程空闲
t1线程空闲
t2线程空闲
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-25 16:01 , Processed in 0.101317 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表