本程序写的目的主要是同步单位的网站信息和上级网站信息,采用爬虫自动分析出信息URL所属类别,获取分类ID 然后对采集网站内容 放入mysql数据库中
程序整个过程使用pymysql request re time urllib3 1.25版本 几个包
思路如下
1、获取列表页url列表
2、循环url 获取网页的信息所属类别
3、查询数据库中是否存在该来源url 如果存在说明文章存在 跳过 不存在则进入文章页面进行采集
4、采集文章页面,获取几个信息
5、写入信息到数据库中
程序采用同步采集 没有使用 多线程 多进程或者协程 对于一个网站信息的采集来讲确实没有必要
程序如下:
#本程序主要用于网站的自动更新
import requests
import re
import pymysql
import time
import urllib3
urllib3.disable_warnings()
def get_node_id(url): #用于获取分类分类id
surl=url.split('/')[-3]
if surl=='ptgk': #普通高考
return 24
elif surl == 'xysphgxks':
return 24
elif surl == 'xxjsxk':
return 24
elif surl == 'zzzjgk':
return 24
elif surl == 'kjhjmhzf':
return 24
elif surl == 'jrdd':
return 16
elif surl == 'gsl':
return 16
elif surl == 'gkzhgg': # 高考综合改革
return 25
elif surl == 'gzdxxzskszk': # 高中段学校招生考试(中考)
return 11
elif surl == 'kjqsnhkxxzs': # 空军青少年航空学校招生
return 11
elif surl == 'jsszxxxyzlcs': # 江苏省中小学学业质量测试
return 11
elif surl == 'zzxc': #中职学测
return 11
elif surl == 'zxks': # 自学考试
return 13
elif surl == 'zxxjszgks': #教师资格
return 14
elif surl == 'jsssfspdjzsks': #书法等级考试
return 15
else: #其他信息一概放入其他考试栏目
return 16
def runee(url):
#首先 获得指定链接列表
html=requests.request(method='get', url=url)
html.encoding='UTF-8'
html=html.text
article_urls=re.findall('<li><span>.*?</span><a href="(.*?)" target="_blank" title=".*?">.*?</a></li> ',html,re.S)
article_urls=article_urls[:20]
article_new_urls=[]
for a in article_urls:
new_urls="http://www.lygzsks.cn/"+a
article_new_urls.append(new_urls)
# print(article_new_urls) #article_new_urls 才是页面采集所有列表的集合
#其次更具列表查询数据库是否存在该列表
conn=pymysql.connect(host='localhost',user='用户名隐藏',password='密码隐去',database='数据库隐藏',port=3306)
cursor=conn.cursor()
cursor.execute("SELECT `source_url` FROM `rrz_articles` ORDER BY `id` DESC LIMIT 30")
rs=cursor.fetchall()
result=[]
# print(rs)
for j in rs:
if j[0] is not None:
result.append(j[0])
result=list(set(result))
# print(result)
for i in article_new_urls:
if i not in result:
id=str(get_node_id(i)) #获取id
chtml=requests.get(i)
chtml.encoding='utf-8'
chtml=chtml.text
# print(chtml)
rat=re.finditer(r'<div class="inContainer"> .*?<h3>(?P<title>.*?)</h3>.*?<span>信息来源:(?P<source>.*?)</span>.*?<span>发布日期:(?P<posttime>.*?)</span>.*?<div class="inContainer-content"> (?P<content>.*?)</div>.*?<div class="inContainer-cpage"> ',chtml,re.S)
for at in rat:
title = at.group('title')
source = at.group('source')
posttime = at.group('posttime')
content = at.group('content')
content=content.replace(r'src="/picture/',r'src="http://www.lygzsks.cn/picture/')
timeArray = time.strptime(posttime, "%Y-%m-%d %H:%M")
# 转换为时间戳
timeStamp = int(time.mktime(timeArray))
# print(title, source, timeStamp, "11111")
#执行插入mysql
sql="INSERT INTO `rrz_articles` (`id`, `node_id`, `title`, `content`, `author`, `pubtime`, `ifpub`, `source`, `source_url`) VALUES (NULL, '%s', '%s','%s','%s','%s', 'true','%s','%s');"%(id,title,content,source,timeStamp,source,i)
cursor.execute(sql)
conn.commit()
print("资讯【"+title+"】增加成功")
else:
pass
cursor.close()
conn.close()
url='http://www.lygzsks.cn/lygsjyksy/zkzx/zkzx.html'
runs=True
b=1
while runs:
runee(url)
time_neow=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print("【"+str(time_neow)+"】--------第【"+str(b)+"】次运行完毕")
b +=1
time.sleep(720)
0 评论