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

news/2024/7/19 10:50:23 标签: python, 爬虫, php

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

该工具为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

转载于:https://my.oschina.net/u/992969/blog/738685


http://www.niftyadmin.cn/n/1586602.html

相关文章

APP开发 --- Dcloud初识

APP的分类 主流的四大APP系统: 1、苹果ios系统版本,开发语言是Objective-C; 2、微软Windows phone系统版本,开发语言是C#; 3、安卓Android系统版本,开发语言是Java; 4、塞班symbian系统版本&am…

NTVS:把Visual Studio变成Node.js IDE 的工具

NTVS(Node.js Tools for Visual Studio) 运行于VS2012或者VS2013。一些node.js的爱好者已经从PTVS(Python Tools for Visual Studio)转向并开始为VS做些node工具。同时,PTVS团队也在node.js整合上下功夫,于是他们都专注于NTVS使之成为一个社区项目。NTVS…

APP开发 --- mui框架

什么是Hbuilder? Dcloud(数字天堂)推出一款支持HTML5的Web开发IDE。Hbuilder的特点? “快是Hbuilder的最大优势,通过完整的语法提示和代码输入法、代码块很多配套,能大幅提升HTML、js、css的开发效率。”…

break和continue的理解

break终止当前循环,跳出循环体a"unics" answerinput("一句话:") while True:if answera:breakanswerinput("再次输入:") print("答对了")#continue终止本轮循环,并执行下一轮循环for i i…

APP --- 生成xml和json数据

APP接口介绍 APP(通信)接口定义: 接口地址:http://yzm.sinaapp.com/list.php?formatxml 接口文件:(list.php处理一些业务逻辑) 接口数据:xml和json APP通信格式之xml: …

【HAOI2006】【BZOJ1051】【p1233】最受欢迎的牛

BZOJ难得的水题(其实是HA太弱了) 原题: 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。 这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢…

Python --入门小程序

1、输入某年某月某日,判断这一天是这一年中的第几天? import datetime dtstr input(Enter the datetime:(20191219):) dt datetime.datetime.strptime(dtstr,"%Y%m%d") another_dtstr dtstr[:4]0101 another_dt datetime.datetime.strptime(another…

《关爱码农成长计划》第一期报告

前言 程序员一直都是一个备受人们关注的群体。2014年,据IDC统计,全球约有1850万名程序员,中国占10%。随着近年全国互联网创业热潮的兴起,“互联网”、“云计算”以及“智能硬件”等领域发展迅速,市场对程序员的需求更为…