当前位置: 首页 > article >正文

python爬虫实习找工作练习测试(以下内容仅供参考学习)

要求:获取下图指定网站的指定数据

空气质量状况报告-中国环境监测总站

输入:用户输入下载时间范围,格式为2022-10

输出:将更新时间在2022年10月1日到31日之间的文件下载到本地目录(可配置),并将下载的标题列表逐行打印在控制台console中

完成标准:

程序正常运行

import requests
from lxml import etree
from urllib.parse import urljoin
from datetime import datetime

def download_files(start_date,end_date):
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
    }
    base_url = "http://www.cnemc.cn/jcbg/kqzlzkbg/index"
    page=0
    while True:
        if page==0:
            url=f"{base_url}.shtml"
        else:
            url=f"{base_url}_{page}.shtml"
    # url = "http://www.cnemc.cn/jcbg/kqzlzkbg/index.shtml"
        response = requests.get(url, headers=headers)
        if response.status_code!=200:
            break
        response.encoding = response.apparent_encoding
        page_text = response.text
        html = etree.HTML(page_text)
        divs = html.xpath('//*[@id="contentPageData"]/li')
        for i in divs:

            # 使用 XPath 定位到 <a> 标签并提取文本
            title = i.xpath('.//a/text()')  # 获取第一个匹配元素的文本

            # 使用 XPath 定位到 <span class="txt_time"> 标签并提取文本
            date_str = i.xpath('.//span[@class="txt_time"]/text()')

            if title and date_str:
                title = title[0].strip()
                date = datetime.strptime(date_str[0].strip(),'%Y-%m-%d')
                if start_date <= date <= end_date:
                    a_tag = i.find('.//a')
                    link = a_tag.get('href') if a_tag is not None else None
                    print(f'下载标题:{title}')
                    print(link)
                    base_link='http://www.cnemc.cn/jcbg/kqzlzkbg/'
                    full_link=urljoin(base_link,link)
                    print(full_link)
                    response_son = requests.get(full_link, headers=headers)
                    response_son.encoding = response_son.apparent_encoding
                    page_text_son=response_son.text
                    # print(page_text_son)
                    html_son = etree.HTML(page_text_son)
                    divs_son=html_son.xpath('/html/body/div[1]/div[5]/div/div[1]')[0]
                    # print(divs_son)        #/html/body/div[1]/div[5]/div/div[1]
                    a_tag_son = divs_son.find('.//a')
                    link_file = a_tag_son.get('href') if a_tag_son is not None else None
                    print(link_file)
                    if "http://www.cnemc.cn/" not in link_file:
                        link_file="http://www.cnemc.cn/jcbg/kqzlzkbg/"+str(start_date.year)+str(start_date.month)+'/'+link_file.lstrip('./')
                        print(link_file)
                    file_path=f"./downloads/{title}.pdf"
                    response_file=requests.get(link_file)
                    if response_file.status_code==200:
                        with open(file_path,'wb') as f:
                            f.write(response_file.content)
                        print("文件下载成功,保存至:", file_path)
                    else:
                        print("下载失败,状态码:", response_file.status_code)
        page+=1
if __name__=="__main__":
    start_date=datetime(2016,4,1)
    end_date=datetime(2016,4,30)
    download_files(start_date,end_date)


http://www.kler.cn/a/146427.html

相关文章:

  • 如何异地远程访问本地部署的Web-Check实现团队远程检测与维护本地站点
  • 主链和Layer2之间资产转移
  • 我的世界-与门、或门、非门等基本门电路实现
  • 【Flink系列】4. Flink运行时架构
  • iOS面试模版
  • 中职网络建设与运维ansible服务
  • 【Linux】make/Makefile 进度条小程序
  • C#,《小白学程序》第二十二课:大数的乘法(BigInteger Multiply)
  • CAM-Classification activation map 类激活图玩耍指南
  • mysql文本类型的最大长度限制
  • 使用VC++设计程序对一幅256级灰度图像进行全局固定阈值分割、自适应阈值分割
  • 单片机毕设实物买的成品,论文是自己查资料和照着实物写的
  • GPS北斗对时服务(时间同步系统)电力变电站应用方案
  • PostgreSQL数据库初接触
  • 使用 OpenCV 发现圆角矩形的轮廓
  • springboot核心原理之@SpringbootApplication
  • CRC校验
  • QT(19):QChar和QByteArray
  • python循环语句和函数
  • 【虹科干货】ntopng如何将漏洞扫描与流量监控相结合,以提高网络安全性
  • OpenCV简介及安装
  • 利用 LD_PRELOAD 环境变量
  • c++版本opencv计算灰度图像的轮廓点
  • 计网Lesson1笔记
  • 测试用例评审检查点
  • 2.19 keil里面工具EventCorder使用方法