网站内容采集(主营业务包含网站建设,小程序开发,网络推广 )
优采云 发布时间: 2021-12-05 23:23网站内容采集(主营业务包含网站建设,小程序开发,网络推广
)
主营业务包括网站建设、APP开发、小程序开发、网络推广、SEO优化,网页编辑难免需要帮助客户进行一些网站维护操作,但各行业特点这是不同的。每次我们的同事帮客户维护网站,都需要获取大量的素材。基于图像的材料易于处理。直接去百度图片找,但是文字内容不好处理。
我们的网页编辑过去常常去一些客户的同行网站采集相关资料,然后稍微整理一下。但是,这种方法需要大量的人力,而且完全没有技巧可言。纯手工操作;有鉴于此,我们的程序开发者使用python编写了一个多线程脚本工具对采集网站段落内容进行分页,并根据设置的参数采集@自动指定网站 >,提取网站上的段落内容,保存到本机。为方便起见,现公布相关代码。转载请注明出处!
#!/usr/bin/python
import json
import os
import requests
import threading
import re
import time
import sys
import colorama
colorama.init(autoreset=True)
#打开文件
with open('config.json','r') as f:
data = json.load(f)
f.close()
def toInt(num):
if num !='':
return int(num)
else:
return 0
thead_count = 0 #待结束的进程数
start_ = toInt(data['start']) #分页起始值
end_ = toInt(data['end']) #分页结束值
url_ = data['url'] #入口地址
urlinclude = data['urlinclude'] #URL必须包含的字符
urlunclude = data['urlunclude'] #URL不能包含的字符
textinclude = data['textinclude'] #内容中必须包含的内容
textunclude = data['textunclude'] #内容中不能包含的字符
textreplace = data['textreplace'] #需要过滤的字符
textminsize = toInt(data['textminsize']) #有效段落的最少字符数
textmaxsize = toInt(data['textmaxsize']) #有效段落的最大字符数
encoding_ = data['encoding'] #页面编码
starttag = data['starttag'] #内容提取开始字符
endtag = data['endtag'] #内容提取结束字符
sleepTime = toInt(data['sleep']) #每次请求间隔
jsonkey = data['jsonkey'] #JSON格式数据返回时的字段
headers_ = data['headers'] #request请求主机头参数
todayStr = time.strftime("%Y%m%d",time.localtime())
total = 0
if encoding_=='':
encoding_ = 'utf-8'
#日志保存
def doLog(vstr):
with open(todayStr + ".log",'a') as fo:
if vstr !="":
fo.writelines(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) + "\t" + vstr + "\n")
else:
fo.writelines(time.strftime("\n"))
fo.close()
def saveText(vstr):
global total
if vstr !='':
#doLog('需要保存的内容长度'+str(len(vstr)))
#判断不允许包含的内容
if len(textunclude)>0:
for tu_ in textunclude:
if tu_!='':
if vstr.find(tu_) !=-1:
#doLog(vstr + "】中存在不允许的字符:" + tu_)
return ""
#处理替换内容
if len(textreplace)>0:
for vi in textreplace:
if vi!='':
vstr = vstr.replace(vi,'')
print("\033[0;32;40m\t 收集的内容长度:" + str(len(vstr)) + "\t\033[0m ")
total = total +1
with open("采集结果.txt",'a') as fo:
fo.writelines(vstr+"\n")
fo.close()
def getFromUrl(vurl):
global thead_count,start_time
if vurl !='':
print('即将从' + vurl + '页面获取可用链接')
#提取主网址
domain = ""
if vurl.find('://') !=-1:
domain = vurl[0:vurl.find('/',vurl.find('://')+4)]
else:
domain = vurl[0:vurl.find('/')]
res = requests.get(vurl,"",headers=headers_ if len(headers_)>0 else {},timeout=3)
if jsonkey !='':
_json = res.json()
if _json[jsonkey] !='':
htmlStr = _json[jsonkey]
else:
print("================== ERROR ===================")
else:
htmlStr = res.text
#print(htmlStr)
a_href =re.findall('0:
for u1 in urlunclude:
if i.find(u1) !=-1:
urlFlag = 0
print("\033[0;31;40m\t" + i + "\t无效\033[0m ")
break
#判断必须包含的内容
if urlFlag>0 and len(urlinclude)>0:
inFlag = 0
for u2 in urlinclude:
if i.find(u2) !=-1:
inFlag = 1
break
if inFlag0:
print('延时' + str(sleepTime) + '秒后开始采集')
time.sleep(sleepTime)
doLog('开始采集:' + i)
res2 = requests.get(i,"",headers=headers_ if len(headers_)>0 else {},timeout=3)
html_ = res2.text
if html_ !='':
htmlFlag = 1
#判断是否包含指定内容
if len(textinclude)>0:
if html_.find(textinclude) !=-1:
htmlFlag = 1
else:
htmlFlag = 0
if htmlFlag= _endpos:
_endpos = len(html_)
#根据标签,提取内容
html_ = html_[_startpos:_endpos]
#过滤掉html代码,提取纯中文
html_ = html_.replace('',"</p>\r\n") #避免整段HTML代码都没换行
html_ = re.sub(r']*>','',html_)
#doLog(i + ':' + html_)
#对内容进行分割
tmpArr = html_.split("\r\n")
for ti in tmpArr:
ti2 = ti.strip().replace(" "," ")
if len(ti2)>textminsize and len(ti2)textmaxsize:
print(i + '的内容长度为:' + str(len(ti2)))
#内容过长,尝试再次分段
arr2 = ti2.replace("\r","\n").split("\n")
for tj in arr2:
tj2 = tj.strip().replace(" "," ")
print('当前段落长度为:' + str(len(tj2)))
if len(tj2)>textminsize and len(tj2)textmaxsize:
# doLog(i + '-->' + tj2)
else:
print('段落不符合设定要求' + str(len(ti2)))
print(i)
print(vurl + " 采集完成,退出线程\n")
if thead_count==1:
print('任务已完成,共用时:'+str(formatFloat(time.time()-start_time)) + 's')
print('共计:' + str(total))
#退出整个程序
sys.exit()
else:
if thead_count>0:
thead_count -= 1
else:
if thead_count>0:
thead_count -= 1
print("程序成功启动")
if start_