全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
查看: 11978|回复: 45
打印 上一主题 下一主题

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

  [复制链接]
跳转到指定楼层
1#
发表于 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 赞一个!

查看全部评分

45#
发表于 2015-9-17 02:57:13 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
44#
发表于 2015-9-16 23:32:58 | 只看该作者
这个没有17K的VIP也能采集??
42#
发表于 2015-9-16 20:28:51 | 只看该作者
好像很厉害的样子
38#
 楼主| 发表于 2015-9-14 11:06:13 来自手机 | 只看该作者
只要弄个后台规则就可以用了。。都到这里了还要啥搭配。。。。
37#
发表于 2015-9-14 10:43:43 | 只看该作者
要搭配用 只有个脚本无从下手
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-10-2 01:15 , Processed in 0.628231 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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