Python爬取天气数据时,如何解析网页并提取特定元素?
<div class=“minMax”>
<div id=“maxTempDiv” style=“float: left;”><img src=“http://i.tq121.com.cn/i/weather2017/max.png”><span id=“maxTemp”>26℃</span></div>
<div id=“minTempDiv” style=“float: left;”><img src=“http://i.tq121.com.cn/i/weather2017/min.png”><span id=“minTemp”>19℃</span></div>
</div>
怎么才能把温度信息 取出来。
temp_list = soup.find_all(‘span’,id=‘maxTemp’)
temp_list = soup.find_all(‘span’,class_=‘minMax’)
最后结果都是没有温度信息,打印出来这个:
[<div class=“minMax”>
<div id=“maxTempDiv”><img src=“http://i.tq121.com.cn/i/weather2017/max.png”/><span id=“maxTemp”></span></div>
<div id=“minTempDiv”><img src=“http://i.tq121.com.cn/i/weather2017/min.png”/><span id=“minTemp”></span></div>
</div>]
这种元素提取有没有什么好一点的教程啊?求助!!!!!
Python爬取天气数据时,如何解析网页并提取特定元素?
xpath 了解一下
用requests+lxml或者BeautifulSoup都行,看你习惯。requests拿网页,解析库提数据。
比如用lxml和XPath,直接定位元素,代码干净:
import requests
from lxml import html
url = '你的目标网址'
resp = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
tree = html.fromstring(resp.content)
# 假设温度在class为'temp'的span里
temperature = tree.xpath('//span[@class="temp"]/text()')[0]
# 假设城市在id为'city'的h1里
city = tree.xpath('//h1[@id="city"]/text()')[0]
print(f"{city}: {temperature}")
用BeautifulSoup的话,find方法更直观:
from bs4 import BeautifulSoup
soup = BeautifulSoup(resp.content, 'html.parser')
temperature = soup.find('span', class_='temp').text
city = soup.find('h1', id='city').text
print(f"{city}: {temperature}")
关键就两步:1. 看网页源码,找到你要的数据在哪个标签里,有什么特征(id、class这些);2. 用对应的选择器把它抓出来。右键检查元素,复制XPath或选择器能帮你快速定位。
用开发者工具找对标签就行。
soup.find(‘span’,id=‘maxTemp’).string 这样应该可以
xpath
pyquery 也可以看下
他这个元素大概是网页加载完成以后 js 操作 dom 写过去的…
OK 上网搜到了。
为什么。是说除了温度数据以外其他都是标签吗?这什么原理。不是直接写在网页上的吗?是从别的地方取到的?
还是不对。打印出了 None。
用 request-html,执行 JS 之后再取数据
额。。。具体怎么写?查下好像说数据是 js 生成的。直接取的话取不到?
看一下页面有没有发 ajax 请求,说不定有
把页面 url 贴出来
from requests_html import HTMLSession
session = HTMLSession()
response = session.get(‘http://www.weather.com.cn/weather1dn/101280601.shtml’)
response.html.render()
print(response.html.find(’#maxTemp’)[0].text)
F12 看 Network
准备两个函数
1. 提取两个字符串之间的内容
2. 提取一个文档内所有这两个字符串之间的内容
无论什么语言,有这两个函数,可以分析任意文本
特意加两个 id 标签,后加载可能性极高
而且天气数据基本按小时为单位更新,多数是 json 更新
谢谢
找到了这样的信息:
var dataSK =
{“nameen”:“shenzhen”,“cityname”:“深圳”,“city”:“101280601”,“temp”:“26”,“tempf”:“78”,“WD”:“西南风”,“wde”:“SW”,“WS”:“2 级”,“wse”:"<12km/h",“SD”:“54%”,“time”:“13:50”,“weather”:“多云”,“weathere”:“Cloudy”,“weathercode”:“d01”,“qy”:“1009”,“njd”:“30.94km”,“sd”:“54%”,“rain”:“0.0”,“rain24h”:“0”,“aqi”:“71”,“limitnumber”:"",“aqi_pm25”:“71”,“date”:“04 月 09 日(星期一)”}
这个应该是正确的。但是怎么才能获取这个信息呢? 直接访问是不行的
打个断点,看哪个 js 加载的啊
或者直接 selenium,
直接访问的话,你得看一下还带上什么信息的
直接带上 cookie 请求接口就 ok 了。
url: http://d1.weather.com.cn/sk_2d/101280601.html?_=1523255737236
cookie 类似这样:f_city=%E6%B3%B0%E5%AE%89%7C101120801%7C; Hm_lvt_080dabacb001ad3dc8b9b9049b36d43b=1523255730; Hm_lpvt_080dabacb001ad3dc8b9b9049b36d43b=1523255730; vjuids=2a011e2fb.162a91de08f.0.258106460fa03; vjlast=1523255730.1523255730.30; Wa_lvt_1=1523255731; Wa_lpvt_1=1523255731
还有就是一些基本的模仿浏览器的配置。
如果只是为了天气数据。可以看一下彩云天气的 api。免费的。
非常感谢大家,发现还是得仔细看一遍书啊。
《 Python 网络数据采集》这本怎么样,刚下载下来。准备好好看看。
#20
Referer: http://www.weather.com.cn/
直接用 selenium 加载再查找好一点
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(‘http://www.weather.com.cn/weather1dn/101280601.shtml’)
min = browser.find_element_by_id(‘maxTempDiv’)
max = browser.find_element_by_id(‘minTempDiv’)
print(min.text, max.text)
看对接口的请求记录,如果直接请求接口能够获取就不用模拟 js 了


