专栏名称: 连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
目录
相关文章推荐
江西省邮政管理局  ·  江西卫视:快递进村 打通物流“最后一公里” ·  2 天前  
中央网信办举报中心  ·  中央网信办发布2025年“清朗”系列专项行动 ... ·  2 天前  
中央网信办举报中心  ·  中央网信办发布2025年“清朗”系列专项行动 ... ·  2 天前  
申妈的妹子圈  ·  阿里第三季度营收2801亿,超市场预期 ·  3 天前  
申妈的妹子圈  ·  阿里第三季度营收2801亿,超市场预期 ·  3 天前  
青岛新闻网  ·  本科毕业6年半!他已任985高校博导 ·  3 天前  
青岛新闻网  ·  本科毕业6年半!他已任985高校博导 ·  3 天前  
51好读  ›  专栏  ›  连享会

爬取政府工作报告文本

连享会  · 公众号  ·  · 2025-02-07 22:00

正文


👇 连享会 · 推文导航 | www.lianxh.cn

作者 :修博文 (重庆理工大学)
邮箱 [email protected]

温馨提示: 文中链接在微信中无法生效。请点击底部 「阅读原文」 。或直接长按/扫描如下二维码,直达原文:

1. 项目背景介绍

《政府工作报告》是一份具有法律效力的官方文件,它不仅汇总了各地区过去一年的工作成果,还展望了未来的发展蓝图,因此,它对于经济建设与发展的研究具有不可替代的价值。本文将指导你如何使用 Python 编程语言,从中国经济网这一权威平台上爬取全国各省市的《政府工作报告》。

2. 前期的准备工作

2.1 网络驱动

为了实现自动化爬虫,需要先设置网络驱动 (这里以 WebDriver 为例说明)。以下是具体步骤:

  1. 在地址栏中输入 edge://settings/help 并回车,以查看你计算机上 Edge 浏览器的版本信息。
  2. 根据 Edge 浏览器的版本信息,前往 Microsoft 官方提供的 WebDriver 下载页面:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/。
  3. 在下载页面中,找到与你的 Edge 浏览器版本相匹配的 WebDriver 版本,并下载。
  4. 下载完成后,你将得到一个文件,其名称可能不是 MicrosoftWebDriver.exe 。此时,请将该文件的名称更改为 MicrosoftWebDriver.exe
  5. 将重命名后的 MicrosoftWebDriver.exe 文件放置在与你的 Python 脚本 (.py文件) 相同的目录中。这样,当你运行 Python 脚本时,它将能够自动找到并使用这个WebDriver来驱动浏览器,实现自动化爬虫功能。

完成以上步骤后,你的环境就已经配置好了,可以开始编写 Python 代码来自动化地爬取网页内容了。

2.2 注意事项

需要注意的是,WebDriver 是随着浏览器版本的更新而变动的。一旦浏览器版本发生更新,务必前往之前提到的 WebDriver下载地址重新下载与最新浏览器版本相匹配的驱动。如果不及时更新,再次进行爬虫工作时可能会出现错误,导致工作无法正常进行。

在此,我们推荐使用微软自带的 Microsoft Edge 浏览器作为爬虫的运行环境。它的稳定性和兼容性都经过了广泛验证,能够确保爬虫的顺利进行。

对于使用 Mac 的同学来说,可以直接使用 Safari 浏览器的驱动,因为 Mac 系统自带了该浏览器的驱动,无需额外下载。但请注意,为了确保驱动的正常使用,可能需要在管理员模式下进行激活。后文将详细介绍如何更改 Safari 浏览器驱动的设置。

3. 爬虫任务的主体工作

3.1 加载爬虫使用的库

import csv
from selenium import webdriver
from bs4 import BeautifulSoup
  • csv :将所爬取的内容保存进 csv 文件中;
  • webdriver :可以理解为能够自动驱动浏览器,详见链接;
  • BeautifulSoup :爬虫必不可少的解析网页的工具。

如果没有这几个库,请在终端中输入 pip install csv 下载相关的库。如果是在 conda 环境下,请在终端中输入 conda install csv 下载相关的库。下载其余的 Python 库方法相同,此不再赘述。

3.2 解析目标链接并获内容

在爬取网页内容之前,我们首先需要访问目标网页并观察其结构。通过观察想要爬取的网页内容,我们可以确定所对应的 HTML 标签。这些标签是爬取数据的关键索引。

举例来说,当我们要爬取北京市的《政府工作报告》时,首先需要定位整个文本内容所在的 HTML 标签。通过观察页面结构,我们发现整个文本可能位于一个具有 class='content' 属性的标签内。接下来,为了更细致地爬取文本中的每一句话,我们进一步查看这些句子所对应的标签。通常,句子会被包含在

标签中,因此,通过定位这些

标签,我们就可以索引并爬取整个文本内容。

这个例子所展示的思路,实际上也是爬取其他网页上相关内容的一个通用框架。接下来,我将详细介绍本小节内容的具体实施步骤。

在爬取过程中,一个值得注意的问题是,我们所选取的政府工作报告集合网站——中国经济网,可能并不保证每年都包含所有地区的政府工作报告。这就意味着,如果某一年某个地方的政府工作报告没有被收集,那么我们的爬虫程序可能会因此中断。为了避免这种情况的发生,我们需要先判断即将爬取的下一页是否有内容。如果发现下一页没有内容,我们就应该直接跳过,并继续进行下一个页面的爬取,以此类推。

def getText(city,url,text):
    #因为有可能当年地方《政府工作报告》的没有存在于该网站,所以首先判断网页是否访问错误
    #当正常访问时
    try:
        driver.get(url)
        driver.implicitly_wait(20)
        soup = BeautifulSoup(driver.page_source, "html5lib")
        if soup:
            # 通过BeautifulSoup网页 获取报告
            if soup.find(class_='content').find_all('p'):
                # 将报告储存在content中
                content = soup.find(class_='content').find_all('p' )
                for i in content:
                    text = text + (str(i.text).strip())
            else:
                text = '文本丢失'
    #当访问不正常时
    except:
        saveText(city,text)
        return
    
    #由于文本篇幅的限制,可能一篇《政府工作报告》无法在一页全部呈现,
    #这时候就需要检查其下一页是否仍有内容存在
    #判断是否存在下一页
    try:
        nextPage = soup.find(text='下一页').find_parent('a')
        nextPageUrl = nextPage['href']
        print(nextPageUrl)
    #不存在下一页,返回text
    except:
        saveText(city,text)
        return
    
    #第一个链接解析完毕之后需要向后一个链接接着做解析
    #拼接完整的网址,访问下一页
    index = url.rfind('/') + 1
    getText(city,url[:index] + nextPageUrl, text)

3.3 将内容储保存到csv文件中

def saveText(city,text):
    #创建并打开example.csv文件,并将从网页上解析出来的内容储存到这个csv文件中
    with open('example.csv''a+',
              newline='',
              encoding='utf-8'as file:
        csv_f = csv.writer(file)
        csv_f.writerow([city, text])
    file.close()

4. 创建一个主代码块执行上述代码

当然, if __name__ == '__main__': 代码块的使用并非必需,但它的确有助于增强代码的模块化和独立性。当你在一个 Python 文件中定义函数和类时,该文件既可以作为模块被其他文件导入使用,也可以作为脚本直接运行。

if __name__ == '__main__':
    #使用Microsoft浏览器
    with open('example1.csv',
              'w+', newline='',
              encoding='utf-8'as file:
        csv_f = csv.writer(file)
        csv_f.writerow(['城市','政府工作报告报告'])
    file.close()
    driver = webdriver.Edge()  
    #使用Mac的同学直接将此处的.Edge()改为.Safari()即可,即是driver = webdriver.Safari()
    url = "http://district.ce.cn/zt/2023/zfgzbg/index.shtml"  #目标网页
    driver.get(url)
    driver.implicitly_wait(20)
    #通过BeautifulSoup获取各省市报告的标签
    soup = BeautifulSoup(driver.page_source, "html5lib")
    urlList = soup.find(class_='con').find_all('a')
    #建立一个空列表,储存获取的省市名和对应的标签
    list = []
    for i in urlList:
        list.append([i['title'],i['href']])
    #循环列表,通过网址访问各省市报告网页
    for i in list:
        txt = ''
        getText(i[0],i[1],txt)

5. 总结

5.1 完整代码

import csv
from selenium import
from bs4 import BeautifulSoup

def getText(city,url,text):

    #当正常访问时
    try:
        driver.get(url)
        driver.implicitly_wait(20)
        soup = BeautifulSoup(driver.page_source, "html5lib")
        if soup:
            # 通过BeautifulSoup网页 获取报告
            if soup.find(class_='content').find_all('p'):
                # 将报告储存在content中
                content = soup.find(class_='content').find_all('p')
                for i in content:
                    text = text + (str(i.text).strip())
            else:
                text = '文本丢失'
    #当访问不正常时
    except:
        saveText(city,text)
        return
    
    try:
        nextPage = soup.find(text='下一页').find_parent('a')
        nextPageUrl = nextPage['href']
        print(nextPageUrl)
    #不存在下一页,返回text
    except:
        saveText(city,text)
        return

    #拼接完整的网址,访问下一页
    index = url.rfind('/') + 1
    getText(city,url[:index] + nextPageUrl, text)

def saveText(city,text):
    with open('example.csv''a+',
              newline='',
              encoding='utf-8'as file:
        csv_f = csv.writer(file)
        csv_f.writerow([city, text])
    file.close()

if __name__ == '__main__':
    #使用Microsoft浏览器
    with open('example1.csv',
              'w+', newline='',
              encoding='utf-8'as file:
        csv_f = csv.writer(file)
        csv_f.writerow(['城市','政府工作报告报告'])
    file.close()
    driver = webdriver.Edge()  
    url = "http://district.ce.cn/zt/2023/zfgzbg/index.shtml"  #目标网页
    driver.get(url)
    driver.implicitly_wait(20)
    soup = BeautifulSoup(driver.page_source, "html5lib")
    urlList = soup.find(class_='con').find_all('a')
    list = []
    for i in urlList:
        list.append([i['title'],i['href']])
    for i in list:
        txt = ''
        getText(i[0],i[1],txt)

5.2 爬取结果示例

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 爬虫, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题: Python-R-Matlab






请到「今天看啥」查看全文