python获取新浪新闻


获取新浪新闻的国内新闻、国际新闻和社会新闻三大类,并且保存到MySQL数据库中。通过抓包工具获得新闻数据的API接口是http://api.roll.news.sina.com.cn/zt_list?,请求时只要带上适当的参数就可以获取数据了,代码如下:

编写Sina_News.py:

# -*- coding:utf-8 -*-
import json
import MySQLdb
import requests

class Sina_News(object):
    def __init__(self, newclass='gnxw'):
        self.url = 'http://api.roll.news.sina.com.cn/zt_list?'
        self.newclass = newclass

    def get_data(self, page=1):
        params = {'channel':'news',
                'cat_1': self.newclass, # 新闻类型,国内新闻(gnxw)、国际新闻(gjxw)和社会新闻(shxw)
                'cat_2': '',
                'level': '',
                'show_ext': '1',
                'show_all': '1',
                'show_num': '1000', #每次请求1000个数据
                'tag': '1',
                'format': 'json',  # 返回json数据
                'page': page  # 请求的页面
                }
        html = requests.get(self.url, params=params).content
        html_json = json.loads(html)["result"]
        return html_json

    def get_pages(self):
        total = int(self.get_data()["total"]) #获取该类新闻总条数
        #由每次请求1000条新闻,计算出总页数
        if total%1000 != 0:
            pages = (total//1000) + 1
        else:
            pages = total//1000
        return pages

    def get_new(self):
        pages = self.get_pages()

        for p in range(1,pages+1):
            
            data = self.get_data(page=p)["data"]
            self.execute_sql(data=data, page=p)

    def create_sql(self, item):
        '''创建SQL语句,item数据类型是字典'''
        k = "`, `".join(tuple(item.keys()))
        v = tuple(item.values())
        parms = k, v
        return "INSERT INTO Sina_News(`%s`) VALUES %s;" % parms

    def execute_sql(self, data, page):
        # 创建数据库连接
        db = MySQLdb.connect("localhost", "root", "root", "data", charset='utf8')
        cursor = db.cursor()
        num = 1
        for d in data:
            sql = self.create_sql(item=d)
            print('Crawl the page', page, ': Write data', num)
            try:
                cursor.execute(sql) # 执行sql语句
                db.commit()  # 提交到数据库执行
                num += 1
            except:
                db.rollback()

        db.close() # 关闭数据库连接


if __name__ == '__main__':
    print(u'''
    ========================
        0:国内新闻
        1:国际新闻
        2:社会新闻
    ========================''')

    news = ['gnxw','gjxw','shxw']
    newclass = news[int(input(u'请输入数字获取对应新闻:'))]
    Sina_News = Sina_News(newclass)
    Sina_News.get_new()

运行如下:

/media/upload/2019/03/30/sina_news.gif


 评论