课程示例的旧金山天气页面地址为:
http://forecast.weather.gov/MapClick.php?lat=37.77492773500046&lon=-122.41941932299972#.WUnSFhN95E4
在火狐浏览器中提供了非常方便的网页代码查看器(其他浏览器可自行百度):
这样我们可以很快速地知道我们想获取的信息在html代码中的位置,方便我们抓取信息。
如果我们想要获取这个星期的天气情况,怎么做呢?
下面,我们就来操作一下如何抓取出来我们需要的这部分信息。
1.通过url.request 返回网页内容
import urllib.request as urlrequest
weather_url='http://forecast.weather.gov/MapClick.php?lat=37.77492773500046&lon=-122.41941932299972'
web_page=urlrequest.urlopen(weather_url).read()
print(web_page)
2.通过BeautifulSoup 来抓取网页中的天气信息
这里注意,我们想要抓取的天气情况的内容的在html中的id。(回看上上图)
from bs4 import BeautifulSoup
soup=BeautifulSoup(web_page,'html.parser')
print(soup.find(id='seven-day-forecast-body').get_text())
我们也可以通过prettify输出一个美观的网页代码。
我们先来观察一下这个网页代码,找到我们想要简短地获取的内容。
对于这个问题,我们其实需要知道日期,天气和温度就可以了,也就是图中标出的那几项。
比如,抓取日期:
同样的,针对天气和温度,也可以根据他们的class获取。
这里可以看到,天气的class有所不同:
<p class="temp temp-low">Low: 65 °F</p>
这是指天气有两个class,我们通过class_='temp' class_='temp-low'都可以找到它。
怎样可以获取所有的天气呢?加上循环就可以了。
3.将天气数据完整有序地抽取出来
本案例的完整代码如下:
#导入需要的包和模块,这里需要的是 urllib.request 和 Beautifulsoup
import urllib.request as urlrequest
from bs4 import BeautifulSoup
#通过urllib来获取我们需要爬取的网页
weather_url='http://forecast.weather.gov/MapClick.php?lat=37.77492773500046&lon=-122.41941932299972'
web_page=urlrequest.urlopen(weather_url).read()
#用 BeautifulSoup 来解析和获取我们想要的内容块
soup=BeautifulSoup(web_page,'html.parser')
soup_forecast=soup.find(id='seven-day-forecast-container')
#找到我们想要的那一部分内容
date_list=soup_forecast.find_all(class_='period-name')
desc_list=soup_forecast.find_all(class_='short-desc')
temp_list=soup_forecast.find_all(class_='temp')
#将获取的内容更好地展示出来,用for循环来实现
for i in range(9):
date=date_list[i].get_text()
desc=desc_list[i].get_text()
temp=temp_list[i].get_text()
print("{}{}{}".format(date,desc,temp))
在上一篇中,基于网站API抓取了《摔跤吧!爸爸》的豆瓣评分,这次我们基于网页来抓取一下。
首先,打开《摔跤吧!爸爸》的豆瓣评分页面,并打开查看器看一下所需要抓取的得分所在的html结构:
可以看到,评分所在的class的名字叫做'll rating_num'。这就是我们所需要依据的东西了。
import urllib.request as urlrequest
from bs4 import BeautifulSoup
douban_url='https://movie.douban.com/subject/26387939/'
page=urlrequest.urlopen(douban_url).read()
soup=BeautifulSoup(page,'html.parser')
score=soup.find(class_='ll rating_num').get_text()
print(score)
基于API的抓取和基于网页的抓取的对比:
基于API爬取得到的是JSON格式的数据,需要用到JSON库来处理;
基于网页的爬虫返回的HTML页面需要用BeautifulSoup库来解析。