爬虫实战1-批量获取公开政策文本

2023-10-26

本文未展示图片,可以跳转到我的博客园浏览代码和操作流程~

博客园-艽野尘梦

目标:爬取北京市公开发布的所有人才引进相关的政策文本

准备:1、环境 Python 3.7,2、使用 selenium 库中的 webdriver,3、安装对应版本的 chromedriver

url:在北京市人民政府网站上,人才引进相关政策的 url 地址是:https://www.beijing.gov.cn/so/s?siteCode=1100000088&tab=zcfg&qt=%E4%BA%BA%E6%89%8D%E5%BC%95%E8%BF%9B

一些参考:(1 条消息) Python 爬虫(1)一次性搞定 Selenium(新版)8 种 find_element 元素定位方式_find_element(by.class_name_轻烟飘荡的博客 - CSDN 博客

(1 条消息) Selenium — 标签 class 及其他属性值更改_selenium 修改属性值_Ethel L 的博客 - CSDN 博客

目标网站 html 内容

在浏览器输入 url,可以看见网站的基本内容见下图,我们需要爬取的是图中画线部分:

接下来看一下画线部分的 html 文本,可以看见每一个政策条目都都在 class 为’search-result’的 div 标签里,查看这个 div 标签,我们可以看见政策的类型,标题,链接等内容。

那么只需要找到所有的 class 为’search-result’的 div 标签,然后循环搜索里面的信息(注意 a 标签里的链接是关键信息,后续需要爬取链接里的具体政策内容),并保存到 csv 文件中。这里使用的是 find_element_XX_XX 函数,如果 selenium 版本比较新,可能这几个函数无法使用了,可以改为使用 find_element(By.xx,‘xx’),这里需要引入 selenium.webdriver.common.by。

解决 js 渲染的翻页内容

在查看网页的过程中,发现跳转下一页的内容,url 并未发生变化,是根据 JavaScript 动态渲染出的内容,这里就使用 find_element 找到下一页的按钮然后 click 它。代码位于 29 行和 44 行。

解决搜索位置的切换

还有一个需求是按标题检索含有 “人才引进” 的政策文本,查看 html 发现,这两个在交互中能够点击的标签在 html 中是 div 标签,一般来说,div 标签是无法点击的,并且初步来看这里没有 js 代码,但是切换搜索位置是全文还是标签,url 并没有改变。这也是我比较困惑的地方,如果有了解的大佬可以在评论中解决一下我的疑惑。虽然不太知道这里的原因,但是我发现点击标题,则标题的 class 变为 position-con item-choose item-choose-on,全文的 class 变为 position-con item-choose,点击全文则反过来,那么我们可以执行 js 代码修改这两个标签的属性,实现搜索位置的切换,代码位于 17-21 行。

具体代码如下:

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 28 16:46:21 2023

@author:
"""

from selenium import webdriver
import time
import pandas as pd
from selenium.webdriver.common.by import By

browser=webdriver.Chrome()
browser.get('https://www.beijing.gov.cn/so/s?siteCode=1100000088&tab=zcfg&qt=%E4%BA%BA%E6%89%8D%E5%BC%95%E8%BF%9B')
time.sleep(5)

lable=browser.find_elements(By.CSS_SELECTOR,'.position-con.item-choose')#查找全文和标题的检索项
print(lable[0].text,lable[1].text)
js= 'arguments[0].setAttribute(arguments[1],arguments[2])'
browser.execute_script(js,lable[0],'class','position-con item-choose')#修改全文标签的class
browser.execute_script(js,lable[1],'class','position-con item-choose item-choose-on')#修改标题标签的class


time.sleep(2)
data=pd.DataFrame([],columns=['类型','链接','标题','文号','发文机构','主题分类','发布日期'])
page=1
while page:
    if page !=1:
        page.click()
        time.sleep(1)
    poli=browser.find_elements_by_class_name('search-result')
    for elements in poli:#一个elements是一个记录
        p_type=elements.find_element_by_class_name("result-header-lable").text#政策类型
        link=elements.find_element_by_tag_name("a").get_attribute('href')#链接
        title=elements.find_element_by_tag_name("a").text#标题
        table=elements.find_elements_by_class_name("row-content")#文号、发文机构、主题分类、发布日期
        content=[p_type,link,title]
        for item in table:
            content.append(item.text)
        while len(content)<7:
            content.append(0)
        content=pd.DataFrame([content],columns=['类型','链接','标题','文号','发文机构','主题分类','发布日期'])
        data=pd.concat([data,content])
    page=browser.find_element_by_class_name('next')
data.to_csv(r'人才政策爬取\北京市人才政策.csv',encoding='utf_8_sig',index=False)

提取政策的具体内容

在上面的代码中,我们实现了爬取所有标题含 “人才引进” 的政策的大致信息,结果类似下图的表格内容。

接下来需要做的是逐个读取每个政策的链接,将其中的文本内容提取到 txt 文件中,从 html 文本中可以看到文本内容均位于 id='mainText’的 div 标签中,每个 p 标签为一个需要换行的段落。

下面的代码实现了这个过程:

# -*- coding: utf-8 -*-
"""
Created on Tue Mar 28 21:41:39 2023

@author:
"""

import pandas as pd
from selenium import webdriver
import time
import numpy as np
from selenium.webdriver.common.by import By

files=pd.read_csv(r'人才政策爬取\北京市人才政策.csv',\
                  encoding='utf-8',header=0)
files_link=files[['链接','标题']]
files_link=np.array(files_link)
files_link=files_link.tolist()
print(files_link)
browser=webdriver.Chrome()
time.sleep(3)
for link,title in files_link:
    with open(r"人才政策爬取\北京市政策文本\\"+title+'.txt',"w") as f:
        f.write(title+'\n')
        browser.get(link)
        time.sleep(1)
        out_time=browser.find_element_by_xpath("//*[contains(text(),'[发布日期]')]").text
        f.write(out_time+'\n')
        content=browser.find_element(By.ID,'mainText')
        lines=content.find_elements_by_tag_name('p')
        for line in lines:
            f.write(line.text+'\n')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫实战1-批量获取公开政策文本 的相关文章

随机推荐

  • 万字长文解读Stable Diffusion的核心插件—ControlNet

    目录 一 介绍 二 使用方法 三 ControlNet结构 1 整体结构 2 ControlLDM 3 Timestep Embedding 4 HintBlock 5 ResBlock 6 SpatialTransformer 7 SD
  • 华为OD机试真题-预定酒店【2023Q2】【JAVA、Python、C++】

    题目描述 放暑假了 小明决定到某旅游景点游玩 他在网上搜索到了各种价位的酒店 长度为n的数组A 他的心理价位是x元 请帮他筛选出k个最接近x元的酒店 n gt k gt 0 并由低到高打印酒店的价格 备注 1 酒店价格数组A和小明的心理价位
  • SSM框架做前后端分离项目

    目录 步骤 1 先运行 看到效果 再学习 步骤 2 模仿和排错 步骤 3 本知识点效果 步骤 4 jquery min js 步骤 5 json中文问题 步骤 6 CategoryController 步骤 7 submit html 步骤
  • http://www.vcipl.okstate.edu/publications.html(资源转载)

    Visual Computing and Image Processing Lab Oklahoma State University Imaging Processing nferencing and Learning Home
  • UE4模型轮廓描边及轮廓发光

    参考自 https zhuanlan zhihu com p 81310476 1 在项目设置里把Custom Depath Stencil Pass改为Enabled with Stencil 这样蒙版值才会生效 2 在模型Renderi
  • 基于Lua的选择排序算法实现

    选择排序思想的核心 首先在未排序序列中找到最小 大 元素 存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小 大 元素 然后放到已排序序列的末尾 重复第二步 直到所有元素均排序完毕 说直白点 以从小到大排序来说 就是 第一轮找到最小
  • scrapy调试正常,输出为空的原因。。

    scrapy调试正常 情况 从xx网站抓取数据 内容正常 标题我重新处理过 调试也正常 执行爬虫 打印的时候为空 分析如下 1 源代码里是h2 2 xpath里写的是h2 并且调试也能正常抓取到 3 抓取后的数据已经从h2变成了h3 4 把
  • YOLO系列目标检测算法——PP-YOLOE

    YOLO系列目标检测算法目录 文章链接 YOLO系列目标检测算法总结对比 文章链接 YOLOv1 文章链接 YOLOv2 文章链接 YOLOv3 文章链接 YOLOv4 文章链接 Scaled YOLOv4 文章链接 YOLOv5 文章链接
  • linux下.run文件的安装与卸载

    run文件的安装很简单 只需要为该文件增加可执行属性 即可执行安装 以 virtualbox 的安装文件 virtualbox 3 1 6 59338 Linux x86 run为例 只需要输入命令 chmod x virtualBox 3
  • Windows的路由命令

    Route Displays and modifies the entries in the local IP routing table Used without parameters route displays help Syntax
  • React 类组件和hooks函数式组件对比

    在学习时 先接触的class组件之后才是带有hooks的函数式组件 可能是自己大脑更偏向于有了这种方式解决干嘛又要学另外的 自己也比较清楚this的指向问题 所以就更偏向于使用class组件 可是 视频课以及各种文章都在推崇hooks 打算
  • 通过AI工具(ChatGPT接口)生成一字未改的论文,查重率4.2%,可以直接当作论文使用

    论文题目 基于AIOT技术的能源控制器的设计以及应用 查重结果 4 2 AI工具国内体验 关注 码视野 回复关键字 1002 一 引言 随着全球经济的快速发展和人口的增长 对能源的需求日益增加 然而 能源的消耗不仅增加了人们的负担 还对环境
  • openGL之API学习(二十四)glGetError

    返回opengl操作的错误标志 调用后会将错误标志设置为GL NO ERROR GLenum glGetError void
  • ubuntu16.04 Server版本固定IP地址

    1 打开 etc network interfaces 2 进行下面修改
  • 【微机原理与接口技术】8253+8255实验

    目录 实验内容 1 8253定时实验 利用8253完成1秒的延时 2 利用8253硬件延时控制跑马灯运行 3 8255键盘显示实验 实验内容 1 8253定时实验 利用8253完成1秒的延时 2 利用8253硬件延时控制跑马灯运行 3 82
  • 蓝桥杯——基础——数列排序

    问题描述 给定一个长度为n的数列 将这个数列按从小到大的顺序排列 1 lt n lt 200 输入格式 第一行为一个整数n 第二行包含n个整数 为待排序的数 每个整数的绝对值小于10000 输出格式 输出一行 按从小到大的顺序输出排序后的数
  • 【matlab】matlab算法封装成工具包提供给程序调用

    说明 1 非进程通讯协议 无需在电脑上安装完整版的matlab开发环境 2 本项目以C 为案例 调用的语言不限 操作流程基本相同 一 准备工作 1 安装MATLABWebAppServerSetup集成开发环境 2 安装Visual std
  • 网络综合布线七大子系统详解(图解)

    根据 GB50311 2007 综合布线系统工程设计规范 国家标准规定 网络综合布线七大子系统包括 1 工作区子系统 2 水平子系统 3 垂直子系统 4 管理间子系统 5 设备间子系统 6 进线间子系统 新加的 7 建筑群子系统 工作区子系
  • Unity 2017.3针对相机的DynamicResolution (比如UI分辨率不变,改变3D场景分辨率 来提高性能)

    在之前一种优化方式是改变 屏幕分辨率 https docs unity3d com 2017 3 Documentation ScriptReference Screen resolutions html 在 Unity 2017 3 中增
  • 爬虫实战1-批量获取公开政策文本

    本文未展示图片 可以跳转到我的博客园浏览代码和操作流程 博客园 艽野尘梦 目标 爬取北京市公开发布的所有人才引进相关的政策文本 准备 1 环境 Python 3 7 2 使用 selenium 库中的 webdriver 3 安装对应版本的