python爬虫,爬取一系列新闻
这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2941。
由于存在多次请求,所以稍微将请求封装如下
def tranfrom_dom_tree(url):
'''
将获取的html文本转化为dom树
'''
response = requests.get(url);
response.encoding = "utf-8";
return BeautifulSoup(response.text, "html.parser");
将具体新闻内容封装如下
class News(object):
'''
广商校园新闻数据模型
'''
def __init__(self, url):
self._url = url; #新闻网页地址
self._dom_tree = tranfrom_dom_tree(url);
self._show_infos = self._dom_tree.select(".show-info")[0].text.split();
self._update_time = "";
self._auditor = "";
self._auothor = "";
self._origin = ""; for index, args in enumerate(self._show_infos):
if args.startswith("发布时间"):
self._update_time = args[5:] + " " + self._show_infos[index+1];
continue;
elif args.startswith("作者"):
self._auothor = args[3:];
continue;
elif args.startswith("审核"):
self._auditor = args[3:];
continue;
elif args.startswith("来源"):
self._origin = args[3:];
continue; @property
def title(self):
'''
:return: 新闻标题
'''
return self._dom_tree.select(".show-title")[0].text; @property
def auothor(self):
'''
:return: 新闻作者
'''
return self._auothor; @property
def auditor(self):
'''
:return: 新闻审核
'''
return self._auditor; @property
def origin(self):
'''
:return: 新闻发布单位
'''
return self._origin; @property
def update_time(self):
'''
:return: 新闻最后更新时间
'''
return self._update_time; @update_time.setter
def update_time(self, time):
'''
设置最后更新时间
:param time: 时间
'''
self._update_time = time; @property
def times(self):
'''
:return: 点击次数
'''
clickUrl = 'http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80'.format(self.news_id);
response = requests.get(clickUrl);
click = re.findall('(\d+)', response.text)[-1];
return click; @property
def news_id(self):
'''
:return: 新闻标识
'''
time = datetime.strptime(self._update_time, '%Y-%m-%d %H:%M:%S');
time = time.strftime("%m%d");
return re.match('http://news.gzcc.cn/html/.*/.*/(\d+).html', self._url).group(1); @property
def summary(self):
'''
:return: 新闻摘要内容
'''
return self._summary; @summary.setter
def summary(self, text):
'''
设置新闻摘要
:param text: 新闻摘要
'''
self._summary = text; def to_dict(self):
'''
将此类实例转换为字典
:return: 转换后的字典
'''
dict = {};
dict["news_url"] = self._url;
dict["news_id"] = self.news_id
dict["news_title"] = self.title;
dict["news_summary"] = self.summary;
dict["news_update_time"] = self.update_time;
dict["news_times"] = self.times;
dict["news_auothor"] = self.auothor;
dict["news_auditor"] = self.auditor;
dict["news_origin"] = self.origin;
return dict;
对新闻进行批操作代码如下
class GZCCNewsReptile(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"; @property
def count(self):
'''
:return: 返回校园新闻总条数
'''
count = self._dom_tree.select(".a1")[0].text;
return int(count[0:-1]); @property
def page(self):
'''
:return: 获取校园新闻总页数
'''
page = int(self.count) / 10;
int_page = int(page);
if page > int_page:
return ( int_page + 1);
else:
return int_page; def get_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 in range(start_page, end_page));
# 爬取指定范围数据
for index in times:
# 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, []);
return news_list; def get_page_news(self, page):
'''
获取指定页数
若指定的页数在可爬取页数的范围之外,则抛出运行异常异常
:param pages: 指定的页数
:return: 返回指定页的新闻列表
'''
if page < 1 or page > self.count:
raise IndexError("page不在指定范围内");
else:
print("\r当前正在%d页" % page, end="");
return self.get_news_from_page_url(self.page_url(page)); def get_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+"()"));
except Exception:
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)) ); return news_page_list; @property
def news_type(self):
'''
新闻默认类型设置
:return: 返回默认类型
'''
return self._news_type;
@news_type.setter
def news_type(self, type="dict"):
'''
新闻可选类型
:param type: 选择的类型
'''
if type == "dict":
self._news_type = type;
else :
raise Exception("未能匹配该类型");
测试代码如下
# 测试GZCCNewsReptil可用性
start_page = 106
# news_list = GZCCNewsReptile().get_news_from_news_page_size(start_page,start_page+10);
news_list = GZCCNewsReptile().get_news_from_news_page_size(1, 256);
pandas_date = pandas.DataFrame(news_list);
print(news_list);
# #csv
pandas_date.to_csv(".\pandas_date.csv", encoding="utf-8_sig");
# #sql
# with sqlite3.connect("test.sqlite") as db:
# pandas_date.to_sql("test", db);
# date = pandas_date.read_sql_query('SELECT * FROM gzccnewsdb5', con=db)
# date[date["news_times"]>380];
python爬虫,爬取一系列新闻的更多相关文章
- Python爬虫 - 爬取百度html代码前200行
Python爬虫 - 爬取百度html代码前200行 - 改进版, 增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...
- 用Python爬虫爬取广州大学教务系统的成绩(内网访问)
用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...
- 使用Python爬虫爬取网络美女图片
代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...
- Python爬虫|爬取喜马拉雅音频
"GOOD Python爬虫|爬取喜马拉雅音频 喜马拉雅是知名的专业的音频分享平台,用户规模突破4.8亿,汇集了有声小说,有声读物,儿童睡前故事,相声小品等数亿条音频,成为国内发展最快.规模 ...
- python爬虫爬取内容中,-xa0,-u3000的含义
python爬虫爬取内容中,-xa0,-u3000的含义 - CSDN博客 https://blog.csdn.net/aiwuzhi12/article/details/54866310
- Python爬虫爬取全书网小说,程序源码+程序详细分析
Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...
- python爬虫—爬取英文名以及正则表达式的介绍
python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一. 爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个cs ...
- 一个简单的python爬虫,爬取知乎
一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...
- python爬虫-爬取百度图片
python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...
- python爬虫---爬取王者荣耀全部皮肤图片
代码: import requests json_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win ...
随机推荐
- JDBC API 可滚动可编辑的结果集
JDBC的API中的链接数据和创建statement并且执行读取ResultSet大家已经很熟悉了,这边介绍设置statement的属性使结果集可以移动并且进行编辑同步回数据库. Statement ...
- js估算一篇文章的阅读时长
每天早上上班在地铁里我都有看技术类文章以及实时新闻的习惯,偶尔会看到有些文章的开始部分会提醒我们这篇文章大概的阅读时长,我就在想这是怎么实现的,具体到前端开发中,又是如何实现的.今天在浏览Segmen ...
- windbg源码驱动调试 + 无源码驱动调试
windbg源码驱动调试 环境信息 虚拟机:win7 32位 windbg:6.12(版本不存在太大影响) 设置过程 windbg与虚拟机连接:链接 配置windbg 配置好双机调试后,点击win ...
- PHP 常用设计模式 (转载)
1.单例模式 单例模式顾名思义,就是只有一个实例.作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的要点有三个: 一是某个类只能有一个实例: ...
- Java项目中启动Tomcat报错invalid LOC header
原因: 可能是jar包有问题. 解决方法: 1.找到加载不了的类对应的jar包. 2.在tomcat中webapps/INF/lib中找到对应的jar包,然后删除. 3.重新下载其它版本的jar包. ...
- nginx设置默认server
server { listen default_server; listen [::]: default_server; server_name _; root /usr/share/nginx/ht ...
- 线性表->链式存储->线形链表(单链表)
文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...
- 使用vue-cli3搭建一个项目
前面说过用vue-cli3快速开发原型的搭建,下面来说一下搭建一个完整的项目 首先我们可以输入命令(创建一个项目名为test的项目) vue create test 输完这个命令后,会让你选择配置项, ...
- Python001-操作MSSQL(Microsoft sql server)基础示例(一)
Python操作mssql server数据库可以通过pymssql或pyodbc实现的.此文以pymssql为例.Python操作MSSQL基本操作步骤如下所示: 获取数据库连接Connection ...
- fiddler 安装证书问题,和安装完后,浏览器无法访问问题
安装证书问题 https://blog.csdn.net/l1336037686/article/details/78322014 浏览器无法访问问题 https://blog.csdn.net/u0 ...