需求分析

最近的天气实在是太热了,据天气预报显示,很多地方这周温度将会超过40度。这样的高温天气之下,靠喝冰饮,吃雪糕都不管用了,总之,只要离开了空调房,就感觉自己要融化掉了

怎么办呢?我们必须要做好防范!今天我准备通过爬虫,爬取一下高温预警信息。话说,关于天气预警信息,我在上个月的时候已经做过一次了,通过python爬取天气预警信息。但是呢,那次是全部的天气预警信息,不是专门针对高温的,所以说像台风,暴雨,雷电等等也会包括在内,这不是我们现在需要的。因此,本期的任务,就是对之前的天气预警信息进行一些改造,使其变成专门的高温预警信息

当然啦,我们也不会只是简单的对其进行小幅度的修改,这次我决定将其全面重做。主要的区别在于,上次我们使用的是selenium,并且在这期间进行了一次iframe标签的切换。而这一次呢,我准备改为使用splash,这个在技术上就完全不一样了。如果你有兴趣的话,也可以根据这次的结果对比一下selenium的实现和splash的实现有什么样的区别

实现分析

首先呢,我们观察一下页面,我们需要的页面大概就像这样

那么,如何通过splash获取呢?首先呢,毫无疑问,我们需要先搭建一个splash服务,我使用的是默认的本机搭建的splash,采用了默认的8050端口,这个可以根据你自己的需要进行修改

然后呢,我们可以通过splash的快速接口,也就是render.html简单的尝试一下

import requests
from base64 import b64decodeb_url = b64decode("aHR0cDovL3d3dy53ZWF0aGVyLmNvbS5jbi9hbGFybS9uZXdhbGFybV8yMDIwLnNodG1s").decode()
url = "http://localhost:8050/render.html?url=" + b_urlr = requests.get(url)
print(r.text)

哦,糟了,不出意外的话是出意外了。这个返回的结果中怎么没有数据呢?这是怎么回事呢?太奇怪了吧?

众所周知,如果直接通过requests发起请求的话,是得不到数据的,原因在于requests没有执行js的渲染,所以说得不到动态页面,那么现在为什么我们换了splash以后还是没数据呢?怎么看起来这个结果和requests直接得到的结果差不多呢?这到底是怎么回事呢?

难道说,splash没有执行js的动态渲染吗?为什么呢?难道说,这个地址有什么“黑科技”,阻挡了splash执行js吗?难道这里只可以使用selenium吗?

当然不,其实呢,这个原因很简单。就是我们的请求太快了,没有让它等待,第一时间就把结果返回了。所以说splash还没有来得及执行完js,我们就已经要求其返回结果了,所以说我们没有得到渲染完成后的页面

解决的办法呢,就更简单的,我们只需要让其等一会,就可以了。当然,在这里使用的可不是time.sleep(),我们需要做的是给它加上一个wait参数

import requests
from base64 import b64decodeb_url = b64decode("aHR0cDovL3d3dy53ZWF0aGVyLmNvbS5jbi9hbGFybS9uZXdhbGFybV8yMDIwLnNodG1s").decode()
url = "http://localhost:8050/render.html?wait=3&url=" + b_urlr = requests.get(url)
print(r.text)

看吧,这就是一个非常容易就可以解决了的小问题,总共也才只加了6个字符。但是如果你对splash不熟悉,或者是一个初学者的话,很可能就因为这一点点小问题就彻底卡住了,再也找不到解决办法了。可能这就是学习程序的困难吧

完整代码展示

import requests
from urllib.parse import quote
from base64 import b64decode
from lxml import etreeb_url = b64decode("aHR0cDovL3d3dy53ZWF0aGVyLmNvbS5jbi9hbGFybS9uZXdhbGFybV8yMDIwLnNodG1s").decode()lua = """
function main(splash)splash:go("%s")splash:wait(1)splash:evaljs("document.getElementById('kind').value = '07';")splash:wait(0.5)splash:evaljs("document.getElementById('Submit').click();")splash:wait(1)return splash:html()
end
""" % b_urlurl = "http://localhost:8050/execute?lua_source=" + quote(lua)
r = requests.get(url)html = etree.HTML(r.text)
lis = html.xpath("//ul[@class='dDUl']/li")for i in lis:print(i.xpath("./span[2]/text()")[0], ":", i.xpath("./a[2]/text()")[0])

以下是程序的运行结果,可以看到,我们的程序已经非常好的完成了任务。得到了高温的预警信息,我们就可以提前做好防范啦。饮料,棒冰,通通准备起来!


我知道有很多的初学者,对我的文章内容可能并不关心,直接就划到最后,复制完整代码拿去运行了,所以说,可能会错过一些细节

因此,我需要额外提醒一下,本次的程序使用了splash,你需要在本机搭建一个splash服务,才能够运行这个程序,如果你不管这个,直接运行是运行不了的,这并不是程序的问题。当然,如果你在其他的机器上有splash的服务的话,也可以根据需要进行修改

注意防范高温!通过splash爬取高温预警信息相关推荐

  1. 高温来袭?通过python爬虫爬取天气预警信息

    需求分析 最近一段时间,天气也是越来越热了,真正的进入了夏天了.可怕的故事是,现在才只有6月份呢,要是等到了7,8月份,不会是要更热吧? 一个小伙伴对此也深表赞同,"仙草哥哥,现在天气的温度 ...

  2. go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...

    利用splash爬取京东商品信息 一.环境 window7 python3.5 pycharm scrapy scrapy-splash MySQL 二.简介 为了体验scrapy-splash 的动 ...

  3. day02:requests爬取豆瓣电影信息

    一.requests爬取豆瓣电影信息 -请求url: https://movie.douban.com/top250 -请求方式: get -请求头: user-agent cookies二.sele ...

  4. 爬虫基本库request使用—爬取猫眼电影信息

    使用request库和正则表达式爬取猫眼电影信息. 1.爬取目标 猫眼电影TOP100的电影名称,时间,评分,等信息,将结果以文件存储. 2.准备工作 安装request库. 3.代码实现 1 imp ...

  5. layui获取input信息_python爬虫—用selenium爬取京东商品信息

    python爬虫--用selenium爬取京东商品信息 1.先附上效果图(我偷懒只爬了4页) 2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Hea ...

  6. python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...

    在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地  ,时间  之后点击确定,这是我 ...

  7. winform模拟登陆网页_Python爬虫使用selenium爬取群成员信息(全自动实现自动登陆)...

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...

  8. 从入门到入土:Python爬虫学习|实例练手|爬取LOL全英雄信息及技能||异步加载|初级难度反扒处理|寻找消失的API

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. python爬取京东商品属性_python爬虫小项目:爬取京东商品信息

    #爬取京东手机信息 import requests from bs4 import BeautifulSoup from selenium import webdriver import re imp ...

最新文章

  1. 基础知识——用户输入和函数(五)
  2. html导出excel时换行符,ASP.NET 导出到Excel时保留换行的代码
  3. django template语法
  4. Python实现迭代器协议
  5. JS中创建函数的几种方式
  6. java sdp_[java,SDP] java 7 SDP 技术/Socket Direct Protocol 2
  7. matlab验潮站,验潮站的作用是什么
  8. java连接mysql通用方法_jdbc操作数据库通用方法
  9. strlensizeof
  10. 微机笔记6——输入输出控制
  11. php 将rgb转cmyk,将CMYK颜色值和RGB颜色相互转换的PHP代码
  12. excel计算加权和
  13. matlab中format使用方法
  14. 美国计算机编程竞赛,USACO美国计算机竞赛
  15. c语言生成excel文件简书,通过xlwings生成Excel文件
  16. PDF文件中的图片如何删除?分享两种删除方法
  17. win11 安装Subversion与配置 svn服务端
  18. 【考研数学】九. 无穷级数
  19. 华为手表新款watch gt3_【新品】华为全场景新品发布会正式举行:发布多款产品...
  20. Shell脚本语法小全

热门文章

  1. 假设某袋子中装有3个红球,5个白球,6个黑球,现从该袋子中任意取出8个球,下面程序的功能是输出这8个球中至少有一个白球的所有方案。找出其中错误并改正之。
  2. 用python的turtle画模仿3d星空、运动的恒星小宇宙
  3. [转]使用控件的RenderControl()方法导出Excel
  4. 现在人人贷这类金融平台对逃废债情况打击重吗?银行会管吗?
  5. 走过的路,做过的事——我的2014
  6. mysql 子表_MySQL子查询,派生表和通用表达式
  7. halcon边缘检测
  8. Microsoft Visual Studio是什么
  9. Fiddler修改实验
  10. max211/max213 max232 max3232