《爬虫学习》(五)(爬虫实战之爬取天气信息)

1.大体框架列出+爬取网页:

#数据可视化
from pyecharts import Bar
#用来url连接登陆等功能
import requests
#解析数据
from bs4 import BeautifulSoup

#用来存取爬取到的数据
data = []

def parse_data(url):
    headers = {
        ‘User-Agent‘:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"
    }
    rest = requests.get(url=url, headers=headers)#使用requests.get方法爬取网页
    # 一般人可能会用rest.text,但是会显示乱码
    text = rest.content.decode(‘utf-8‘)#使用utf-8解码,防止显示乱码,接下来无法解析
    soup = BeautifulSoup(text, ‘html5lib‘)#BeautifulSoup方法需要指定解析文本和解析方式

def main():
    url = "http://www.weather.com.cn/textFC/hb.shtml"
    parse_data(url)

if __name__ == ‘__main__‘:
    main()

parse_data函数主要用于爬取以及解析数据

headers可以在网页之中查找

易错点:当使用requests.get获取到网页之后,一般可能使用text方法进行数据获取,但是尝试之后数据产生了乱码,因为requests.get方法获取再用text解码时候默认ISO-8859-1解码,

    因此使用content方法并指定decode(‘utf-8‘)进行解码

数据解析我使用的是bs4库,也可以用lxml库,但是感觉没有bs4方便,解析方式使用html5lib,对于html数据解析更具有容错性和开放性

2.爬取网页解析:

# 爬取数据
    cons = soup.find(‘div‘, attrs={‘class‘:‘conMidtab‘})
    tables = cons.find_all(‘table‘)
    for table in tables:
        trs = table.find_all(‘tr‘)[2:]
        for index,tr in enumerate(trs):
            if index == 0:
                tds = tr.find_all(‘td‘)[1]
                qiwen = tr.find_all(‘td‘)[4]
            else:
                tds = tr.find_all(‘td‘)[0]
                qiwen = tr.find_all(‘td‘)[3]
            city = list(tds.stripped_strings)[0]
            wendu = list(qiwen.stripped_strings)[0]
            data.append({‘城市‘:city, ‘最高气温‘:wendu})

bs4库一般使用方法是find或者find_all方法(详细内容见上一篇博客)

find方法比较使用的是可以查找指定内容的数据,使用attrs={}来定制条件,代码中我用了attrs={‘class‘:‘conMidtab‘}或者使用class_=‘conMidtab‘

查看网页源代码可知

通过‘class‘:‘conMidtab‘来定位到所需信息的表

再分析:因为有多个conMidtab,所以测试分析得知多个conMidtab对应的是今天,明天,后天......的天气情况

我们分析的是今天的情况,所以取第一个conMidtab,使用soup.find("div",class_="conMidtab")获取第一个conMidtab的内容

由上知:conMidtab下的多个class="conMidtab2"代表不同的省的天气信息

但是在研究可以发现,所有天气信息都是存储在table里的,因此获取所有tables即可——cons.find_all(‘table‘)

同时对于每一个table而言:第三个tr开始才是对应的城市信息,故对于每一个table获取trs = table.find_all("tr")[2:]

易错点:同时发现对于每个省第一个城市,它隐藏在tr的第二个td里,而除此之外的该省其他城市则在tr的第一个td里,因此使用一个if和else判断

enumerate方法可以产生一个index下标,因此在遍历trs的时候可以知道当index==0的时候是第一行

之后分析:城市名字:对于每个省第一个城市,它隐藏在tr的第二个td里,而除此之外的该省其他城市则在tr的第一个td里

     最高气温:对于每个省第一个城市,它隐藏在tr的第五个td里,而除此之外的该省其他城市则在tr的第四个td里

因此使用

       if index == 0:
                tds = tr.find_all(‘td‘)[1]
                qiwen = tr.find_all(‘td‘)[4]
            else:
                tds = tr.find_all(‘td‘)[0]
                qiwen = tr.find_all(‘td‘)[3]最后使用stripped_strings获取字符串并且添加到data列表里

3.进行所有城市的数据获取:
def main():
    urls = [
        "http://www.weather.com.cn/textFC/hb.shtml",
        "http://www.weather.com.cn/textFC/db.shtml",
        "http://www.weather.com.cn/textFC/hd.shtml",
        "http://www.weather.com.cn/textFC/hz.shtml",
        "http://www.weather.com.cn/textFC/hn.shtml",
        "http://www.weather.com.cn/textFC/xb.shtml",
        "http://www.weather.com.cn/textFC/xn.shtml",
        "http://www.weather.com.cn/textFC/gat.shtml"
    ]
    for url in urls:
        parse_data(url)  

修改了一下main方法:获取全国数据

4.数据排序找出全国气温最高十大城市:

# 排序找出十大温度最高的城市
# 按照温度排序
data.sort(key=lambda x:int(x[‘最高气温‘]))
#十大温度最高的城市
data_2 = data[-10:]

其中在排序的时候注意:要转化为int型才可以进行排序,否则是按照string进行排序的。

5.数据可视化:

citys = list(map(lambda x:x[‘城市‘], data_2))#横坐标
wendu = list(map(lambda x:x[‘最高气温‘], data_2))#纵坐标
charts = Bar(‘中国十大最高温度城市‘)
charts.add(‘‘, citys, wendu)
charts.render(‘天气网.html‘)  

使用Bar模块:

  Bar方法主要可以给该图标命名

  add方法主要是添加(图颜色的名称,横坐标名, 纵坐标名)

  render主要是存储在本地之中

结果展示:

完整代码:

#数据可视化
from pyecharts import Bar
#用来url连接登陆等功能
import requests
#解析数据
from bs4 import BeautifulSoup

#用来存取爬取到的数据
data = []

def parse_data(url):
    headers = {
        ‘User-Agent‘:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400"
    }
    rest = requests.get(url=url, headers=headers)#使用requests.get方法爬取网页
    # 一般人可能会用rest.text,但是会显示乱码
    text = rest.content.decode(‘utf-8‘)#使用utf-8解码,防止显示乱码,接下来无法解析
    soup = BeautifulSoup(text, ‘html5lib‘)#BeautifulSoup方法需要指定解析文本和解析方式

    # 爬取数据
    cons = soup.find(‘div‘, attrs={‘class‘:‘conMidtab‘})
    tables = cons.find_all(‘table‘)
    for table in tables:
        trs = table.find_all(‘tr‘)[2:]
        for index,tr in enumerate(trs):
            if index == 0:
                tds = tr.find_all(‘td‘)[1]
                qiwen = tr.find_all(‘td‘)[4]
            else:
                tds = tr.find_all(‘td‘)[0]
                qiwen = tr.find_all(‘td‘)[3]
            city = list(tds.stripped_strings)[0]
            wendu = list(qiwen.stripped_strings)[0]
            data.append({‘城市‘:city, ‘最高气温‘:wendu})

def main():
    urls = [
        "http://www.weather.com.cn/textFC/hb.shtml",
        "http://www.weather.com.cn/textFC/db.shtml",
        "http://www.weather.com.cn/textFC/hd.shtml",
        "http://www.weather.com.cn/textFC/hz.shtml",
        "http://www.weather.com.cn/textFC/hn.shtml",
        "http://www.weather.com.cn/textFC/xb.shtml",
        "http://www.weather.com.cn/textFC/xn.shtml",
        "http://www.weather.com.cn/textFC/gat.shtml"
    ]
    for url in urls:
        parse_data(url)

    # 排序找出十大温度最高的城市
    # 按照温度排序
    data.sort(key=lambda x:int(x[‘最高气温‘]))
    #十大温度最高的城市
    data_2 = data[-10:]

    # 数据可视化
    citys = list(map(lambda x:x[‘城市‘], data_2))#横坐标
    wendu = list(map(lambda x:x[‘最高气温‘], data_2))#纵坐标
    charts = Bar(‘中国十大最高温度城市‘)
    charts.add(‘‘, citys, wendu)
    charts.render(‘天气网.html‘)

if __name__ == ‘__main__‘:
    main()

  

原文地址:https://www.cnblogs.com/Whgy/p/12238126.html

时间: 2024-11-11 17:11:28

《爬虫学习》(五)(爬虫实战之爬取天气信息)的相关文章

爬虫学习 09.移动端数据爬取

爬虫学习 09.移动端数据爬取 前言 随着移动市场的火热,各大平台都陆陆续续的推出了自己的移动端APP来拉拢吸引和便捷其广大的用户.那么在移动端的平台当时势必会出现大量有价值的信息和数据,那这些数据我们是否可以去享用一下呢?那么接下来就进入我们的移动端APP数据的爬虫中来吧. 今日概要 fiddler简介 手机APP抓包设置 fiddler设置 安装证书下载 安全证书安装 局域网设置 fiddler手机抓包测试 今日详情 1 什么是Fiddler? Fiddler是位于客户端和服务器端的HTTP

python网络爬虫学习(六)利用Pyspider+Phantomjs爬取淘宝模特图片

本篇博文在编写时参考了http://cuiqingcai.com/2652.html,向作者表示感谢 一.新的问题与工具 平时在淘宝上剁手的时候,总是会看到各种各样的模特.由于自己就读于一所男女比例三比一的工科院校--写代码之余看看美女也是极好的放松方式.但一张一张点右键–另存为又显得太过麻烦而且不切实际,毕竟图片太多了.于是,我开始考虑用万能的python来解决问题. 我们先看看淘女郎页面的URL,https://mm.taobao.com/json/request_top_list.htm?

Python爬虫学习——使用selenium和phantomjs爬取js动态加载的网页

1.安装selenium pip install selenium Collecting selenium Downloading selenium-3.4.1-py2.py3-none-any.whl (931kB) 100% |████████████████████████████████| 942kB 573kB/s Installing collected packages: selenium Successfully installed selenium-3.4.1 2.安装phan

分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

[TOC] 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HBase等. 基于面向接口的编码思想来开发,因此这个系统具有一定的扩展性,有兴趣的朋友直接看一下代码,就能理解其设计思想,虽然代码目前来说很多地方还是比较紧耦合,但只要花些时间和精力,很多都是可抽取出来并且可配置化的. 因为时间的关系,我只写了京东和苏宁易购两个网站的爬虫,但是完全可以实现不同网站爬虫的随机调度,基于其代码结构,再写国美.天猫等的商品爬取,难度不

python爬虫教程:《利用Python爬取表情包》

python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!老师带领你使用多线程爬虫一键爬取20w的表情包~ python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!老师带领你使用多线程爬虫一键爬取20w的表情包~ python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!老师带领你使用多线程爬虫一键爬取20w的表情包~ python爬虫教程:<利用Python爬取表情包>,微信没有表情包?不用愁!

用JAVA制作一个爬取商品信息的爬虫(爬取大众点评)

很多企业要求利用爬虫去爬取商品信息,一般的开发模型如下: for i=1;i<=最大页号;i++ 列表页面url=商品列表页面url+?page=i(页号) 列表页面=爬取(列表页面url) 商品链接列表=抽取商品链接(列表页面)  for 链接 in 商品链接列表: 商品页面=爬取(链接) 抽取(商品页面); 这样的模型看似简单,但是有一下几个问题: 1)爬虫没有线程池支持. 2)没有断点机制. 3)没有爬取状态存储,爬取商品网站经常会出现服务器拒绝链接(反问次数过多),导致一旦出现 拒绝链接

(原)python爬虫入门(2)---排序爬取的辽宁科技大学热点新闻

发现科大网页的源码中还有文章的点击率,何不做一个文章点击率的降序排行.简单,前面入门(1)基本已经完成我们所要的功能了,本篇我们仅仅需要添加:一个通过正则获取文章点击率的数字:再加一个根据该数字的插入排序.ok,大功告成! 简单说一下本文插入排序的第一个循环,找到列表中最大的数,放到列表 0 的位置做观察哨. 上代码: # -*- coding: utf-8 -*- # 程序:爬取点击排名前十的科大热点新闻 # 版本:0.1 # 时间:2014.06.30 # 语言:python 2.7 #--

爬虫案例—中基协数据爬取

因为工作原因,需要爬取相关网站的数据,包括中基协网站和天眼查部分数据. 一.中基协网站 爬取思路: 1.查看目标页:http://gs.amac.org.cn/amac-infodisc/api/pof/manager?rand=0.9775162173180119&page=%s&size=50 发现有随机数字串(刷新反爬措施),以及页码和每页信息条数,可以用来拼接爬取url 用一个循环爬取所有展示页面,用到requests库以及random函数生成随机数 返回的是json数据,直接用r

爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中

爬虫简单之二---使用进程爬取起点中文网的六万多也页小说的名字,作者,等一些基本信息,并存入csv中 准备使用的环境和库Python3.6 + requests + bs4 + csv + multiprocessing 库的说明 requests模拟计算机对服务器发送requests请求 bs4:页面分析功能,分析页面找到所需要的特定内容 xlwt:把爬取的内容存入csv文件中 multiprocessing:开启多进程爬取 1.准备URLs 起点中文网 起点中文网的URL:https://w