如何解决为什么汤不全部显示所有标签
我正在尝试从此页面抓取每日温度数据-特别是最低和最高每日温度:https://www.wunderground.com/calendar/gb/birmingham/EGBB/date/2020-8
我在html中找到了数据所在的行: calendar days temperature li tag 其余的每日温度也可以在其他li标签中找到: other li tags where temp data is inside
我正在尝试使用漂亮的汤来抓取所述数据,但是当我尝试使用以下代码时,即使从html处检查html时,即使它们在那里,我也无法从html中获取所有li标记。网站
当我打印生成的temp_cont时,还有其他li标签,但没有包含每日数据的标签:result of soup find all
我已经尝试使用其他html解析器,但是它不起作用-所有其他解析器输出相同的数据。 我正在寻找其他解决方案,例如尝试使用javascript加载它,因为其他人建议某些页面可能会动态加载,但我对此并不了解。 希望你能帮我这个忙。
response = get(url,headers=headers)
soup = BeautifulSoup(response.content,'lxml')
temp_cont = soup.find_all('li')
编辑(附加问题): 我在下面测试了@AaronS推荐的解决方案,并且抓取效果很好。但是,当我尝试在几个小时后再次重新运行脚本时,由于list元素之一为“ None”,则提示“ Nonetype”错误。
当我在API的网络预览中再次检查该网站时,temperatureMax的第一个元素现在被写为“ null”。我不知道为什么/如何更改它,或者是否有变通办法以使抓取再次起作用。在此处查看屏幕截图:network preview with null
解决方法
因此,如果您在浏览器中禁用了javascript,则会发现那里没有您需要的信息。这就是罗曼正在解释的。 Javascript可以发出HTTP请求并从API中获取数据,然后将响应反馈给浏览器。
如果您检查页面并转到网络工具。您将能够看到所有加载页面的请求。在这些请求中,有一个请求,如果单击并预览,则会看到一些温度数据。
我很懒,所以我复制了此请求的cURL并将其输入到curl.trillworks.com这样的网站中,该网站将其转换为python请求。
在这里您可以看到我正在此处复制cURL请求。
代码示例
import requests
params = (
('apiKey','6532d6454b8aa370768e63d6ba5a832e'),('geocode','52.45,-1.75'),('language','en-US'),('units','e'),('format','json'),)
response = requests.get('https://api.weather.com/v3/wx/forecast/daily/15day',params=params)
max = response.json()['temperatureMax'][0]
min = response.json()['temperatureMin'][0]
print('Min Temperature: ',min)
print('Max Temperature: ',max)
输出
Min Temperature: 65
Max Temperature: 87
解释
因此,URL是weather.com具有的每日预报的API。它具有用于指定您所在位置的参数,以及响应应返回的格式。
我们使用这些参数发出HTTP get请求,而返回的响应是JSON对象。我们可以使用response.json()
方法将其转换为python字典。
现在,如果输出response.json(),您将获得大量数据,如果您在浏览器中查看该HTTP请求的预览,则可以向下浏览所需的数据。我们需要键“ temperatureMax”和“ temperatureMin”中的数据。结果实际上是一个列表,而今天的温度最大值和最小值是这些列表的第一项。因此,response.json()['temperatureMax'][0]
和min = response.json()['temperatureMin'][0]
其他信息
这是网站包含由javascript加载的动态内容的情况。处理这类内容有两种主要方法。
- 模仿javascript调用的HTTP请求(这是我们在这里所做的事情)
- 使用selenium之类的包来调用浏览器活动。您可以使用selenium呈现整个HTML,包括该HTML的javascript调用部分。然后选择所需的数据。
第一个选择的好处是效率,更快,数据更结构化。认为最后一种工作是最后一种选择的原因是硒从来都不是用于网络抓取的,它很脆弱,如果网站上发生任何更改,那么您将处于需要经常维护代码的位置。 / p>
所以我的建议是尝试做第一个选择,检查页面,转到网络工具,然后查看所有请求的预览。预览数据,看看它是否具有您想要的。然后重新创建该请求。现在有时候您只需要一个简单的HTTP请求,而没有参数,Cookie或标头。
在此特定示例中,您调整了参数,但有时您可能需要全部,甚至可能需要更多不同的网站。因此请注意,如果您无法获取数据。这不是万无一失的证据,肯定有一些实例很难重新创建HTTP请求,并且您作为网站用户对某些事情并不确定。请使用具有此功能的完善的API来阻止人们对其进行抓取。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。