文档章节

【转】杰奇 jieqi 多线程自动采集同步源站 python源码

mayahs
 mayahs
发布于 2016/08/27 14:07
字数 1061
阅读 188
收藏 0

该工具为python代码,对目标源站进行循环采集,同步更新。
采用多线程采集,保证采集速度。采集线程数可根据自己服务器压力自由调整。
采用小说字数比对,仅当当前字数大于已采集字数时才认为该小说有章节更新而进行采集,从而减少不必要的资源浪费。
测试目标站为17K小说网,自己使用的时候请配合自己网站后台规则修改siteid。同时根据目标列表页的代码,修改正则规则。
该正则规则获取3个参数 [0]为书号 [1]为书名 [2]为采集时候的字数。

使用本工具后,无需使用关关等采集器,可以做到单Linux服务器运行小说站。
使用本工具的小说站演示:武林书盟

#!coding=UTF-8
#######VPSKK.com原创作品,转载请注明出处##########
import urllib
import urllib2
import commands
import time
import threading
import os
import re
import sys

thlen = 10
#定义同时采集的线程数
books = []
#定义需要采集的书库
tsk = []
#定义采集线程数组
bookdict = {}
#定义已采集图书字典,key为目标站书号,value为字数
domain = ‘www.vpskk.com’
adminuser = ‘admin’
adminpass = ‘******’
siteid = ’23’
# notaddnew = ‘0’

frompage = ‘http://all.17k.com/lib/book/2_0_0_0_0_0_2_0_1.html’

def addbooklist():
while 1:
time.sleep(30)
print ‘[‘ + time.strftime(‘%H:%M:%S’) + ‘] 采集更新列表线程启动。’
start = time.time()
try:
response = urllib2.urlopen(frompage, timeout = 12)
content = response.read()
except:
continue
response.close()
elapsed = (time.time() – start)
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)
print ‘[‘ + time.strftime(‘%H:%M:%S’) + ‘] 采集更新列表结束,用时:’ + str(elapsed) + ‘秒’
for ii in range(len(bookattr)):
newbookid = bookattr[ii][0]
newbookname = bookattr[ii][1]
newbooksize = bookattr[ii][2]
inlist = False
for tt in range(len(books)):
if (books[tt][0]==newbookid):
inlist = True
if not inlist:
#书号不在待采集数组里
if (newbookid in bookdict.keys()):
#书号在已采集过的字典里(需要根据字数来判断是否有更新)
if (int(newbooksize)>int(bookdict[newbookid])):
#采集到书籍字数大于已采集字典里的字数(添加到待采集列表)
books.append([newbookid,newbookname,newbooksize])
print ‘书号:’ + newbookid + ‘有更新,旧字数:’+ bookdict[newbookid] + ‘ 新字数:’+ newbooksize + ‘ 添加到待采集列表。’
else:
#书号不在已采集过的字典里(添加到待采集列表)
books.append([newbookid,newbookname,newbooksize])
print ‘书号:’ + newbookid + ‘最近未采集,添加到待采集列表。’
print ‘[‘ + time.strftime(‘%H:%M:%S’) + ‘] 采集更新列表线程完成,线程休眠。’
def caiji(bookid,bookname,booksize):
print ‘正在采集 书号[‘ + bookid + ‘] 书名:’ + bookname
url = ‘http://’+ domain + ‘/modules/article/admin/batchcollect.php?action=bcollect&siteid=’ + siteid + ‘&batchids=’ + bookid + ‘&jieqi_username=’ + adminuser + ‘&jieqi_userpassword=’ + adminpass
start = time.time()
page = urllib2.urlopen(url,timeout=3600)
data = page.read(8192)
while data:
data = page.read(8192)
page.close()
elapsed = (time.time() – start)
time.sleep(5) #采集完等5秒生成全书
print ‘书号[‘ + bookid + ‘] 书名:’ + bookname + ‘字数:’ + booksize + ‘k 采集完成! 用时:’ + str(elapsed) + ‘秒’
print ‘书号[‘ + bookid + ‘] 书名:’ + bookname + ‘字数:’ + booksize + ‘k 添加到最近采集书目字典。’
# 从网页获取要采集的文章ID和文章名字(首次)
start = time.time()
response = urllib2.urlopen(frompage, timeout = 12)
content = response.read()
response.close()
elapsed = (time.time() – start)
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)
#getsize = re.findall(r’<td class=\"td5\">([0-9]+)</td>’,content,re.M)
print ‘首次获取要采集的文章共’ + str(len(getattr)) +’篇,用时:’ + str(elapsed) + ‘秒’
books = books + getattr
if (len(books)<3):
print(‘获取列表页失败,退出!’)
exit()

#启动书籍列表采集线程
thaddbooklist = threading.Thread(target=addbooklist,name=’taddbooklist’)
thaddbooklist.start()

for x in range(thlen):
bookid = books[0][0]
bookname = books[0][1]
booksize = books[0][2]
tname = ‘t’ + str(x)
th = threading.Thread(target=caiji,name=tname,args=(bookid,bookname,booksize))
th.start()
del books[0]
bookdict[bookid] = booksize
tsk.append(th)

#检测空闲线程,当线程闲置时,若待采集列表不为空时,启用该线程进行采集
while 1:
time.sleep(5)
for i in range(len(tsk)):
if not tsk[i].is_alive():
print tsk[i].name + ‘线程空闲’
if len(books) > 0:
bookid = books[0][0]
bookname = books[0][1]
booksize = books[0][2]
th = threading.Thread(target=caiji,name=tsk[i].name,args=(bookid,bookname,booksize))
th.start()
del books[0]
bookdict[bookid] = booksize
tsk[i] = th

该工具为本站原创作品,转载请注明出处:VPS看客网 http://www.vpskk.com

本文转载自:http://www.vpskk.com

mayahs
粉丝 2
博文 6
码字总数 4774
作品 0
无锡
私信 提问
【转】jieqi 1.8 调出后台采集的方法

很多做小说站的人都还在用很多年前的jieqi1.7版本,最近流出了jieqi1.8。 但是发现,后台采集没有了。 我自己当时也是傻眼了,于是开始和1.7对比文件,发现几个采集的相关文件都还在,但是为...

mayahs
2016/08/31
47
0
最新小说网站源码 带会员系统 带3个wap端 火车头自动采集+网页采集

最新小说网站源码 带会员系统 带3个wap端 火车头自动采集+网页采集 笔趣阁:www.xs.520jun.com 自适应手机端:http://www.xs.520jun.com/wap/ 触屏版手机端:http://www.xs.520jun.com/wapt...

myjnt
2018/05/13
0
0
关于PHP批量采集----采集小说站有感

概况:帮周同学做小说采集做了有一段时间了。一开始是从其它网站的页面上直接写正则去采集,然后慢慢的转为采集别人提供的API。 环境:CENTOS+NGINX+PHP5.2.17。基于JIEQI小说管理系统。 直接...

jacky_chen
2013/06/24
0
4
13行代码实现:Python实时视频采集(附源码)

13行代码实现:Python实时视频采集(附源码) 一、前言 本文是《人脸识别完整项目实战》系列博文第3部分:程序设计篇(Python版),第1节《Python实时视频采集程序设计》,本章内容系统介绍:...

优惠码领取
04/08
0
0
[转]用python爬虫抓站的一些技巧总结

学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想...

qkhh
2014/03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

阿里云POLARDB如何助力轻松筹打造5亿用户信赖的大病筹款平台?

轻松筹首创了“大病救助”模式,帮助了众多病患在第一时间解決了医疗资金等问题,为了从源头解决了医疗资金问题。而在轻松筹这样全球5.5亿用户信赖的大病筹款平台的背后,是日益增长的各种数...

阿里云云栖社区
6分钟前
1
0
Confluence 6 在升级过程中查看合并日志

为了监控升级的过程,你应该查看 application log 日志中的输出。 通常日志经常将会显示多个日志实例,这个实例是定义在日志的 INFO 级别的,通常格式如下: WikiToXhtmlMigrationThread-n -...

honeymoose
6分钟前
0
0
git diff 文件对比

git diff filepath 工作区与暂存区比较 git diff HEAD filepath 工作区与HEAD ( 当前工作分支) 比较 git diff --staged 或 --cached filepath 暂存区与HEAD比较 git diff branchName filepa......

李佳顺
6分钟前
0
0
spring mvc 定制化配置

spring mvc 自定义配置 1.实现某些接口,然后让上面的类加载进去. class MyHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean......

最爱肉肉
9分钟前
0
0
OSG_采样像机的内容如果不显示到窗口上

cameraLight->setRenderTargetImplementation(Camera::FRAME_BUFFER_OBJECT);// 这句使内容不渲染到屏幕上cameraLight->setRenderOrder(Camera::PRE_RENDER); 1.setRenderTargetImplement......

洛克人杰洛
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部