微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[新手]使用python爬取光明日报

第一篇爬虫文章

Hello CSDN!
我是一名python新手,前些天自己写了个爬取光明日报的爬虫练习,现在在博客分享出来。

需要用到的库

  1. requests库
    如果你的电脑上没有这个库,可以通过在命令行中输入 pip install requests 安装。

  2. BeautifulSoup库
    “美味的汤”!
    我们通过BeautifulSoup这个强大的库来解析数据和提取数据。
    如果你的电脑上没有这个库,可以通过在命令行中输入 pip install beautifulsoup4 安装。

  3. fake_useragent库
    我们通过使用这个库来伪造useragent。
    如果你的电脑上没有这个库,可以通过在命令行中输入 pip install fake_useragent 安装。

思路分析

爬取新闻网站上的新闻?听起来是个很困难的事情。
我们尝试一下将这个大问题拆分成小问题,再逐步解决小问题,然后将小问题的结果组合起来。

先把这堆库一股脑丢进去。

import requests
import time
from bs4 import BeautifulSoup
import fake_useragent
ua = fake_useragent.UserAgent()

我们要将爬取到的新闻存储下来,那么就要用到文件读写。

def write_news(a,word):#调用函数可以完成文件写入
    with open(a,mode='a',encoding='utf-8') as file:
            file.write(word)
            file.write('\n')

一般新闻的标题都是用h1标签存储,正文内容则用p标签存储。
我们用开发者工具检查其网页结构,结果确实如此。

OK,那我们就调用BeautifulSoup库里的方法吧。细节在此不做赘述了。
直接show my code.

def get_guangming_news(url,a): #调用函数获取新闻正文
    headers={'User-Agent':str(ua.random)}
    res=requests.get(url,headers=headers)
    res.encoding='utf-8'
    soup=BeautifulSoup(res.text,'html.parser')
    h1=soup.find('h1')#找到标签h1
    h1_content=h1.text
    write_news(a,h1_content)
    items=soup.find_all('div',class_='u-mainText')
    for item in items:
        items=item.find_all('p')
    for i in items:
        word=i.text
        write_news(a,word)

至此,我们完成了对某一篇文章的爬取。

那么,如果我想爬取这一天的所有新闻该怎么办呢?

爬取一天的全部新闻

为了爬取这一天的全部新闻,我们首先需要对目标网站的网页结构进行分析。

在这里插入图片描述

我们观察网页发现,每个新闻模块的网页url是固定的,同时日期最新的新闻会被排在最前面。

每一篇文章标题都被放在一个a标签中,其中href存储的是这篇文章的超链接

在这里插入图片描述

我们再来编写一个collect_urls函数来收集某天的所有url.

这个日期干脆让用户在程序入口手动输入吧,因为本人比较懒()。

#date=input('请输入要爬取的日期 例如2021-01-31')
def collect_urls(url,date): #调用函数收集网址并以列表形式返回
    urls=[]
    headers={'User-Agent':str(ua.random)}
    test=requests.get(url,headers=headers)
    test_soup=BeautifulSoup(test.text,'html.parser')
    url=test_soup.find_all('ul',class_='channel-newsGroup')
    for urls_ in url:
        x=urls_.find_all('a')
        for url_s in x :
            i=url_s['href']
            new_date=date[0:7]+'/'+date[-2:]
            if new_date in i:
                urls.append(i)
    return urls

等一下…我们仔细观察一下…好像有相对路径混入绝对路径里了,这可不行。

没办法,只能在主程序开始前加个对url的判断了。

def star_process(a,j,date,weblink):#调用函数判断<a>标签中是否缺少内容
    print(a+'ok')                  #如果不完整则补全 最终调用函数爬取所有网址
    b=collect_urls(j,date)
    c=len(b)
    newlists=[]
    k=0
    while k < c:
        if 'https' not in b[k]:
            newlist=weblink+b[k]
            newlists.append(newlist)
            k=k+1
        else:
            newlists.append(b[k])
            k=k+1
            continue
    for m in newlists:
        get_guangming_news(m,a)

接下来是程序入口了。

又臭又长警告()

#程序入口
date=input('请输入要爬取的日期 例如2021-01-31')
print('程序开始运行,请不要关闭窗口,耐心等待')
url=[   'https://news.gmw.cn/node_23548.htm',
        'https://news.gmw.cn/node_23547.htm',
        'https://news.gmw.cn/node_23545.htm',
        'https://news.gmw.cn/node_23708.htm',
        'https://politics.gmw.cn/node_9844.htm',
        'https://politics.gmw.cn/node_9840.htm',
        'https://politics.gmw.cn/node_9831.htm',
        'https://politics.gmw.cn/node_9828.htm',
        'https://world.gmw.cn/node_4661.htm',
        'https://world.gmw.cn/node_24177.htm',
        'https://world.gmw.cn/node_4696.htm',
        'https://mil.gmw.cn/node_8986.htm',
        'https://mil.gmw.cn/node_8981.htm',
        'https://mil.gmw.cn/node_8984.htm',
        'https://mil.gmw.cn/node_8982.htm',
        'https://mil.gmw.cn/node_11177.htm'
    ]
for j in url:
    if '23548' in j:
        a='新闻中心时政'+date
        weblink='https://news.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '23547' in j:
        a='新闻中心国际军事'+date
        weblink='https://news.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '23545' in j:
        a='新闻中心经济'+date
        weblink='https://news.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '23708' in j:
        a='新闻中心法治社会'+date
        weblink='https://news.gmw.cn/'
        star_process(a,j,date,weblink)
    if '9844' in j:
        a='时政频道要闻'+date
        weblink='https://politics.gmw.cn/'
        star_process(a,j,date,weblink)
    if '9840' in j:
        a='时政频道国内'+date
        weblink='https://politics.gmw.cn/'
        star_process(a,j,date,weblink)
    if '9831' in j:
        a='时政频道权威发布'+date
        weblink='https://politics.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '9828' in j:
        a='时政频道政策解读'+date
        weblink='https://politics.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '4661' in j:
        a='国际频道国际要闻'+date
        weblink='https://world.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '24177' in j:
        a='国际频道光明推荐'+date
        weblink='https://world.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '4696' in j:
        a='国际频道外媒聚焦'+date
        weblink='https://world.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '8986' in j:
        a='军事频道要闻速揽'+date
        weblink='https://mil.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '8981' in j:
        a='军事频道军事视点'+date
        weblink='https://mil.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '8984' in j:
        a='军事频道中国军情'+date
        weblink='https://mil.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '8982' in j:
        a='军事频道国际军情'+date
        weblink='https://mil.gmw.cn/'
        star_process(a,j,date,weblink)
    elif '11177' in j:
        a='军事频道邻邦扫描'+date
        weblink='https://mil.gmw.cn/'
        star_process(a,j,date,weblink)
print('爬取结束,感谢使用')

因为注意到每个模块的网页url中的数字不同,所以利用了这一特性(笑)。

用了一大串if和elif,我都感觉自己写的太烂了(逃)。

总之,好歹是能爬取了。

后记

之前本想写的惊天地泣鬼神一点,结果写完了发现是这个鸟样,对别人完全没帮助,既没介绍清楚BeautifulSoup库的一些细节,又因为自己懒,也没介绍清楚开发者工具和HTML的标签,只能沦为自娱自乐的一篇文章了。

代码写的烂,文章写的更烂。没脸见人了(ଲ),欢迎各位来鞭尸(ଲ)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我最近重新拾起了计算机视觉,借助Python的opencv还有face_recognition库写了个简单的图像识别demo,额外定制了一些内容,原本想打包成exe然后发给朋友,不过在这当中遇到了许多小问题,都解决了,记录一下踩过的坑。 1、Pyinstaller打包过程当中出现warning,跟d
说到Pooling,相信学习过CNN的朋友们都不会感到陌生。Pooling在中文当中的意思是“池化”,在神经网络当中非常常见,通常用的比较多的一种是Max Pooling,具体操作如下图: 结合图像理解,相信你也会大概明白其中的本意。不过Pooling并不是只可以选取2x2的窗口大小,即便是3x3,
记得大一学Python的时候,有一个题目是判断一个数是否是复数。当时觉得比较复杂不好写,就琢磨了一个偷懒的好办法,用异常处理的手段便可以大大程度帮助你简短代码(偷懒)。以下是判断整数和复数的两段小代码: 相信看到这里,你也有所顿悟,能拓展出更多有意思的方法~
文章目录 3 直方图Histogramplot1. 基本直方图的绘制 Basic histogram2. 数据分布与密度信息显示 Control rug and density on seaborn histogram3. 带箱形图的直方图 Histogram with a boxplot on t
文章目录 5 小提琴图Violinplot1. 基础小提琴图绘制 Basic violinplot2. 小提琴图样式自定义 Custom seaborn violinplot3. 小提琴图颜色自定义 Control color of seaborn violinplot4. 分组小提琴图 Group
文章目录 4 核密度图Densityplot1. 基础核密度图绘制 Basic density plot2. 核密度图的区间控制 Control bandwidth of density plot3. 多个变量的核密度图绘制 Density plot of several variables4. 边
首先 import tensorflow as tf tf.argmax(tenso,n)函数会返回tensor中参数指定的维度中的最大值的索引或者向量。当tensor为矩阵返回向量,tensor为向量返回索引号。其中n表示具体参数的维度。 以实际例子为说明: import tensorflow a
seaborn学习笔记章节 seaborn是一个基于matplotlib的Python数据可视化库。seaborn是matplotlib的高级封装,可以绘制有吸引力且信息丰富的统计图形。相对于matplotlib,seaborn语法更简洁,两者关系类似于numpy和pandas之间的关系,seabo
Python ConfigParser教程显示了如何使用ConfigParser在Python中使用配置文件。 文章目录 1 介绍1.1 Python ConfigParser读取文件1.2 Python ConfigParser中的节1.3 Python ConfigParser从字符串中读取数据
1. 处理Excel 电子表格笔记(第12章)(代码下载) 本文主要介绍openpyxl 的2.5.12版处理excel电子表格,原书是2.1.4 版,OpenPyXL 团队会经常发布新版本。不过不用担心,新版本应该在相当长的时间内向后兼容。如果你有新版本,想看看它提供了什么新功能,可以查看Open