python爬取陕西省县级AQI数据【selenium库】

这篇具有很好参考价值的文章主要介绍了python爬取陕西省县级AQI数据【selenium库】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

利用python中selenium库爬取陕西省2022年各个县的AQI数据汇总到一个excel表格

selenium库的安装与使用

selenium是一个网页自动化测试工具,使用它可以实现网页的下拉、点击等基本操作,当然也可以用来进行数据的一些抓取,并且selenium简单易学,非常适合像我这种第一次接触爬虫的新手。

selenium安装

pip install selenium

selenium需要借助浏览器来实现爬取数据,支持的浏览器也是比较多的,Edge、chrome等,需要下载其对应的驱动来可以进行使用。具体对应可以参考公子清羽的博客

https://blog.csdn.net/weixin_42550871/article/details/108831177

selenium使用

例如:

from selenium import webdriver
driver = webdriver.Chrome("chromedriver.exe")
driver.get("需要爬取的网站")

python爬取单日AQI数据

首先是我们需要导入的python库如下:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from time import sleep
import datetime
from selenium.webdriver.common.keys import Keys
import pandas as pd

打开需要爬取页面

driver = webdriver.Chrome("D:\下载\chromedriver_win32\chromedriver.exe")
driver.get("http://113.140.66.226:8024/sxAQIWeb/PageDistrict.aspx?cityCode=NjEwOTAw")
driver.implicitly_wait(10)

打开之后页面如下:
python爬取陕西省县级AQI数据【selenium库】,爬虫,python,selenium,开发语言,网络爬虫
打开之后会发现,这个页面是个动态页面,就是说我们点击例如县城空气质量,还是这个页面,但是下面的内容会发生变化。所以我们需要利用selenium一步步点击到我们所需要的那个界面,才可以爬取我们所需要的数据。

模拟鼠标点击到指定界面

#找到县级城市
country = driver.find_element_by_css_selector("#aspnetForm > div.box > div.top > div > ul > li:nth-child(4) > a")
ActionChains(driver).move_to_element(country).perform()
#chengshi这个只是为了后面保存文件夹方便
chengshi = driver.find_element_by_css_selector("#aspnetForm > div.box > div.top > div > ul > li:nth-child(4) > ul > li:nth-child(1) > a").text
#点击到对应城市,这里是西安市
country = driver.find_element_by_css_selector("#aspnetForm > div.box > div.top > div > ul > li:nth-child(4) > ul > li:nth-child(1) > a").click()
#找到日报数据点击
day = driver.find_element_by_css_selector("#span1").click()

日期选择

python爬取陕西省县级AQI数据【selenium库】,爬虫,python,selenium,开发语言,网络爬虫
从网页上可以看出来这个日期界面是比较麻烦的,需要点击选择,我们可以绕开这个,直接在查询框里面输入日期进行查询,这里我借助datetime库来生成日期进行输入,具体代码如下:

d = datetime.date(2022, 2, 16)
a = d.strftime("%Y-%m-%d")
#点击日期那个框框
date = driver.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_d12")
        date.send_keys(Keys.CONTROL, 'a')
        date.send_keys(a)
#等待两秒
sleep(2)
#点击查询
look = driver.find_element(By.XPATH, "/html/body/div[1]/form/div[3]/div[6]/div/input[2]").click()
#等待10秒,等待原因是网页刷新比较慢
sleep(10)

爬取数据并保存到表格中

datalist = []
table = driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_GridView1 > tbody > tr')
rows = [i for i in table if i.text]  # 所有内容
sleep(2)
for row in rows:  # 逐行获取
    sleep(2)
    datalist.append([i.text for i in row.find_elements_by_css_selector('tr > td') if i.text])
headers = ["日期", "城 市", "AQI", "空气质量级别", "级别", "首要污染物", "排名"]
df = pd.DataFrame(datalist, columns=headers)
df.to_csv(f"D:\桌面\AQI/{cheengshi[0:3]}"+"/"+f"{d}AQI数据.csv",index=False)

最终保存的结果如下:
python爬取陕西省县级AQI数据【selenium库】,爬虫,python,selenium,开发语言,网络爬虫

异常处理

由于网页会遇到各种问题,比如日期输入并点击查询之后,这个页面要很久才能刷新出来,甚至有的天数还没有数据,导致出现报错,所以我在这里进行了一个异常处理,防止在进行循环一年的数据时出现报错代码就停止的现象。

#异常检测的库
from selenium.common.exceptions import StaleElementReferenceException
#在日期查询那里加入异常检测就不会出现问题了,但是爬取错误的数据要重新爬取
attempts = 0
while attempts < 3:
    try:
        date = driver.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_d12")
        date.send_keys(Keys.CONTROL, 'a')
        date.send_keys(a)
        sleep(2)
        look = driver.find_element(By.XPATH, "/html/body/div[1]/form/div[3]/div[6]/div/input[2]").click()
        sleep(10)

        datalist = []
        table = driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_GridView1 > tbody > tr')
        rows = [i for i in table if i.text]  # 所有内容
        sleep(2)
        for row in rows:  # 逐行获取
            sleep(2)
            datalist.append([i.text for i in row.find_elements_by_css_selector('tr > td') if i.text])
        break
    except StaleElementReferenceException:
        date = driver.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_d12")
        date.send_keys(Keys.CONTROL, 'a')
        date.send_keys(a)
        sleep(2)

        look = driver.find_element(By.XPATH, "/html/body/div[1]/form/div[3]/div[6]/div/input[2]").click()
        sleep(10)

        datalist = []
        table = driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_GridView1 > tbody > tr')
        rows = [i for i in table if i.text]  # 所有内容
        sleep(2)
        for row in rows:  # 逐行获取
            sleep(2)
            datalist.append([i.text for i in row.find_elements_by_css_selector('tr > td') if i.text])
        attempts += 1

利用selenium爬取一整年的AQI数据

上面是单日数据的爬取,下面我们只需要加入一个循环就可以实现一整年的数据爬取,我这里使用的是while循环。

一整年数据爬取整个代码

以西安市县级2022年AQI数据爬取为例子。

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from time import sleep
import datetime
from selenium.webdriver.common.keys import Keys
import pandas as pd
from selenium.common.exceptions import StaleElementReferenceException


driver = webdriver.Chrome("D:\下载\chromedriver_win32\chromedriver.exe")
driver.get("http://113.140.66.226:8024/sxAQIWeb/PageDistrict.aspx?cityCode=NjEwOTAw")
driver.implicitly_wait(10)

#找到县级城市
country = driver.find_element_by_css_selector("#aspnetForm > div.box > div.top > div > ul > li:nth-child(4) > a")
ActionChains(driver).move_to_element(country).perform()

#找到西安市点击
cheengshi = driver.find_element_by_css_selector("#aspnetForm > div.box > div.top > div > ul > li:nth-child(4) > ul > li:nth-child(1) > a").text
country = driver.find_element_by_css_selector("#aspnetForm > div.box > div.top > div > ul > li:nth-child(4) > ul > li:nth-child(1) > a").click()
# ActionChains(driver).move_to_element(xian).click().perform()
#找到日报数据点击
day = driver.find_element_by_css_selector("#span1").click()

# 开始时间以及结束时间  这里需要修改时间,由于网页的原因会出错,改时间重新跑就好
begin = datetime.date(2022, 1, 1)
end = datetime.date(2022, 12, 31)
d = begin
delta = datetime.timedelta(days=1)
while d <= end:
	#日期转为字符串,并订正格式
    a = d.strftime("%Y-%m-%d")
    date = driver.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_d12")
    date.send_keys(Keys.CONTROL, 'a')
    date.send_keys(a)
    sleep(2)
    attempts = 0
    while attempts < 3:
        try:
            look = driver.find_element(By.XPATH, "/html/body/div[1]/form/div[3]/div[6]/div/input[2]").click()
            sleep(15)

            datalist = []
            table = driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_GridView1 > tbody > tr')
            rows = [i for i in table if i.text]  # 所有内容
            sleep(2)
            for row in rows:  # 逐行获取
                sleep(2)
                datalist.append([i.text for i in row.find_elements_by_css_selector('tr > td') if i.text])
            break
        except StaleElementReferenceException:
            # date = driver.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_d12")
            # date.send_keys(Keys.CONTROL, 'a')
            # date.send_keys(a)
            # sleep(2)

            look = driver.find_element(By.XPATH, "/html/body/div[1]/form/div[3]/div[6]/div/input[2]").click()
            sleep(15)

            datalist = []
            table = driver.find_elements_by_css_selector('#ctl00_ContentPlaceHolder1_GridView1 > tbody > tr')
            rows = [i for i in table if i.text]  # 所有内容
            sleep(2)
            for row in rows:  # 逐行获取
                sleep(2)
                datalist.append([i.text for i in row.find_elements_by_css_selector('tr > td') if i.text])
            attempts += 1

    headers = ["日期", "城 市", "AQI", "空气质量级别", "级别", "首要污染物", "排名"]
    df = pd.DataFrame(datalist, columns=headers)
    df.to_csv(f"D:\桌面\AQI/{cheengshi[0:3]}"+"/"+f"{d}AQI数据.csv",index=False)
    d += delta
driver.quit()

这样我们就实现了西安市县级AQI数据的爬取,之后就需要我们汇总到一个表格里面。

数据汇总到一个csv表格

这个比较简单,只需要借助os库和pandas库来实现一个简单的批处理即可。
话不多说,直接上代码:

import os
import pandas as pd
filedir = "D:\桌面\AQI\咸阳市\\"
file_namelist = os.listdir(filedir)
path2 = "D:\桌面\AQI\咸阳市\整理"
if not os.path.exists(path2):
    os.mkdir(path2)
df = pd.DataFrame()
for filename in file_namelist:
    if filename.endswith(".csv"):
        filepath = filedir + filename
        data = pd.read_csv(filepath)  # 读取csv数据
        data = data[1:25]     
        df = df.append(data)
        print({filename}, "is ok!!!")
df.to_csv(path2 + "/" + "咸阳市.csv",
                    index=False)

总结

第一次尝试写爬虫的代码,也尝试过用request加bs4来写,但是发现对于这种动态网页,我需要的花费很大时间去学习才能实现爬取,selenium库使用比较简单,非常容易上手,我当时也是看了三天的课程基本上就可以把代码写成型了,主要花费时间还是对HTML语言的了解。但是selenium库的缺点也很明显,它要等页面全部加载出来之后才会进行下一步,这也是它的爬取速度没有那么快的原因。
最后,希望能对一些初次接触爬虫的同学带来帮助,也希望能有大佬能多提出写意见,也特别感谢在CSDN上面分享经验的各位博主。文章来源地址https://www.toymoban.com/news/detail-717095.html

到了这里,关于python爬取陕西省县级AQI数据【selenium库】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实战:用Selenium爬取网页数据

    网络爬虫是Python编程中一个非常有用的技巧,它可以让您自动获取网页上的数据。在本文中,我们将介绍如何使用Selenium库来爬取网页数据,特别是那些需要模拟用户交互的动态网页。 Selenium是一个自动化测试工具,它可以模拟用户在浏览器中的操作,比如点击按钮、填写表

    2024年02月06日
    浏览(37)
  • Python爬虫|使用Selenium轻松爬取网页数据

    1. 什么是selenium? Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等。 Selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用

    2024年02月04日
    浏览(39)
  • python爬取boss直聘数据(selenium+xpath)

    以boss直聘为目标网站,主要目的是爬取下图中的所有信息,并将爬取到的数据进行持久化存储。(可以存储到数据库中或进行数据可视化分析用web网页进行展示,这里我就以csv形式存在了本地) python3.8 pycharm Firefox 环境安装: pip install selenium 版本对照表(火狐的) https://firefox-s

    2024年02月07日
    浏览(31)
  • Python爬虫实战:selenium爬取电商平台商品数据(1)

    def index_page(page): “”\\\" 抓取索引页 :param page: 页码 “”\\\" print(‘正在爬取第’, str(page), ‘页数据’) try: url = ‘https://search.jd.com/Search?keyword=iPhoneev=exbrand_Apple’ driver.get(url) if page 1: input = driver.find_element_by_xpath(‘//*[@id=“J_bottomPage”]/span[2]/input’) button = driver.find_element_by_xpath(‘

    2024年04月28日
    浏览(33)
  • 华纳云:Python中如何使用Selenium爬取网页数据

    这篇文章主要介绍“Python中如何使用Selenium爬取网页数据”,在日常操作中,相信很多人在Python中如何使用Selenium爬取网页数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中如何使用Selenium爬取网页数据”的疑惑有所帮助!接下

    2024年02月07日
    浏览(46)
  • 【Python爬虫】基于selenium库爬取京东商品数据——以“七夕”为例

    小白学爬虫,费了一番功夫终于成功了哈哈!本文将结合本人踩雷经历,分享给各位学友~ 用写入方式打开名为data的csv文件,并确定将要提取的五项数据。 上面第一行代码值得一提,driver =  webdriver.Edge()括号内为Edge浏览器驱动程序地址,需要在Edge浏览器设置中查找Edge浏览器

    2024年02月06日
    浏览(43)
  • Python网络爬虫逆向分析爬取动态网页、使用Selenium库爬取动态网页、​编辑将数据存储入MongoDB数据库

    目录 逆向分析爬取动态网页 了解静态网页和动态网页区别 1.判断静态网页  2.判断动态网页  逆向分析爬取动态网页 使用Selenium库爬取动态网页 安装Selenium库以及下载浏览器补丁 页面等待  页面操作 1.填充表单 2.执行JavaScript 元素选取 Selenium库的find_element的语法使用格式如下

    2024年02月15日
    浏览(78)
  • Python爬虫入门:使用selenium库,webdriver库模拟浏览器爬虫,模拟用户爬虫,爬取网站内文章数据,循环爬取网站全部数据。

    *严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。 目录 准备工具: 思路: 具体操作: 调用需要的库: 启动浏览器驱动: 代码主体:  完整代码(解析注释): Python环境; 安装selenium库; Python编辑器; 待爬取的网站; 安装好的浏览器; 与浏览器版本相对应的

    2023年04月24日
    浏览(33)
  • 【旅游景点项目日记 | 第二篇】基于Python中的Selenium爬取携程旅游网景点详细数据

    Gitee仓库地址:travel-server:景点旅游项目服务端 确保安装python3.x环境 以管理员身份打开cmd, 安装selenium、pymysql、datetime ,默认安装最新版即可 确保chrome安装对应版本的驱动 (将该驱动放在chrome安装路径下),用于控制chrome浏览器,并将路径添加到环境变量的Path变量中,如

    2024年04月13日
    浏览(35)
  • Python爬虫Selenium手动接管Edge爬取裁判文书网“环境污染”数据(Mac环境)

    目标数据:爬取从2007年到2022年,各地级市中级法院历年关于“环境污染”的裁判文书数量。 由于裁判文书网需要登录,Selenium手动接管爬取可避免频繁登录造成的封号风险。 Selenium如何手动接管Edge浏览器: 1、打开终端,将命令 /Applications/Microsoft Edge.app/Contents/MacOS/Microsof

    2023年04月09日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包