一直在想这样一个问题:本人经常喜欢在虎扑上面看NBA的新闻,那么我想如果我可以写一个爬虫,爬取我感兴趣的新闻(就是包含特定关键词的新闻)然后通过邮件发送到我QQ上面,我就可以一下子把我要看的看完,不用每次都打开浏览器去刷,而且我也不想下载App.所以把这个爬虫脚本丢到服务器上面,每天晚上执行一次,就可以把当天你感兴趣的新闻发给你。
好的,基本的想法就是这样。
下面就开始直接来上代码了。
首先,采用的语言是python,因为人生苦短,都用python
我这里使用的是python2.
python强大的库可以满足你的需求,利用urllib2访问网址,bs4解析html文件,MySQLdb将新闻保存到数据库(不好意思,我这边没有实现发送邮件,其实使用python的库应该蛮简单的,为什么我没写呢,因为我不会啊)。
所以不要认为很多事情都很简单,去做了之后你才有底气说简单,不过用python发送邮件应该是很简单的,你去试一下就知道。
不说废话了,要爬取新闻,你就要先去分析虎扑NBA新闻首页的html代码,你要知道你想要哪些信息,我这里需要每天新闻的特定链接,然后再去访问这个特定的链接就能把新闻的标题和内容保存下来。
虎扑NBA新闻首页上面每天新闻特定的链接:
每一条特定新闻里面的标题和内容:
这样的话我们就是先向虎扑NBA新闻的url进行请求,拿到该页面上所有的新闻的链接,然后单独对特定的新闻链接进行请求,然后从页面代码上拿到新闻的标题和内容。
这里如果你要设置自己的关键词,我代码里面是设置一个interests列表,里面存放关键词,然后判断这些关键词在不在新闻的标题和内容里面出现,如果出现了就把这条新闻保存到数据库当中去。
整体的思路就是这样,很简单。关于urllib2、bs4和MySQLdb的使用,可以自行百度。用到什么百度看看用法就行。
直接上手敲代码,不要虚。
注:使用的数据库是MySQL,数据库名字为hupu,表名为hupu_nba_news,字段名为id,title,content。
代码如下:
#!/usr/bin/python # -*- coding: UTF-8 -*- import urllib2 from bs4 import BeautifulSoup import MySQLdb #返回向url请求所获得的html def getHtml(url): rs = urllib2.urlopen(url) return rs.read() # 打开数据库连接 db = MySQLdb.connect("localhost", "root", "123456", "hupu", charset='utf8' ) # 使用cursor()方法获取操作游标 cursor = db.cursor() #虎扑NBA新闻的首页地址是https://voice.hupu.com/nba/1" #下一页就是2,再下一页就是3 def getNewsListByPage(page): html = getHtml("https://voice.hupu.com/nba/"+str(page)) soup = BeautifulSoup(html,"html.parser") news_list = soup.select(".list-hd") #print len(news_list) return news_list pages_list = [] for i in range(1,3): for news in getNewsListByPage(i): pages_list.append(news.h4.a['href']) #判断关键词是否在sql里面出现 def isContains(interests,sql): for i in range(len(interests)): if interests[i] in sql: return True return False #对每一个单一的新闻链接请求 获取标题和新闻内容 interests = ["库里","勇士","杜兰特"] for i in range(len(pages_list)): #print "执行=======第"+str(i)+"条新闻" curr_html = getHtml(pages_list[i]) curr_soup = BeautifulSoup(curr_html,"html.parser") #print len(curr_soup.select(".headline")) title = curr_soup.select(".headline")[0].get_text(strip=True).encode('utf-8') #print len(curr_soup.select(".artical-main-content")) content = curr_soup.select(".artical-main-content")[0].get_text(strip=True).encode('utf-8') sql = 'insert into hupu_nba_news(title,content) values("'+title+'","'+content+'");' #print sql if isContains(interests,sql): try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # Rollback in case there is any error db.rollback() print "done" db.close()
毕,见笑了,有什么不懂的可以在下面留言。