今天我要更新我自己写的一个爬虫程序,哇。厉害了,我一个菜鸟居然有勇气些爬虫程序,简直胆大包天,但是,不管怎样,我也要上传,没办法,我就是脸皮厚,我是不怕别人笑。
# -*- 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不变),但是我还是觉得肯定有很多错误,或者可以改进的地方,不喜勿喷,毕竟,我也知识个刚入门的菜鸟而已。如果是跟我一个水平的人看到,你看看有什么能用的拿去用好了,如果是大神们看到,你就当没看到好了。当然,我会非常珍惜大牛们的评论指导的。