爬取网站某网站所有通知

最近在写论文,需要用到一些通知,刚开始学习python来做爬虫爬取相关数据,本次使用了python的第三方库requests和内嵌的正则表达式库进行爬取相关资料,并保存到本地。

导入模块

import requests  #导入requests库
import re  #导入正则表达式库

伪装身份

user = {
    'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)'    
    #打开浏览器输入:“about:version”,查看“用户代理”,即本机的user-agent
}

分析和拼接网址

打开官网后寻找到有关通知的网址为:“http://sousuo.gov.cn/column/30471/0.htm”,网址具有一定的规律性,即最后的每一个数字变化代表了翻页内容。通过range()函数和for语句来变换网址

for a in range(0,14):  #用for语句和range()函数来一次获得数字0-14
    url = "http://sousuo.gov.cn/column/30471/" + str(a) +'.htm'  #将获得的数字和网址进行拼接得到15个网址,注意要将变量a用str()转换为字符串才能拼接
    #print(url)    #为了测试是否成功进行打印查看

访问网址和获得网页内容

    response = requests.get(url,headers = user)       #用requests库的get函数访问网页,用headers进行伪装
    #print(response.text)    #打印网页
    html = response.text                             #用文本显示访问网页得到的内容
    print(html)  #打印网页内容,以便于使用正则表达式

访问网址和获得网页内容

用正则表达式来获得每个文件的网址

    urls = re.findall('<a href=".*?" target="_blank">',html)  #用正则表达式获得文件网址
    #print(urls)   #为了测试是否成功进行打印查看
    urls = "".join(urls)    #将列表转化为字符串
    url_wj = re.findall('[a-zA-z]+://[^\s"]*',urls)  #提取网页中的每个文件具体网址
    #print(url_wj)   #为了测试是否成功进行打印查看

获取每个文件页面的信息

用for语句来获得每个页面的信息

    for url in url_wj:  #用for语句来实现依次访问每个文件的网址
        response_gwy = requests.get(url,headers = user)  #用变量response_gwy保存访问网址后获得的信息
        resopnse_gwy_wz = response_gwy.content.decode('utf-8')  #用'utf-8'的编码模式来记录网址内容,防止出现中文乱码
        #print(resopnse_gwy_wz)    #为了测试是否成功进行打印查看
        tznr = re.findall('<p style="text-indent: 2em; font-family: 宋体; font-size: 12pt;">(.*?)</p>',resopnse_gwy_wz)  #用正则表达式来获得文件的文字内容,清除多余的代码
        tznr = "".join(tznr)  #将获得的文字内容由列表转换为字符串
        #print(tznr)  #为了测试是否成功进行打印查看

获取每个文件的标题

        wjym = response_gwy.content.decode('utf-8')  #用变量wjym保存获得的页面信息
    #print(wjym)
        title = re.findall('<title>(.*?)</title>',wjym)  #用正则表达式来获得每个网址的标题,即文件标题
    #print(title)
        title = "".join(title)  #将title列表转换为字符串
        title = re.findall('(.*?)_中央有关文件_中国政府网',title)  #用正则表达式删除“_中央有关文件_中国政府网”重复信息
        title = "".join(title)  #将title列表转换为字符串

将网站文字内容用标题依次保存

        file_name = title  # 用title字符串来为文件取名字
        #print(file_name)   #为了测试是否成功进行打印查看
        with open( file_name + '.txt','w', encoding='utf-8') as f:  #用w格式新建文件,并且用file_name命名,再加上“.txt”后缀,文字编码格式'utf-8'
            f.write(str(tznr))  #将网页内容便利tznr用字符串的格式写入文本
            f.close()    #将文件关闭保存

全部完整代码如下:

"""导入所需模块"""
import requests  #导入requests库
import re  #导入正则表达式库
"""伪装正常访问"""
user = {
    'user-agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)'
    #打开浏览器输入:“about:version”,查看“用户代理”,即本机的user-agent
}
"""用range()函数和for语句来拼接网址"""
for a in range(0,14):  #用for语句和range()函数来一次获得数字0-14
    url = "http://sousuo.gov.cn/column/30471/" + str(a) +'.htm'  #将获得的数字和网址进行拼接得到15个网址,注意要将变量a用str()转换为字符串才能拼接
    #print(url)    #为了测试是否成功进行打印查看
    response = requests.get(url,headers = user)       #用requests库的get函数访问网页,用headers进行伪装
    #print(response.text)    #打印网页
    html = response.text                             #用文本显示访问网页得到的内容
    #print(html)  #打印网页内容,以便于使用正则表达式.
    """用正则表达式来获得每个文件的网址"""
    urls = re.findall('<a href=".*?" target="_blank">',html)  #用正则表达式获得文件网址
    #print(urls)   #为了测试是否成功进行打印查看
    urls = "".join(urls)    #将列表转化为字符串
    url_wj = re.findall('[a-zA-z]+://[^\s"]*',urls)  #提取网页中的每个文件具体网址
    #print(url_wj)   #为了测试是否成功进行打印查看
    """用for语句来一次访问每个文件的网址"""
    for url in url_wj:  #用for语句来实现依次访问每个文件的网址
        response_gwy = requests.get(url,headers = user)  #用变量response_gwy保存访问网址后获得的信息
        resopnse_gwy_wz = response_gwy.content.decode('utf-8')  #用'utf-8'的编码模式来记录网址内容,防止出现中文乱码
        #print(resopnse_gwy_wz)    #为了测试是否成功进行打印查看
        tznr = re.findall('<p style="text-indent: 2em; font-family: 宋体; font-size: 12pt;">(.*?)</p>',resopnse_gwy_wz)  #用正则表达式来获得文件的文字内容,清除多余的代码
        tznr = "".join(tznr)  #将获得的文字内容由列表转换为字符串
        #print(tznr)  #为了测试是否成功进行打印查看
        wjym = response_gwy.content.decode('utf-8')  #用变量wjym保存获得的页面信息
        #print(wjym)
        """用正则表达式获得文件的标题"""
        title = re.findall('<title>(.*?)</title>',wjym)  #用正则表达式来获得每个网址的标题,即文件标题
        #print(title)
        title = "".join(title)  #将title列表转换为字符串
        title = re.findall('(.*?)_中央有关文件_中国政府网',title)  #用正则表达式删除“_中央有关文件_中国政府网”重复信息
        title = "".join(title)  #将title列表转换为字符串
        file_name = title  # 用title字符串来为文件取名字
        #print(file_name)   #为了测试是否成功进行打印查看
        """保存每个文件"""
        print("正在爬取保存,请勿关闭……")
        with open( file_name + '.txt','w', encoding='utf-8') as f:  #用w格式新建文件,并且用file_name命名,再加上“.txt”后缀,文字编码格式'utf-8'
            f.write(str(tznr))  #将网页内容便利tznr用字符串的格式写入文本
            f.close()    #将文件关闭保存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值