Python爬虫实战——爬取新闻数据(简单的深度爬虫)

2023-11-07

前言

        又到了爬新闻的环节(好像学爬虫都要去爬爬新闻,没办法谁让新闻一般都很好爬呢XD,拿来练练手),只作为技术分享,这一次要的数据是分在了两个界面,所以试一下深度爬虫,不过是很简单的。

数据目标

相关库

import openpyxl
import requests
from lxml import etree
from tqdm import tqdm

数据爬取 

 网页url

url = 'https://www.chinanews.com.cn/scroll-news/news1.html'

1.先看看网站网址的规律

 发现这部分就是每一天的新闻,现在把这个链接组合一下,我暂时只拿1月份的数据

# 组合日期链接
def cnew_url():
    f = open(r'D:/工作文件/cnew_url.txt', 'w', encoding='utf8')
    for i in range(1, 32):
        if i < 10:
            url = 'https://www.chinanews.com.cn/scroll-news/2023/010' + str(i) + '/news.shtml'
        else:
            url = 'https://www.chinanews.com.cn/scroll-news/2023/01' + str(i) + '/news.shtml'
        f.write(url + '\n')
    f.close()

2.接下来访问每一天的链接获取到新闻的链接还有我们需要的分类的数据,然后再对新闻链接发起request请求获取到我们需要的标题和正文数据

def cnew_data():
    f = open(r'D:/工作文件/cnew_url.txt', encoding='utf8')  # 读取上面已经组合好的链接
    l = openpyxl.load_workbook(r'D:\工作文件\cnew_data.xlsx')
    sheet = l.active
    m = open(r'D:/工作文件/cnew_url1.txt', 'a', encoding='utf8')  # 保存报错的链接
    x = 1  # 从Excel的第几行开始写入
    for i in f:
        lj1 = []
        # 发起请求,获取页面里面的新闻链接
        req = requests.get(i.replace('\n', ''), headers=headers)
        # 设置网页编码,不设置会乱码
        req.encoding = 'utf8'
        ht = etree.HTML(req.text)
        # 获取分类的数据还有正文链接
        fl = ht.xpath("//div[@class='dd_lm']/a/text()")
        lj = ht.xpath("//div[@class='dd_bt']/a/@href")
        # 链接有两种格式,分别组合成可以用的
        for j in lj:
            if j[:5] == '//www':
                lj1.append('https:' + j)
            else:
                lj1.append('https://www.chinanews.com.cn/' + j)
        n = 0  # 这是匹配文章和分类
        for k in tqdm(lj1):
            try:
                data = []
                # 发起请求
                reqs = requests.get(k, headers=headers, timeout=10)
                reqs.encoding = 'utf8'
                ht1 = etree.HTML(reqs.text)
                # 因为这网站的正文所在的xpath路径不同,现在就是拿两种路径下的文本
                bt = ht1.xpath("//h1[@class='content_left_title']/text()")  # 标题
                if bt:  # 判断标题是不是为空,不为空就走第一种xpath
                    data.append([fl[n]])  # 爬到第几个链接就把第几个的类别放进来
                    data.append(ht1.xpath("//h1[@class='content_left_title']/text()"))  # 标题
                    data.append(ht1.xpath("//div[@class='left_zw']/p/text()"))  # 简介
                    data.append([lj1[n]])  # 文章的链接
                else:
                    data.append([fl[n]])
                    data.append(ht1.xpath("//div[@class='content_title']/div[@class='title']/text()"))
                    data.append(ht1.xpath("//div[@class='content_desc']/p/text()"))  # 简介
                    data.append([lj1[n]])
                # 数据写入
                for y in range(len(data)):
                    sheet.cell(x, y + 1).value = '\n'.join(data[y])
                x += 1
                n += 1
            except Exception as arr:
                m.write(lj1[n])
                continue
        # 保存
        l.save(r'D:\工作文件\cnew_data.xlsx')
    f.close()
    m.close()

主函数

if __name__ == '__main__':
    # cnew_url()
    cnew_data()

完整代码

少了一下注释,详细可看前面

import openpyxl
import requests
from lxml import etree
from tqdm import tqdm


headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}


# 组合日期链接
def cnew_url():
    f = open(r'D:/工作文件/cnew_url.txt', 'w', encoding='utf8')
    for i in range(1, 6):
        if i < 10:
            url = 'https://www.chinanews.com.cn/scroll-news/2023/020' + str(i) + '/news.shtml'
        else:
            url = 'https://www.chinanews.com.cn/scroll-news/2023/02' + str(i) + '/news.shtml'
        f.write(url + '\n')
    f.close()


def cnew_data():
    f = open(r'D:/工作文件/cnew_url.txt', encoding='utf8')  # 读取上面已经组合好的链接
    l = openpyxl.load_workbook(r'D:\工作文件\cnew_data.xlsx')
    sheet = l.active
    m = open(r'D:/工作文件/cnew_url1.txt', 'a', encoding='utf8')  # 保存报错的链接
    x = 1  # 从Excel的第几行开始写入
    for i in f:
        lj1 = []
        # 发起请求,获取页面里面的新闻链接
        req = requests.get(i.replace('\n', ''), headers=headers)
        # 设置网页编码,不设置会乱码
        req.encoding = 'utf8'
        ht = etree.HTML(req.text)
        # 获取分类的数据还有正文链接
        fl = ht.xpath("//div[@class='dd_lm']/a/text()")
        lj = ht.xpath("//div[@class='dd_bt']/a/@href")
        # 链接有两种格式,分别组合成可以用的
        for j in lj:
            if j[:5] == '//www':
                lj1.append('https:' + j)
            else:
                lj1.append('https://www.chinanews.com.cn/' + j)
        n = 0
        for k in tqdm(lj1):
            try:
                data = []
                reqs = requests.get(k, headers=headers, timeout=10)
                reqs.encoding = 'utf8'
                ht1 = etree.HTML(reqs.text)
                bt = ht1.xpath("//h1[@class='content_left_title']/text()")  # 标题
                if bt:
                    data.append([fl[n]])
                    data.append(ht1.xpath("//h1[@class='content_left_title']/text()"))  # 标题
                    data.append(ht1.xpath("//div[@class='left_zw']/p/text()"))  # 简介
                    data.append([lj1[n]])
                else:
                    data.append([fl[n]])
                    data.append(ht1.xpath("//div[@class='content_title']/div[@class='title']/text()"))
                    data.append(ht1.xpath("//div[@class='content_desc']/p/text()"))  # 简介
                    data.append([lj1[n]])
                for y in range(len(data)):
                    sheet.cell(x, y + 1).value = '\n'.join(data[y])
                x += 1
                n += 1
            except Exception as arr:
                m.write(lj1[n])
                continue
        l.save(r'D:\工作文件\cnew_data.xlsx')
    f.close()
    m.close()


if __name__ == '__main__':
    # cnew_url()
    cnew_data()

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

Python爬虫实战——爬取新闻数据(简单的深度爬虫) 的相关文章

随机推荐

  • Canvas 原生实现图片涂抹打马赛克功能

    先看效果 上图是一段打码过后的代码截图 简单说一下实现思路 就是通过创建多个canvas 一个用来绘制原图 一个用来绘制全马赛克图 一个用来绘制笔迹或者叫打码的区域 最后一个canvas用来将三个canvas绘制到一个canvas之上 主要
  • 关于解决IDEA中git的commit无效的解决方法

    关于解决IDEA中git的commit无效的解决方法 在开发中我们偶尔会遇到点击idea中commit无效的情况 点击完commit后 进度条一闪而过缺没有将代码提交上去 下面是本人总结的几种方法 一 重启IDEA 重启大法 俗话说的好 重
  • 算法与数据结构技术书籍从入门到进阶推荐适合大神小白附技术书阅读方法论【附网盘链接】

    转载自某大佬博客 https pymlovelyq github io 2018 10 06 Algorithm 前言 技术书阅读方法论 一 速读一遍 最好在1 2天内完成 人的大脑记忆力有限 在一天内快速看完一本书会在大脑里留下深刻印象
  • ubuntu安装英伟达显卡驱动

    文章目录 1 通过PPA安装 2 手动安装 3 通过ubuntu官方方法安装 4 相关命令 1 通过PPA安装 1 卸载系统里低版本的英伟达驱动 sudo apt get purge nvidia 2 把显卡驱动加入PPA sudo add
  • redis 五种数据类型的底层数据结构

    为了拿捏 Redis 数据结构 我画了 40 张图 完整版 Redis 数据结构并不是指 String 字符串 对象 List 列表 对象 Hash 哈希 对象 Set 集合 对象和 Zset 有序集合 对象 因为这些是 Redis 键值对
  • Docker安装RabbitMQ

    1 首先确保自己的虚拟机安装了Docker环境 可以通过docker v 查看自己的docker是否安装了 docker v Docker未安装可以通过下面的教程安装Docker CentOS7安装Docker教程 2 通过命令安装Rabb
  • 现代文翻译成古文_把现代文翻译成古文诗词,太雅致了!

    1 今文 身不由己古译 向来心是看客心 奈何人是剧中人 2 今文 我们越来越陌生了古译 相達何必曾相识 再看君卿已陌路 3 今文 我也不想你 你也就别想我了 古译 我断不思量 你莫思量我 4 今文 物是人非 我们回不去了 古译 柳絮随风各西
  • 关于计算机视觉中的深度信息概念

    引用 https blog csdn net a1059682127 article details 80503378 https www zhihu com question 406919125 answer 1338670936 单独使
  • kettle抽取数据中文乱码

    kettle如何解决也有一两篇谈到在建数据库连接时加characterEncoding来解决 在kettle中 数据链接中添加属性 数据源和目标 都要添加
  • 使用Vue创建一个商品展示首页

    使用Vue创建项目实现一个商品展示首页 在这篇博客中 我们将使用Vue来创建一个简单的商品展示首页 我们已经有一个后端API提供了商品信息 接口地址为 http localhost 8080 api products 返回的数据格式是JSO
  • C++猜数字小游戏-通过循环实现

    C 猜数字小游戏 通过循环实现 题目 系统随机生成一个1到100之间的数字 玩家进行猜测 如果猜错提示玩家数字过大或过小 如果猜对恭喜玩家胜利 并且退出游戏 每局游戏只能猜5次 实现 通过循环和if判断 源码 include
  • 基于SUSAN算法的边缘检测方法研究(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 SUSAN算子原理 1 2 SUSAN边缘检测算法 2 运行结果 3 Ma
  • Temporary failure in name resolution

    在启动nexus war包时出现以下提示错误 2016 05 04 13 50 12 ERROR main net sf ehcache Cache Unable to set localhost This prevents creatio
  • 路径搜索问题

    之前碰到的很多问题都可以归结为路径搜索问题 就是求两点之间的路经 1 是否存在路径 2 求任意一条路径 3 求所有路径 求是否有路径和任意一条路径的时候 和正常遍历一样 一个点被mark之后不再访问 因为如果这个结点到终点有路径 之前就应该
  • Word里如何打出带有上下横杠的大写字母i

    换成新罗马就行了
  • Linux系统中关于/etc/rc.d/rc.local中部分命令不执行的问题

    最近遇到了个奇怪的问题 费了一番周折才最终解决 在此给遇到类似问题的同学提供一条思路 在Linux系统中我们有可能需要某些命令在系统启动的时候自动运行 此时我们会想到利用文件 etc rc d rc local 按照正常逻辑 只需要将相应的
  • 通过关键字从百度中爬取相匹配图片,可以爬取多种也可以爬取一种图片

    通过re requests urlib BeautifulSoup os模块实现从百度下载指定类别图片 包含代码逐行解析 import re 进行http请求的第三方库 import requests from urllib import
  • STM32F103屏蔽JTAG/SWD 以及PC13,PC14,PC15的RTC晶振禁用。

    STM32F103屏蔽JTAG SWD 以及PC13 PC14 PC15的RTC晶振禁用 1 关于JTAG SWD屏蔽 2 PC13 PC14 PC15的RTC晶振屏蔽 1 关于JTAG SWD屏蔽 STM32F103系列上的一些IO口在标
  • 免费获取省市县的shp,geojson文件

    整理下资料 需要做准备工作 1 一个全能地图下载 https blog csdn net qq 41619796 article details 90241491 可以获取边界坐标 2 获取文件的网站 http geojson io 3 G
  • Python爬虫实战——爬取新闻数据(简单的深度爬虫)

    前言 又到了爬新闻的环节 好像学爬虫都要去爬爬新闻 没办法谁让新闻一般都很好爬呢XD 拿来练练手 只作为技术分享 这一次要的数据是分在了两个界面 所以试一下深度爬虫 不过是很简单的 数据目标 相关库 import openpyxl impo