注意防范高温!通过splash爬取高温预警信息
需求分析
最近的天气实在是太热了,据天气预报显示,很多地方这周温度将会超过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爬取高温预警信息相关推荐
- 高温来袭?通过python爬虫爬取天气预警信息
需求分析 最近一段时间,天气也是越来越热了,真正的进入了夏天了.可怕的故事是,现在才只有6月份呢,要是等到了7,8月份,不会是要更热吧? 一个小伙伴对此也深表赞同,"仙草哥哥,现在天气的温度 ...
- go爬虫和python爬虫哪个好_python 爬虫实战项目--爬取京东商品信息(价格、优惠、排名、好评率等)-Go语言中文社区...
利用splash爬取京东商品信息 一.环境 window7 python3.5 pycharm scrapy scrapy-splash MySQL 二.简介 为了体验scrapy-splash 的动 ...
- day02:requests爬取豆瓣电影信息
一.requests爬取豆瓣电影信息 -请求url: https://movie.douban.com/top250 -请求方式: get -请求头: user-agent cookies二.sele ...
- 爬虫基本库request使用—爬取猫眼电影信息
使用request库和正则表达式爬取猫眼电影信息. 1.爬取目标 猫眼电影TOP100的电影名称,时间,评分,等信息,将结果以文件存储. 2.准备工作 安装request库. 3.代码实现 1 imp ...
- layui获取input信息_python爬虫—用selenium爬取京东商品信息
python爬虫--用selenium爬取京东商品信息 1.先附上效果图(我偷懒只爬了4页) 2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Hea ...
- python爬火车票是不是违法_python利用selenium+requests+beautifulsoup爬取12306火车票信息...
在高速发展的时代.乘车出远门是必不可少的,有些查询信息是要收费的.这里打造免费获取火车票信息 想要爬取12306火车票信息,访问12306官方网站,输入出发地,目的地 ,时间 之后点击确定,这是我 ...
- winform模拟登陆网页_Python爬虫使用selenium爬取群成员信息(全自动实现自动登陆)...
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: python小爬虫 PS:如有需要Python学习资料的小伙伴可以 ...
- 从入门到入土:Python爬虫学习|实例练手|爬取LOL全英雄信息及技能||异步加载|初级难度反扒处理|寻找消失的API
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- python爬取京东商品属性_python爬虫小项目:爬取京东商品信息
#爬取京东手机信息 import requests from bs4 import BeautifulSoup from selenium import webdriver import re imp ...
最新文章
- 基础知识——用户输入和函数(五)
- html导出excel时换行符,ASP.NET 导出到Excel时保留换行的代码
- django template语法
- Python实现迭代器协议
- JS中创建函数的几种方式
- java sdp_[java,SDP] java 7 SDP 技术/Socket Direct Protocol 2
- matlab验潮站,验潮站的作用是什么
- java连接mysql通用方法_jdbc操作数据库通用方法
- strlensizeof
- 微机笔记6——输入输出控制
- php 将rgb转cmyk,将CMYK颜色值和RGB颜色相互转换的PHP代码
- excel计算加权和
- matlab中format使用方法
- 美国计算机编程竞赛,USACO美国计算机竞赛
- c语言生成excel文件简书,通过xlwings生成Excel文件
- PDF文件中的图片如何删除?分享两种删除方法
- win11 安装Subversion与配置 svn服务端
- 【考研数学】九. 无穷级数
- 华为手表新款watch gt3_【新品】华为全场景新品发布会正式举行:发布多款产品...
- Shell脚本语法小全
热门文章
- 假设某袋子中装有3个红球,5个白球,6个黑球,现从该袋子中任意取出8个球,下面程序的功能是输出这8个球中至少有一个白球的所有方案。找出其中错误并改正之。
- 用python的turtle画模仿3d星空、运动的恒星小宇宙
- [转]使用控件的RenderControl()方法导出Excel
- 现在人人贷这类金融平台对逃废债情况打击重吗?银行会管吗?
- 走过的路,做过的事——我的2014
- mysql 子表_MySQL子查询,派生表和通用表达式
- halcon边缘检测
- Microsoft Visual Studio是什么
- Fiddler修改实验
- max211/max213 max232 max3232