python2爬取虎扑NBA的新闻标题和内容(入门勿喷)

一直在想这样一个问题:本人经常喜欢在虎扑上面看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()

毕,见笑了,有什么不懂的可以在下面留言。