简单的新闻爬虫

今天我要更新我自己写的一个爬虫程序,哇。厉害了,我一个菜鸟居然有勇气些爬虫程序,简直胆大包天,但是,不管怎样,我也要上传,没办法,我就是脸皮厚,我是不怕别人笑。

# -*- coding: utf-8 -*-

'''
此爬虫程序实现的是每天23:55自动的去抓取凤凰新闻网站当天更新的所有新闻,然后存入数据库.抓取的目标为:图		片,标题,出处,时间,新闻内容之所以要在当天的23:55开始抓取,是因为凤凰新闻网站的新闻为不定时更新的,基本每天会在23之后还会更新一条新闻,为了不漏掉,所以定在23:55开始抓取,第二天就会有前一天所有的新闻数据了.
'''

import csv
from selenium import webdriver
import pymysql
import time

class new(object):
	#初始化数据
	def __init__(self):
    #定义访问路径
    self.url='https://news.ifeng.com/'
    #下面创建数据库对象
    self.db = pymysql.connect('localhost','root','123456','newsdb',charset='utf8')
    #创建游标对象
    self.cursor = self.db.cursor()

	#获取页面节点
	def getweb(self):
    	driver = webdriver.PhantomJS()  #这里也可以声明普通浏览器
   		#打开凤凰新闻网
    	driver.get(self.url)
   		driver.implicitly_wait(10) #等待10秒
    	driver.maximize_window() # 最大化窗口
    	driver.implicitly_wait(5) #等待5秒
    	#先循环点击更多信息按钮,加载足够的新闻,一般点击三次肯定就能看得到前一天的新闻
    	i = 1
    	while i<4:
       		#获取更多信息按钮节点
        	button = driver.find_element_by_class_name('news-stream-basic-more')
        	button.click()
       	 	time.sleep(5)
        	i+=1
    	#获取标题节点
    	titles = driver.find_elements_by_xpath('//li[@class]/div/h2/a')
    	#获取来源节点
    	sources = driver.find_elements_by_xpath('//li[@class]/div/div/span')
    	#获取时间节点
    	times = driver.find_elements_by_xpath('//li[@class]/div/div/time')
    	#获取链接节点
    	urls = driver.find_elements_by_xpath('//li[@class]/div/h2/a')
    	#传递给解析的实例方法
    	self.fetch_web(titles,sources,times,urls)
    
	#解析数据
	def fetch_web(self,titles,sources,times,urls):
    	#定义每种数据的列表
    	titles_list=[]
    	sources_list=[]
    	times_list=[]
    	urls_list=[]
    	#循环遍历每种节点的信息
    	for title in titles:
        	titles_list.append(title.text)
    	for source in sources:
        	sources_list.append(source.text)
    	for t in times:
        	times_list.append(t.text)
    	for url in urls:
        	url = url.get_attribute('href')
        	urls_list.append(url)
    	#使用zip方法将4个列表融合为元组,元组里面是单个新闻内的信息列表
    	tuples = zip(titles_list,sources_list,times_list,urls_list)
    	#先存一个时间下来
    	newtime = time.strftime('%d',time.localtime(time.time()))
    	#循环遍历生成的元组
    	for info in tuples:
        	#取出链接再次请求页面获取新闻的具体内容
        	url=info[3]
        	#获取页面
        	driver = webdriver.PhantomJS()  #这里也可以声明普通浏览器
        	#打开新闻详细页面
        	driver.get(url)
        	driver.implicitly_wait(10) #等待10秒
        	driver.maximize_window() # 最大化窗口
        	driver.implicitly_wait(5) #等待5秒
        	#获取新闻内容节点
        	contents = driver.find_elements_by_xpath('//div[@class="text-3zQ3cZD4"]/p')
        	#遍历节点
        	content_list=[]
        	for content in contents:
            	content_list.append(content.text)
        	#这里是得到具体的新闻内容,存放在s中
        	s = '' 
        	for i in content_list:
            	s += i
        	#得到每条新闻的时间,日
        	t = info[2]
        	#与事先存下来的时间比对,如果一致,就是当天的新闻,如果不一致,就不是当天的新闻,就可以结束程序了
        	if t[3:5] == newtime:
            	#每条新闻数据装入字典
            	dic={
                    	'标题':info[0],
                    	'来源':info[1],
                    	'时间':info[2],
                    	'链接':info[3],
                    	'具体内容':s
                    	}
            	print(dic)
            
            	#存入数据库和表格
            	self.save_data(dic)
        	else:
            	#关闭游标和数据库对象
            	self.cursor.close()
            	self.db.close() 
            	break
    
	#存入数据库和表格
	def save_data(self,dic):
    	#将数据增加到数据库名为newsdb里面的一张表名为new的表中
    	ins = 'insert into new(title,source,time,url,content) values(%s,%s,%s,%s)'%(dic['标题'],dic['来源'],dic['时间'],dic['链	接'],dic['具体内容'])
    	#提交执行数据库操作
    	self.cursor.execute(ins)
    	self.db.commit()
    	print('存入数据库成功')
    	#存入表格
    	with open('new.csv','w') as n:
        	writer = csv.writer(n)
        	writer.writerow([dic['标题'],dic['来源'],dic['时间'],dic['链接'],dic['具体内容']])
    	print('存入表格成功')

	#主函数
	def main(self):
    	self.getweb()

if __name__ == '__main__':
	#这里实现每天的23:55:00左右开始遍历
	while True:   
    	if "23:55:00" <= time.strftime("%H:%M:%S",time.localtime(time.time())) <= "23:55:10":
        	run = new()
        	run.main()

写在最后,说实话,这个程序毕竟是我这个刚门的菜鸟写的,写这个的目的有两个,第一,学习写爬虫的基础知识,这种爬虫程序对于那些专业的程序员来说是一件很简单事,但是我却写了一天的时间。第二,我想在将来再看到这个程序的时候,能记得曾今这个青涩的自己。这个程序我测试过了,是能够爬取新闻的,而且数据格式也没问题(只要凤凰新闻网的HTML不变),但是我还是觉得肯定有很多错误,或者可以改进的地方,不喜勿喷,毕竟,我也知识个刚入门的菜鸟而已。如果是跟我一个水平的人看到,你看看有什么能用的拿去用好了,如果是大神们看到,你就当没看到好了。当然,我会非常珍惜大牛们的评论指导的。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值