BeautifulSoup+pandas 爬取新浪国内新闻

2023-05-16

(1)使用技术

python 3.5.2、sqlite3、pandas、requests、jupyter notebook

(2)详细代码

新浪国内新闻首页:http://news.sina.com.cn/china/

1、爬取的内容为最新消息里面每个新闻详细页面的标题、发布时间、编辑、内容、评论数以及评论内容

 

2、编写思路

  • 使用requests将发送请求,并且将返回的数据接收回来。
  • 对接接收回来的数据进行处理,使用pandas进行处理,并且保存到sqlite3里面

3、具体的代码模块讲解

 

获取分页的url,国内新闻采取分页的形式来分割不同的新闻,因此我们首先获取新闻分页的数据,并且从分页的数据中获取到各个新闻详情页的url。getPageUrl用来获取分页的url(pageUrl 是在开发者工具使用NetWork查找到的,一般的请求在doc、js、xhr中)

def getPageUrl(begin,end):
    pageUrls = []
    pageUrl = "http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw\
    &cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1\
    &show_num=22&tag=1&format=json&page={}"
    for i in range(begin,end):
        newUrl = pageUrl.format(i)
        pageUrls.append(newUrl)
    return pageUrls

根据获取到的分页的数据,再获取详情页面的URL,其中getNewsUrl中的begin,end是分页的开始和结束。由于新闻量的数据量太大,此处做了限制。

def getNewsUrl(begin,end):
    newsUrl = []
    pageUrls = getPageUrl(begin,end);
    for url in pageUrls:
        res = requests.get(url)
        res.encoding = "utf-8"
        urlJson = json.loads(res.text)
        for i in urlJson["result"]["data"]:
            newsUrl.append(i["url"])
    return newsUrl;

获取到了具体的新闻页面url以后,可以根据url去爬取新闻页面具体的信息。

import requests;
from bs4 import BeautifulSoup;
from datetime import datetime;
import re;
import json;

def getNewDetails(newsUrl):
    results = {};
    contentsList = [];
    res = requests.get(newsUrl);
    res.encoding = "utf-8";
    soup = BeautifulSoup(res.text,"html.parser");
    mainTitle = soup.select(".main-title")[0].text.strip();
    results["mainTitle"] = mainTitle
    originTime = soup.select(".date-source span")[0].text.strip();
    publishTime = datetime.strptime(originTime,"%Y年%m月%d日 %H:%M");
    strTime = datetime.strftime(publishTime,"%Y-%m-%d");
    results["publishTime"] = publishTime
    if(len(soup.select(".date-source a")) > 0):
        originSource = soup.select(".date-source a")[0].text.strip();
    else:
        originSource = "";
    results["originSource"] = originSource
    contents = " ".join([p.text.strip() for p in soup.select(".article p")[:-1]]);
    results["contents"] = contents
    editor = soup.select(".article p")[-1].text.strip();
    results["editor"] = editor
    m = re.search("doc-i(.*).shtml",newsUrl)
    comments = requests.get("http://comment5.news.sina.com.cn/page/info?version=1\
    &format=json&channel=gn&newsid=comos-" + m.group(1) + "&group=undefined&compress=0\
    &ie=utf-8&oe=utf-8&page=1&page_size=3&t_size=3&h_size=3&thread=1");
    comments.encoding = "utf-8";
    commentsJson = json.loads(comments.text.strip());
    results["total"] = commentsJson["result"]["count"]["total"]
    for com in commentsJson["result"]["cmntlist"]:
        contentsList.append(com["time"] + " " + com["nick"] + ":" + com["content"])
    results["contents"] = ' '.join(contentsList)
    return results

用getNewData来做一个获取具体页面url以及爬取数据的一个连接

def getNewData():
    newsData = []
    newsUrl = getNewsUrl(1,3)
    for url in newsUrl:
        newsData.append(getNewDetails(url))
    return newsData

  • 使用pandas来处理返回来的数据,可以保存成csv,xlsx

import pandas;
df = pandas.DataFrame(getNewData())
df.to_excel("news.xlsx")

使用pandas来处理返回来的数据,可以保存数据库中

import sqlite3 
cnx = sqlite3.connect('news.sqlite')
type(cnx)
df.to_sql('data',cnx ,schema=None, if_exists='replace', index=True, index_label=None, chunksize=None, dtype=None)

读取数据库中的数据

import sqlite3;

pandas.read_sql('select * from data;',con = db)

 

本文根据自己的学习所总结的一些内容,如有不足之处,请多多指教。

版权声明: 原创文章,如需转载,请注明出处! https://blog.csdn.net/lwx356481/article/details/81216490

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BeautifulSoup+pandas 爬取新浪国内新闻 的相关文章

  • Error attempting to get column ‘xxx‘ from result set. Cause: java.sql.SQLDataException错误的解决方法

    文章目录 1 复现错误2 分析错误3 解决错误4 文末总结 1 复现错误 今天写好导入hive表的详情列表的接口 xff0c 如下代码所示 xff1a span class token comment hive表导入的回调接口 64 aut
  • 文件传输协议FTP、SFTP、SCP

    今天在了解Ansible的时候看到了Ansible是基于SFTP协议进行文件传输的 xff0c 就想了解下FTP协议与SFTP协议的区别 xff0c 因为总结了这篇文章 应用层 xff1a HTTP xff08 Hypertext Tran
  • SSH配置免密登录 详解(踩坑无数总结)

    之前在使用Ansible部署工具的时候 xff0c 需要先配置好SSH免密登录 xff0c 在配置时踩了很多的坑 xff08 按照很多文章的步骤并不能完全配置好免密登录 xff09 xff0c 因此在踩完所有的坑之后 xff0c 总结出来这
  • CentOS7.6升级内核到5.11及build RPM包

    目录 源码编译方式升级内核 安装依赖包 升级GCC 编译安装kernel5 11 构建RPM包 安装RPM包 源码编译方式升级内核 在编译高版本内核之前 xff0c 构建编译环境以及依赖包安装是肯定的 xff1b 但是 xff0c Cent
  • 内存对齐规则--图文详解

    在之前的C语言结构体的学习中 xff0c 遇到了内存对齐的问题 xff0c 之后在C 43 43 的类的学习中 xff0c 再次遇到了内存对齐问题 xff0c 所以我觉得有必要总结一下这个知识点 内存对齐规则 1 xff09 第一个成员在与
  • #define定义宏函数 的正确使用

    如何使用宏来定义一个自定义函数呢 xff1f 首先我们来看下面这段代码 define SQUARE x x x int main int a 61 5 printf 34 SQUARE a d n 34 SQUARE a 这个值为25 pr
  • C语言运算符优先级列表(超详细)

    本篇文章是对C语言中运算符的优先级进行了详细的分析介绍 xff0c 需要的朋友参考下 C语言运算符优先级 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 数组下标 数组名 常量表达式 左到右 圆括号 表达式 xff09 函数名 形
  • 直接插入排序讲解及代码实现

    基本思想 每一步将一个待排序的元素 xff0c 按其排序码的大小 xff0c 插入到前面已经排好序的一组元素的合适位置上去 xff0c 直到元素全部插完为止 当插入第i i gt 61 1 个元素时 xff0c 前面的array 0 arr
  • 虚拟地址空间 及 页表 详解

    虚拟地址空间 进程地址空间由进程可寻址的虚拟内存组成 xff0c 内核允许进程使用这种虚拟内存的地址 每个进程都有一个 32位或64位 的平坦地址空间 xff0c 空间的大小取决于体系结构 xff08 平坦指的是地址空间范围是一个独立的连续
  • vector 模拟实现

    define CRT SECURE NO WARNINGS 1 include lt iostream gt include lt algorithm gt include lt assert h gt include lt Windows
  • C语言中的字节对齐

    一 什么是字节对齐 一个基本类型的变量在内存中占用n个字节 则该变量的起始地址必须能够被n整除 即 存放起始地址 n 61 0 那么 就成该变量是字节对齐的 对于结构体 联合体而言 这个n取其所有基本类型的成员中占用空间字节数最大的那个 内
  • Gson转换Date类型出错处理(com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate)

    用Gson做对象和Json字符串相互转换很方便 xff0c 但要把包含java util Date类型属性的对象转换成Json字符串 xff0c 如下面的代码 xff1a Gson gson 61 new Gson String p 61
  • orm框架sequelize的where条件接受动态参数传入

    在nodejs项目中 xff0c 接口会接收从前台传来的查询参数 xff0c 接口里面根据请求参数动态查询数据库 xff0c 例如分页参数等等 xff1b sequelize官方文档中并没有提及如何做 xff0c 不过可以利用sequeli
  • 判断单链表是否存在回环

    Author Victor LV Date 2016 9 6 10 14 Description 判断单链表是否有回环C 43 43 C 43 43 判断单链表是否存在回环 输入 list的头指针 返回 bool true表示有回环 fal
  • PAM: Pluggable Authentication Modules for Linux(未完待续)

    PAM简介 PAM诞生自1995年 xff0c 最先由SUN提出并应用于Solaris2 3上 在这之后 xff0c 经过广大开发人员的不懈努力 各版本的UNIX系统陆续提供了对PAM的支持 包括FreeBSD和Linux 其中专门针对Li
  • TypeError: this.cliEngineCtor is not a constructor,webstorm和eslint的版本纠结

    在webstorm里使用eslint的时候 xff0c 会提示 TypeError this cliEngineCtor is not a constructor xff0c 这样的一个错误 xff0c 知道应该是版本的错误 xff0c 但
  • Android dataBinding和viewBinding简单封装Activity

    public abstract class BaseActivity lt MD extends BaseViewModel gt extends AppCompatActivity implements View OnClickListe
  • Android dataBinding和viewBinding简单封装ViewModel

    Lifecycle xff1a 为ViewMode添加生命周期 public interface ViewModelLifecycle extends LifecycleObserver 64 OnLifecycleEvent Lifecy
  • Ftp操作

    仅收录一些ftp常用操作 xff0c 关于ftp的主动模式和被动模式 xff0c 见参考 import org apache commons net ftp FTPClient private boolean binaryTransfer
  • Ubuntu下安装及使用gdebi

    gdebi用于在Ubuntu环境下安装 deb 文件程序 安装 xff1a sudo apt install gdebi core 使用 xff1a sudo gdebi xxx deb 安装成功

随机推荐