之前断断续续地学习了python,最近系统地整理了一些,专注于学习python爬虫系列课程,也看了许多关于python爬虫的许多博客文章,也试着参考一些文章的方法进行爬虫实践,结合自己的学习经验,写了一个爬取天气的小程序。
#这个小程序是看了Bo_wen的文章‘http://blog.csdn.net/bo_wen_/article/details/50868339’,结合自己的学习经验,认为这篇文章的方法较为通俗易懂,因此写了这篇文章。
前期准备:
1.准备好一个适合的python编辑器,自己使用的是集成包管理的Anaconda中的Jupyter Notebook,因为便于管理和编写,所以也推荐大家使用这个编辑器。下载地址为:https://www.anaconda.com/download/
2.本文章要使用python库中的requests和BeautifulSoup4库爬取网页和解析网页。因为不是python自带的标准库,所以要手动安装以上两个库。
-
requests库下载地址:https://pypi.python.org/pypi/requests/
-
Beautiful Soup4库下载地址:https://pypi.python.org/pypi/beautifulsoup
3.用pip安装以上两个库,首先Win+R打开,输入cmd,点击确认进入管理窗口,输入如下:
pip install requestspip install beautifulsoup4
网页分析:
下面我们开始爬虫程序的主体部分,我们爬取的是中国天气网中苏州的近7天的天气情况
如下图:
接下来,右键检查元素,或者F12打开网页源代码,我们查询“6日”这个词,可以看到我们所需要的字段所在的标签位置,如下图:
我们所需要的字段全部在id=“7d"中的div中的ul中,日期在标签li中的h1标签中,天气情况在第一个p标签中。
最高温度在第二个p标签的span 标签中,最低温度在第二个p标签的 i 标签中。风级在第三个p 标签中的 i 标签中。如下图:
其他几天中的所需字段都是类似的结构,下面我们可以来写我们的主程序。
程序结构:
先导入所需要的requests库和Beautiful Soup4库;
import requests
from bs4 import BeautifulSoup然后我们写程序的主体框架结构;
def getHTMLText(url): #这个函数是为了获取网页信息
return
def get_data(html): #这个函数是从网页中爬取数据,并保存在一个列表中
return
def print_data(final_list,num): #这个函数是为了在列表中将结果打印输出
def main(): #主函数,将各个函数连接起来
url = ' '
html = getHTMLText(url)
final_list = get_data(html)
print_data(final_list,7)
main()我们来填充第一个函数的内容(def getHTMLText());
def getHTMLText(url,timeout = 30):
try:
r = requests.get(url, timeout = 30) #用requests抓取网页信息
r.raise_for_status() #可以让程序产生异常时停止程序
r.encoding = r.apparent_encoding
return r.text
except:
return '产生异常'用requests库的get()方法简明地获取网页信息,采用的try-except结构,在程序出问题的时候能自动停止。第一个函数返回一个网页内容---r.text.
接下来我们来填充第二个函数的内容(def get_data());
def get_data(html):
final_list = []
soup = BeautifulSoup(html,'html.parser') #用BeautifulSoup库解析网页
body = soup.body
data = body.find('div',{'id':'7d'})
ul = data.find('ul')
lis = ul.find_all('li')
for day in lis:
temp_list = []
date = day.find('h1').string #找到日期
temp_list.append(date)
info = day.find_all('p') #找到所有的p标签
temp_list.append(info[0].string)
if info[1].find('span') is None: #找到p标签中的第二个值'span'标签——最高温度
temperature_highest = ' ' #用一个判断是否有最高温度
else:
temperature_highest = info[1].find('span').string
temperature_highest = temperature_highest.replace('℃',' ')
if info[1].find('i') is None: #找到p标签中的第二个值'i'标签——最高温度
temperature_lowest = ' ' #用一个判断是否有最低温度
else:
temperature_lowest = info[1].find('i').string
temperature_lowest = temperature_lowest.replace('℃',' ')
temp_list.append(temperature_highest) #将最高气温添加到temp_list中
temp_list.append(temperature_lowest) #将最低气温添加到temp_list中
wind_scale = info[2].find('i').string #找到p标签的第三个值'i'标签——风级,添加到temp_list中
temp_list.append(wind_scale)
final_list.append(temp_list) #将temp_list列表添加到final_list列表中
return final_list根据我们之前分析的网页结构的标签树,用 Beautiful Soup 方法解析网页结构,用find()找到对应的标签。再在标签中遍历元素,将其中的文本内容添加到 temp_list 中,再将 temp_list 添加到 final_list 中,最后返回 final_list.
以上的所有数据已经保存在 final_list 中,我们来填充第三个函数的内容,将数据打印输出;
#用format()将结果打印输出
def print_data(final_list,num):
print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format('日期','天气','最高温度','最低温度','风级'))
for i in range(num):
final = final_list[i]
print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format(final[0],final[1],final[2],final[3],final[4]))python倾向于用format()打印输出结果。最后的输出结果如下:程序代码:
到此,我们的爬虫程序就写完了。下面是全部的代码:
import requests
from bs4 import BeautifulSoup
def getHTMLText(url,timeout = 30):
try:
r = requests.get(url, timeout = 30) #用requests抓取网页信息
r.raise_for_status() #可以让程序产生异常时停止程序
r.encoding = r.apparent_encoding
return r.text
except:
return '产生异常'
def get_data(html):
final_list = []
soup = BeautifulSoup(html,'html.parser') #用BeautifulSoup库解析网页
body = soup.body
data = body.find('div',{'id':'7d'})
ul = data.find('ul')
lis = ul.find_all('li')
for day in lis:
temp_list = []
date = day.find('h1').string #找到日期
temp_list.append(date)
info = day.find_all('p') #找到所有的p标签
temp_list.append(info[0].string)
if info[1].find('span') is None: #找到p标签中的第二个值'span'标签——最高温度
temperature_highest = ' ' #用一个判断是否有最高温度
else:
temperature_highest = info[1].find('span').string
temperature_highest = temperature_highest.replace('℃',' ')
if info[1].find('i') is None: #找到p标签中的第二个值'i'标签——最高温度
temperature_lowest = ' ' #用一个判断是否有最低温度
else:
temperature_lowest = info[1].find('i').string
temperature_lowest = temperature_lowest.replace('℃',' ')
temp_list.append(temperature_highest) #将最高气温添加到temp_list中
temp_list.append(temperature_lowest) #将最低气温添加到temp_list中
wind_scale = info[2].find('i').string #找到p标签的第三个值'i'标签——风级,添加到temp_list中
temp_list.append(wind_scale)
final_list.append(temp_list) #将temp_list列表添加到final_list列表中
return final_list
#用format()将结果打印输出
def print_data(final_list,num):
print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format('日期','天气','最高温度','最低温度','风级'))
for i in range(num):
final = final_list[i]
print("{:^10}\t{:^8}\t{:^8}\t{:^8}\t{:^8}".format(final[0],final[1],final[2],final[3],final[4]))
#用main()主函数将模块连接
def main():
url = 'http://www.weather.com.cn/weather/101190401.shtml'
html = getHTMLText(url)
final_list = get_data(html)
print_data(final_list,7)
main()总结:
1.爬虫主要用requests库和Beautiful Soup库可以简明地爬取网页上的信息;
2.先定好程序主要框架,再根据目的需求填充函数内容:获取网页信息>爬取网页数据>打印输出;
3.最重要的是解析网页结构,最好可以用标签树的形式确定字段所在的标签,并遍历全部标签存储数据。
第一次写博客,学习的python也不太久,文章中有些理解和书写错误,还望大家理解和之处,谢谢!
另外,强烈推荐北京理工大学嵩天老师的python系列课程。
更多关于本人的信息请访问本人网站http://www.o-xunkhun.com/(目前处于申请维护状态)
来源:CSDN
作者:xunkhun
链接:https://blog.csdn.net/xunkhun/article/details/79266283