【爬虫入门练习日记12】危化品事故信息网数据爬取

一、本次爬取要求

爬取危化品事故信息网当中关于危化品在运输的过程中所造成的事故数据,并把下面table所展示的数据储存在Excel表格当中,事故所对应的详情页中的数据储存在txt文件当中。方便后续数据处理。

二、table数据获取

#-*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import xlwt  # 导入写入excel需要的包
import openpyxl
# 创建一个工作簿
workbook = openpyxl.Workbook()

# 选择默认的工作表
sheet = workbook.active
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}
for num in range(1, 130):
    url = f'http://accident.nrcc.com.cn:9090/Portalsite/SearchResult.aspx?pmenu=27876dcf-10d8-41d2-897c-67ff37286e9a&menu=36958f7a-e215-44d7-824d-4f68b3499ef7&pagenum={num}&sgk=&sgmc=&begindate=&enddate=&gnw=&sheng=&shi=&qx=&wzmc=&sglx=&sgbk=&sgjb=&czjd=&gylx=&sbzz=&sfhj=6fd620ee-e56c-4efc-a703-976b53b4c06a&qymc=&qyxz=&swrs1=&swrs2=&param='
    response = requests.get(url=url, headers=headers)

    # 发送请求并获取响应内容
    html_content = response.text

    # 使用BeautifulSoup库解析HTML内容
    soup = BeautifulSoup(html_content, 'html.parser')

    # 查找表格元素
    table = soup.find('table')

    # 获取所有行
    rows = table.find_all('tr')

    # 创建空列表来存储数据
    accident_name = []
    accident_country = []
    accident_areas = []
    accident_time = []
    accident_level = []
    accident_type = []
    # 遍历所有行,并将每行的所有单元格的文本添加到列表中
    for row in rows:
        cells = row.find_all('td')
        if len(cells) > 1:
            row_data = [cell.text.strip() for cell in cells]
            # data.append(row_data)
            accident_name.append(row_data[0])
            accident_country.append(row_data[1])
            accident_areas.append(row_data[2])
            accident_level.append(row_data[3])
            accident_type.append(row_data[4])
            accident_time.append(row_data[5])
            # data.append({
            #     "en": row_data[0],
            #     "short": row_data[1],
            #     "shortLen3": row_data[2],
            #     "numberCode": row_data[3],
            #     "iso": row_data[4],
            #     "name": row_data[5],
            #    # "isTndependent": row_data[6],
            # })

    # print(accident_name)
    # print(accident_areas)
    # print(accident_country)
    # print(accident_type)
    # print(accident_level)
    # print(accident_time)
    acciendet_total = [accident_name, accident_country, accident_areas, accident_level, accident_type, accident_time]
    # print(acciendet_total)  # 运行结果:一页表格的内容为一个列表
    # [['广西贺州液化石油气罐车侧翻事故', '美国俄亥俄州马其顿“1.31”柴油罐车爆炸事故', '云南杭瑞高速公路液态氧气罐车泄漏事故', '蒙古国乌兰巴托“1.23”油罐车爆炸事故', '湖南益阳液化石油气罐车侧翻事故', '甘肃庆阳油罐车撞击火灾事故', '重庆南岸区加油站罐车泄漏事故', '尼日利亚夸拉州“1.15”油罐车撞击火灾事故', '山东东营油罐车追尾撞击事故', '贵州遵义油罐车清洗工中毒事故'],
    # ['国内', '国外', '国内', '国外', '国内', '国内', '国内', '国外', '国内', '国内'],
    # ['广西壮族自治区', '美国', '云南省', '蒙古国', '湖南省', '甘肃省', '重庆', '尼日利亚', '山东省', '贵州省'],
    # ['一般以下', '一般', '一般以下', '重大', '一般以下', '一般', '一般以下', '较大', '一般以下', '一般以下'],
    # ['其他事故', '爆炸', '泄漏', '爆炸', '其他事故', '火灾', '泄漏', '火灾', '其他事故', '中毒'],
    # ['2024-02-03', '2024-01-31', '2024-01-27', '2024-01-23', '2024-01-21', '2024-01-19', '2024-01-19', '2024-01-15', '2024-01-14', '2024-01-14']]

# 将数据逐行写入工作表
    for row in acciendet_total:
        sheet.append(row)

# 保存工作簿到指定文件路径
workbook.save('output.xlsx')
# 输出列表
# print(data)

三、详情页数据获取

import requests
from bs4 import BeautifulSoup
from lxml import etree
import time
import pandas as pd
headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0"}
url_list = []

for num in range(100, 130):
    base_url = f'http://accident.nrcc.com.cn:9090/Portalsite/SearchResult.aspx?pmenu=27876dcf-10d8-41d2-897c-67ff37286e9a&menu=36958f7a-e215-44d7-824d-4f68b3499ef7&pagenum={num}&sgk=&sgmc=&begindate=&enddate=&gnw=&sheng=&shi=&qx=&wzmc=&sglx=&sgbk=&sgjb=&czjd=&gylx=&sbzz=&sfhj=6fd620ee-e56c-4efc-a703-976b53b4c06a&qymc=&qyxz=&swrs1=&swrs2=&param='
    response = requests.get(url=base_url, headers=headers)
    # result = response.content.decode('utf-8')
    # result = result.replace('<!--', '').replace('-->', '')
    page_text = response.text
    tree = etree.HTML(page_text)
    id_information = tree.xpath(
        '//div[@class="con_sea_end"]//table[@class="table con_sea_end_table table-striped table-hover "]//td/a/@href')
    # print(id_information)   # 列表
    # ['Content.aspx?pmenu=27876dcf-10d8-41d2-897c-67ff37286e9a&menu=36958f7a-e215-44d7-824d-4f68b3499ef7&id=30bb52ef-c7ff-4b6c-9435-f84fc1bbc0e1',
    # 'Content.aspx?pmenu=27876dcf-10d8-41d2-897c-67ff37286e9a&menu=36958f7a-e215-44d7-824d-4f68b3499ef7&id=a7b06c1e-0c86-4fc7-9fe3-d2a68f9ac64e',
    # 'Content.aspx?pmenu=27876dcf-10d8-41d2-897c-67ff37286e9a&menu=36958f7a-e215-44d7-824d-4f68b3499ef7]
    # title_accident1 = tree.xpath('//div[@class="con_sea_end"]//table[@class="tablecon_sea_end_table table-striped table-hover "]//td[6]/text()')
    # title_accident = tree.xpath('/html/body/div[1]/div[3]/div[1]/div[2]/div[3]/div[1]/table/tbody/tr[6]/td[2]/text()')
    # print(title_accident1, title_accident)   # 空列表?

    name = tree.xpath(
        '//div[@class="con_sea_end"]//table[@class="table con_sea_end_table table-striped table-hover "]//a[@href]/text()')
    # print(name)   # 列表,运行结果就是每页的事故名称为一个单独的列表
    # ['印度中央邦“3.10”油罐车高处坠落事故', '美国北卡罗来纳州马修斯“3.6”化学品泄漏事故', '浙江嘉兴一出租车天然气泄漏事故', '菲律宾马尼拉盐酸罐车“3.3”泄漏事故', '海南琼海罐车侧翻泄漏事故', '西藏林芝槽罐车泄漏事故', '瑞士纳沙泰尔地区“2.29”油罐车起火事故', '孟加拉国达卡“2.27”燃气管道泄漏爆炸事故',
    # '巴基斯坦旁遮普省Mian Channu地区“2.27”油罐车火灾事故', '湖南娄底液氨罐车火灾事故']
    for j in range(0, len(id_information)):
        id_detail = "http://accident.nrcc.com.cn:9090/Portalsite/" + id_information[j]
        response_detail = requests.get(url=id_detail, headers=headers)
        page_text_detail = response_detail.text
        tree_detail = etree.HTML(page_text_detail)
        detail_accident = tree_detail.xpath("/html/body/div[1]/div[3]/div[1]/div[2]/div[3]/div/p[1]/text()")
        # print(detail_accident)  # 每个事故的介绍为一个列表
        # ['3月10日,印度中央邦Raisen 地区一辆油罐车因车辆失控坠入峡谷,导致2人死亡。']
        # ['3月6日,美国北卡罗来纳州马修斯485号州际公路发生化学品泄漏,导致交通严重拥堵并引发环境安全担忧。']
        # print(name[j] + ":" + detail_accident[0])
        with open("shi.txt", "a", encoding="utf-8") as fp:
            fp.write(name[j] + "\n")
            fp.write(detail_accident[0] + "\n")
print("写入成功")

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值