classGZCCNewsReptile(object):"""广州商学院校园新闻获取工具"""
def __init__(self):
self._news_type= "dict";
self._root_url= "http://news.gzcc.cn/html/xiaoyuanxinwen/";
self._url=self.page_url();
self._dom_tree=tranfrom_dom_tree(self._url);def page_url(self, page=1):"""将指定页面解析数值解析对应url
:param page: 指定的一个新页面"""
if page == 1:
self._now_page= "index";else:
self._now_page=page;return self._root_url+str(self._now_page)+".html";
@propertydefcount(self):""":return: 返回校园新闻总条数"""count= self._dom_tree.select(".a1")[0].text;return int(count[0:-1]);
@propertydefpage(self):""":return: 获取校园新闻总页数"""page= int(self.count) / 10;
int_page=int(page);if page >int_page:return ( int_page + 1);else:returnint_page;defget_news_from_news_page_size(self, start_page, end_page):"""设置爬取页数范围,
start_page 小于 1 抛出 异常
start_page 大于 end_page 抛出 异常
end_page 大于 总页数 抛出 异常
:param start_page: 要爬取范围的开始页
:param end_page: 结束爬取范围的页面(不包括该页面)"""
if start_page < 1:raise IndexError("start_page不在指定范围内");if start_page >end_page:raise IndexError("start_page大于end_page");if end_page >self.page:raise IndexError("end_page不在指定范围内");
news_list=[];
times= (index for index inrange(start_page, end_page));#爬取指定范围数据
for index intimes:#news_page_list = self.get_news_from_page_url(self.page_url(index));
news_page_list = self.get_page_news(index); #较上句更利于封装
news_list.append(news_page_list);
news_list=sum(news_list, []);returnnews_list;defget_page_news(self, page):"""获取指定页数
若指定的页数在可爬取页数的范围之外,则抛出运行异常异常
:param pages: 指定的页数
:return: 返回指定页的新闻列表"""
if page < 1 or page >self.count:raise IndexError("page不在指定范围内");else:print(" 当前正在%d页" % page, end="");returnself.get_news_from_page_url(self.page_url(page));defget_news_from_page_url(self, url):"""获取指定url的所有新闻列表
:param pages: 指定的页面url
:return: news_page_list的列表"""dom_tree=tranfrom_dom_tree(url);
news_ui= dom_tree.select(".news-list li a");
news_page_list=[];for index in range(0, 10):try:
a_tag=news_ui[index];
href= a_tag.get("href");
news=News(href);
news.summary= a_tag.select(".news-list-description")[0].text;
news_page_list.append(eval("news.to_"+self.news_type+"()"));exceptException:
error_log= "此页面不正常: %s"%href;print("此页面不正常: %s"%href, end="");
with open("./logger.txt", "a", encoding="utf-8") as file:
now_time=time.time();
file.write(error_log+ "错误时间:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(now_time)) );returnnews_page_list;
@propertydefnews_type(self):"""新闻默认类型设置
:return: 返回默认类型"""
returnself._news_type;
@news_type.setterdef news_type(self, type="dict"):"""新闻可选类型
:param type: 选择的类型"""
if type == "dict":
self._news_type=type;else:raise Exception("未能匹配该类型");