我是靠谱客的博主 无奈水池,最近开发中收集的这篇文章主要介绍建筑标准何其之多,python爬虫半天全梭,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

人生苦短,我用python。
Python之爽,莫过爬虫。
建筑标准真是多如六毛,住建部网站公开发布的就有近千条。还好住建部将各类标准进行了公开发布,可免费下载。要是手工全部下载,也太lowB了,也是对自己的耐性是个极大的考验,光干这个枯燥的事怕是也要个三五天。
我会python我怕谁,写个爬虫半天全撸完,看着自动下载的上千的标准文件,想想都暗爽,说干就干。

一、网站分析

1.进入住建部官网http://www.mohurd.gov.cn/,进入标准定额,再进标准发布公告,记下网址http://www.mohurd.gov.cn/bzde/bzfbgg/index.html,这个就是我们要爬取的第一个页面内容。可以看到,公布的标准共有50页,每页有20条标准。点击下一页,网址变成http://www.mohurd.gov.cn/bzde/bzfbgg/index_2.html,你会发现每一页的链接地址就是在首页的地址后面加上’_n’,找到地址规律就为自动爬取奠定基础了。
在这里插入图片描述

2.然后随便找一页网页进行结构分析,要从中提取出下载链接的页面。在网页上点击鼠标右键,选择“检查”就可以看到网页的结构了,找到我们要提取的目标链接地址,分析一下是否存在规律。在这里不得不吐槽一下,这个网页结构写的,太无语了,所有节点属性连一个class属性都没有,整个网页也没一点CSS样式,这个水平就能交差,看来政府的钱真是好赚啊。因为网页毫无章法,给内容提取确实带来了一点困扰,不过总算找到一点规律,每个a标签里都有个target=_blank的属性,总算是可以进行简单提取了。这里也有坑,将在程序中注明。
在这里插入图片描述

3.点击进入下载页面,进一步分析下载页面的网页结构。通过网页检查查看网页html结构,好歹这个页面的a标签的上一级有一个class=”attlink”的属性,这个提取下载链接就轻松多了,通过程序提取下载链接和文件名,就可以自动下载和保存文件了。这里也有坑,你会发现下载链接的写法根本不一致。

二、python程序实现

1.环境准备
IDE:pycharm
发送请求:requests模块
网页解析:beautifulsoup, re模块
2.获取网页html

def get_html(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
    }
    response = requests.get(url, headers=headers)
    response.encoding = response.apparent_encoding
    html = response.text
    return html

3.获取总页数

def get_total_page(url):
    html = get_html(url)
    total_page = re.findall('共(d*?)页', html)[0]
return int(total_page)

4.获取单页下载页链接

def get_links(url):
    links = []
    html = get_html(url)
    soup = BeautifulSoup(html, 'html.parser')
    select_result = soup.find_all('a', attrs={"target":"_blank"})
    result = select_result[:-2]
    for item in result:
        links.append(item['href'])
    return links

5.获取所有下载页链接

def get_all_links(total_page):
    all_links = []
    for i in range(total_page):
        if i == 0:
            url = url_base + '.html'
        else:
            url = url_base + '_' + str(i + 1) + '.html'
        links = get_links(url)
        all_links = all_links + links
        print('正在获取第{}页链接...'.format(i+1))
    return all_links

6.获取下载文件地址和文件名

def get_file_link(links):
    file_links = []
    i = 0
    for link in links:
        i+=1
        print('正在获取第%d个标准下载链接...'%(i))
        print(link)
        html = get_html(link)
        soup = BeautifulSoup(html, 'html.parser')
        select_result = soup.select('.attlink > a')
        if len(select_result)>0:
            result = select_result[0]
            link_temp = result['href']
            if re.search('download', link_temp):
                file_link = link_temp
            else:
                file_link = 'http://www.mohurd.gov.cn' + link_temp
            file_name = result.text + '.pdf'
            file_links.append([file_link, file_name])
        time.sleep(0.5)
    return file_links

7.下载和保存文件

def save_file(file_links):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)
    }
    i = 0
    for link in file_links:
        i += 1
        print('正在下载第%d个标准...'%(i))
        response = requests.get(link[0], headers=headers)
        file_content = response.content
        f = open(link[1], 'wb')
        f.write(file_content)
        time.sleep(0.5)

三、避坑与小结

1.用target=_blank属性提取下载页面地址时,会有网站底部信息链接一同被提取出来,要进行二次筛选。
2.提取到的文件下载地址,有的是相对地址,这时需要进行补全,有的是绝对地址,这时直接保存即可。
3.有些公告下面没有附下载文件,是提取不到下载链接的,要注意跳过。
在这里插入图片描述

文件下载还是要费一定周期的,一定要处理好各种意外,以免程序中断又全部重来。处理规避好各种坑之后,就可以蹭蹭下载了,看到满屏的白嫖文件,确实有点神清气爽、洋洋得意啊。

最后

以上就是无奈水池为你收集整理的建筑标准何其之多,python爬虫半天全梭的全部内容,希望文章能够帮你解决建筑标准何其之多,python爬虫半天全梭所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部