最近观看学习了B站上的北京理工大学嵩天老师的Python网络爬虫视频,然后对之前的代码进行了一定的提高,学到可以用BeautifulSoup模块来进行网页数据爬行,通过分层的标签来搜索相应的元素,操作也变得更加快捷。
下面是我利用所学及相关网上学习,写的爬取天气网站的代码,并且调用pygal实现可视化的代码。中间遇到了一些麻烦:
①用BeautifulSoup模块锁定相关标签块的方法,利用soup.find_all(****)
②用pygal实现可视化,add的数据必须是int型数据
借了两天时间才弄出来,都是一些细节没注意,已经用标签标注,希望读者不要慌张,即使有错误,一个个寻找,一定能发现,Python的魅力就是如此,加油!
import requests
from bs4 import BeautifulSoup
import bs4
r=requests.get('http://www.weather.com.cn/weather/101250101.shtml',timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
data=r.text
soup=BeautifulSoup(data,'html.parser')
day_List=[]
Type_List=[]
Max_List=[]
Min_List=[]
Day_List=[]
for tr in soup.find_all('ul',class_="t clearfix"):#含有class的标签要在class前添上“_”
for day in tr.find_all('h1'):
Day_List.append(day.string)
for wea in tr.find_all('p',class_="wea"):
Type_List.append(wea.string)
for tr in soup.find_all('ul',class_="t clearfix"):
for tr in soup.find_all('p',class_="tem"):
for maxtemp in tr.find_all('span'):
Max_List.append(maxtemp.string)
for mintemp in tr.find_all('i'):
Min_List.append(mintemp.string)
day_List=[a[:2]+b for a,b in zip(Day_List,Type_List)]#利用zip将两个列表合并的方法
max_List=[int(i) for i in Max_List]
min_List=[int(i[:2]) for i in Min_List]
import pygal
line_chart=pygal.Line()
line_chart.title='七天的天气状况'
line_chart.x_labels=day_List
line_chart.y_title='天气情况'
line_chart.x_title='几号'
line_chart.add('最高气温',max_List)#add传数据时,列表内元素一定要是int整形
line_chart.add('最低气温',min_List)
line_chart.render_to_file('weather.svg')
运行后代码的结果:
10.25 发这条博的三天后,我发现七天的头一天它没有标签,在列表中就是意味着可能存在没有头天没有最高温的情况,对上面的代码做了一点点修改,方法比较简单(蠢蠢的),各位,记得加油哦!
import requests
from bs4 import BeautifulSoup
import bs4
r=requests.get('http://www.weather.com.cn/weather/101250101.shtml',timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
data=r.text
soup=BeautifulSoup(data,'html.parser')
day_List=[]
Type_List=[]
Max_List=[]
Min_List=[]
Day_List=[]
for tr in soup.find_all('ul',class_="t clearfix"):#含有class的标签要在class前添上“_”
for day in tr.find_all('h1'):
Day_List.append(day.string)
for wea in tr.find_all('p',class_="wea"):
Type_List.append(wea.string)
for tr in soup.find_all('ul',class_="t clearfix"):
for tr in soup.find_all('p',class_="tem"):
for maxtemp in tr.find_all('span'):
Max_List.append(maxtemp.string)
for mintemp in tr.find_all('i'):
Min_List.append(mintemp.string)
day_List=[a[:2]+b for a,b in zip(Day_List,Type_List)]
max_List=[int(i[:2]) for i in Max_List]
min_List=[int(i[:2]) for i in Min_List]
if len(max_List)!=len(min_List):#添加若没有对齐,也就是上面提到的第一天没有最高气温的情况的修正块
max_List2=[None]
for i in range(len(max_List)):
max_List2.append(max_List[i])
import pygal
line_chart=pygal.Line()
line_chart.title='七天的天气状况'
line_chart.x_labels=day_List
line_chart.y_title='天气情况'
line_chart.x_title='几号'
line_chart.add('最高气温',max_List2)#add数据时,添加元素一定要是int整形
line_chart.add('最低气温',min_List)
line_chart.render_to_file('weather.svg')