某政府网站信息文章标题、链接、刊布时间等信息获取


一、需求信息

需要信息: 每个内容下开篇的索引号、发布机构、组配分类、标题、发布时间和链接地址,部分实例如下图:
在这里插入图片描述
上图中左侧的目录结构对应的刊布信息中的如下信息:
在这里插入图片描述

题外话:有些日子没有爬取过信息了,本来就是个菜鸟,时间间隔的一久,真的感觉忘得光光的。有种重头再来的感觉。
还是要时常回头看看,不时的回顾回顾,不然知识它真的不进脑子啊。

二、过程感触

爬虫只是自己之前突发想法,就看了一点书籍,顺带简单练了练手,接触的很是浅显,诸如怎么用Scrapy这种专业的方式去获取,就一直没研究。或许是现在没啥需求吧,学习的动力也就不足。

言归正传,目前初步的一个体验就是看到的网页的源码信息,自己找不到对应的 真实 地址信息,因此时常扑空。如果找到了地址信息,获取具体的信息的逻辑加工,反倒变得简单了。毕竟获取的信息都是很规范化的。
比如这个目录结构,我就是从这个地方才发现:
在这里插入图片描述
这才打开了实现的一道口子,至于具体文章的信息获取,这个位置的信息就很好处理,没有那么多的“坑”。
爬虫,某种程度上就是在找获取的信息地址的跳转间的逻辑关系,理清了这一点,其他的具体信息的获取、存放,感觉相对来说就不是那么复杂了。当然,还有一个最大的问题就是反爬问题,这个问题就复杂,还不在自己的重点考虑范围,毕竟获取的信息基本都是公开的,也不涉及很多的信息和很大的数据量。

时常还是要爬爬,不然真的就不会了。

欢迎提需求,共同探讨,学习!

三、实战code

说一千,道一万,还是扎扎实实的干吧,实战为王!!!

# 导入库
from bs4 import BeautifulSoup
import re
import pandas as pd
import json
import requests
import time 

# url = "http://www.****.***.cn/col/col156912/index.html?vc_xxgkarea=371700000000&number=&jh=263"
get_headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/**.*****.Safari/537.36",
    "Host": "www.****.***.cn",
    "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6"
}
post_headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6',
    'Connection': 'keep-alive',
    'Cookie': 'cod=*******************************************',# 根据自己电脑配置
    'Host': 'www.****.***.cn',
    'Origin': 'http://www.****.***.cn',
    'Referer': 'http://www.****.***.cn/module/xxgk/tree.jsp?area=&divid=div156912&showwebname=1&limit=0&standardXxgk=1&isGB=1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}
tree_url = "http://www.****.***.cn/module/xxgk/tree.jsp?area=&divid=div156912&showwebname=1&limit=0&standardXxgk=1&isGB=1"

获取目录信息,以及对应的id,为了获取不同目录信息下的内容信息。


html = requests.get(tree_url,headers=get_headers)
soup = BeautifulSoup(html.text,'lxml')
mulu_tree = soup.findAll('script')[2]
mulu_split = (str(mulu_tree).split('\n'))[1].split(';">')

mulu_list = []    # 存放目录名和 对应的id 信息
for i in range(len(mulu_split)):
    try:
        mulu_id = re.search(r"funclick\(.*\\\'\,\\\'",mulu_split[i])
        mulu_id = mulu_id.group()
        mulu_id = re.search(r'\'.*\',',mulu_id)
        mulu_id = mulu_id.group()
        mulu_id = mulu_id[1:-3]                     # infotypeId
        
        mulu_name = re.search(r".*</a>\'\);",mulu_split[i])
        mulu_name = mulu_name.group()
        if len(mulu_name)>50:
            continue
            
        mulu_name = mulu_name[:-7]  # 目录链的名称
        
        mulu_list.append([mulu_name,mulu_id]) 
    except:
        pass

开始获取不同目录页面下的文章对应的想要获取的具体信息。

result = [] # 存放结果

post_data = {
    'divid': 'div156912',
    'infotypeId': 'HZA10202040206',
    'jdid': 62,
    'area': '',
    'standardXxgk': 1
}
url = 'http://www.****.***.cn/module/xxgk/search.jsp?'
num = 0
count = 0
for mulu_name,mulu_id in mulu_list:
    num +=1
    print(num,mulu_name,mulu_id)
    post_data['infotypeId'] = mulu_id
    
    html = requests.post(url,headers=post_headers,data=post_data)
    html.encoding='utf-8' # 将编码格式改为utf-8
    soup = BeautifulSoup(html.text,'lxml')

    first_message = soup.findAll('div',class_="zfxxgk_zdgkc")
    
    ########################################################################################
    messages = re.findall('<a.*</a>',str(first_message),re.M)
    for i in range(len(messages)):
        try:
            href = "http://www.****.***.cn/"+re.findall('/art.*html',messages[i],re.M)[0]   # 链接地址
        except:
            continue
        title = re.findall('title=".*"',messages[i],re.M)[0].split('"')[1]              # 标题

        # 链接里边的信息
        html_two = requests.get(href,headers=get_headers)
        html_two.encoding='utf-8' # 将编码格式改为utf-8
        soup_two = BeautifulSoup(html_two.text,'lxml')
        message_two = soup_two.findAll('table')
        if message_two:
            fabu_date = soup_two.find('span',class_='date').text[5:-6] # 发布日期
            six_mes = message_two[2].findAll('td')                    
            index_num = re.sub(r'\s*','',six_mes[1].text)              # 索引号
            gongkai = re.sub(r'\s*','',six_mes[3].text)                # 公开方式
            fabu = re.sub(r'\s*','',six_mes[5].text)                   # 发布机构
            fenlei = re.sub(r'\s*','',six_mes[7].text)                 # 组配分类
            wenhao = re.sub(r'\s*','',six_mes[9].text)                 # 发文文号
            try:
                youxiaoxing = re.sub(r'\s*','',six_mes[11].text)           # 有效性
            except:
                youxiaoxing=''
                      result.append([mulu_name,mulu_id,title,href,fabu_date,index_num,gongkai,fabu,fenlei,wenhao,youxiaoxing])
            count +=1
        print(count)

        time.sleep(1) # 程序休眠5s
#     num +=1
#     if num>2:
#         break
        
result = pd.DataFrame(result,columns=['对应目录','目录id','标题','链接地址','发布日期','索引号','公开方式','发布机构','组配分类','发文文号','有效性'])
result.to_excel('网站信息获取结果2.xlsx')

部分结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

积跬步,慕至千里

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值