免规则采集器列表算法(基于Python网络爬虫与推荐算法新闻推荐平台文章目录功能介绍)
优采云 发布时间: 2022-04-11 06:06免规则采集器列表算法(基于Python网络爬虫与推荐算法新闻推荐平台文章目录功能介绍)
系列目录
基于Python网络爬虫和推荐算法的新闻推荐平台
文章目录
特征
一个有规律的采集新闻内容的网络爬虫,只需要配置间隔时间,就可以自动爬取新闻。消息来源采集为新浪新闻
一、结构
新闻爬虫由两部分组成:URL采集器、详情页采集器、定时器
采集器特征
网址采集器
专门用于采集新浪滚动新闻上的新闻详情页URL
详情页采集器
详情页采集的内容(例如:新闻)通过来自URL采集的URL数据
时序采集器
控制news采集器的启动和关闭,以及定时任务的设置
二、具体实现1.网址采集器
'''
使用新浪新闻滚动新闻的API进行新闻采集
参数分析:
pageid 目前看应该是固定的参数默认值为153
lid 类别ID 2509(全部) 2510(国内) 2511(国际) 2669(国际) 2512(体育) 2513(娱乐) 2514(军事) 2515(科技) 2516(财经) 2517(股市) 2518(美股)
num 获取新闻数量 上限为50
'''
def urlcollect(lid):
op_mysql = OperationMysql() #创建数据库连接对象
url = 'https://feed.mix.sina.com.cn/api/roll/get?pageid=153&lid='+str(lid)+'&num=50' #网易新闻API
result = requests.get(url) #对API发起请求
result.encoding = 'utf-8' #由于API返回的数据为ISO编码的,中文在此处显示会出现乱码,因此更改为UTF-8编码
# print('Web:', result.text)
urls = re.findall(r'"url":"(.*?)"', result.text) #获取API返回结果中的所有新闻详情页URL
# times = re.findall(r'"ctime":"(.*?)"', result.text)
# 逐条处理被\转义的字符,使之成为为转义的字符串
# 并把处理号的URL导入到数据库中储存
changedict = {"2518": 0, "2510": 1, "2511": 2, "2669": 3, "2512": 4, "2513": 5, "2514": 6, "2515": 7, "2516": 8, "2517": 9}
Type = changedict.get(str(lid))
for numbers in range(len(urls)):
urls[numbers] = urls[numbers].replace('\\', '')
logger.info("url:{}".format(urls[numbers]))
time = datetime.datetime.now().strftime('%Y-%m-%d')
sql_i = "INSERT INTO news_api_urlcollect(url, type, time) values ('%s', '%d', '%s')" % (urls[numbers], Type, time)
op_mysql.insert_one(sql_i)
op_mysql.conn.close()
2.详情页面采集器
3. 时序采集器
#创建一个APScheduler对象(用于配置定时任务)
sched = BlockingScheduler()
def begincollect(time):
time = int(time)
try:
# 'interval'关键词表示的是按照固定时间间隔进行的任务 add_job()添加一个定时任务
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect1', kwargs={"lid": "2510",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect2', kwargs={"lid": "2511",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect3', kwargs={"lid": "2669",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect4', kwargs={"lid": "2512",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect5', kwargs={"lid": "2513",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect6', kwargs={"lid": "2514",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect7', kwargs={"lid": "2515",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect8', kwargs={"lid": "2516",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect9', kwargs={"lid": "2517",})
sched.add_job(urlcollect, 'interval', max_instances=1, seconds=time, id='urlcollect10', kwargs={"lid": "2518",})
# urlcollect(lid)
# 为了可以控制定时任务的关闭因此需要在任务开始时保存下该进程的PID值并保存与文件中
# 用于ClossScheduler.py中进行杀死进程
pid = os.getpid()
f1 = open(file='urlSpider.txt', mode='w')
f1.write(pid.__str__())
f1.close()
sched.start()
except Exception:
logger.error('error:'+Exception)
def endsched():
sched.shutdown()
总结
新闻采集系统可以稳定详细地采集新浪新闻滚动新闻中的所有新闻。目前只写单线程,效率略低。还有一个未知的bug,就是在消息采集的过程中,当调度任务被APScheduler控制时,一旦任务采集任务启动,就不能直接停止采集@ > 任务,并且需要让他在相应的循环中完全运行当前任务,才能停止。简而言之,定时器对任务的控制只控制间隔时间和运行次数,不能立即启动和停止。
另外,采集器还不是通用的,也就是只能用于指定网页的内容采集,这是一个可扩展的功能,通过对页面的分析,大致的内容采集 函数。
项目完整源码已经更新,有需要可以自行下载
欢迎提出问题和错误
个人码云主页,欢迎交流!!
个人GitHub主页,欢迎交流!!