Python爬虫课--第七节 BeautifulSoup4的练习---爬取天气网的数据

爬取的时候以网页源代码为主

  • html5lib 解析能力更强,网页错乱啊,标签不全啊 用来更好的塑造源码结构 与lxml可以替换
# 需求 爬取全国所有城市名称,已经对应的气温
# 分析其他区域的url规律
# 华东 http://www.weather.com.cn/textFC/hd.shtml
# 华北 http://www.weather.com.cn/textFC/hb.shtml

# 先搞定华北地区
import requests
from bs4 import BeautifulSoup

# 定义一个函数来解析网页
def parse_page(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.3775.400 QQBrowser/10.6.4208.400'
    }

    response = requests.get(url,headers=headers)
    # 解决乱码
    text = response.content.decode('utf-8')
    soup = BeautifulSoup(text,'html5lib')  # html5lib 解析能力更强,网页错乱啊,标签不全啊 用来更好的塑造源码结构 与lxml可以替换

    # 网页解析
    # 1.先拿到class="conMidtab"
    conMidtab = soup.find('div',class_ = 'conMidtab')
    # print(conMidtab)

    # 2.拿到table
    tables = conMidtab.find_all('table')
    # print(tables)

    # 3.找到tr过滤掉前两个
    for table in tables:
        # print(table)
        # 过滤掉前两个tr
        trs = table.find_all('tr')[2:]
        # enumerate会返回两个值,一个是下标,二是下标所对的元素
        for index,tr in enumerate(trs):
            # print(tr)

            # 4.找到td
            tds = tr.find_all('td')

            # 判断
            city_td = tds[0] # 城市

            if index == 0:
                city_td = tds[1] # 取省会
            # print(city_td) # 打印城区

            # 获取一个标签下面的子孙节点的文本信息
            city = list(city_td.stripped_strings)[0]
            # 获取温度标签
            temp_td = tds[-2]
            # 获取温度标签下的文本
            temp = list(temp_td.stripped_strings)[0]
            print('城市:',city,'温度:',temp)
        # break # 先打印北京

    # 4.找到td

    # print(text)


def main():

    url = 'http://www.weather.com.cn/textFC/hb.shtml' # 华北
    # url = 'http://www.weather.com.cn/textFC/db.shtml' # 东北
    url = 'http://www.weather.com.cn/textFC/gat.shtml'  #港澳台

    urls = ['http://www.weather.com.cn/textFC/hb.shtml','http://www.weather.com.cn/textFC/db.shtml','http://www.weather.com.cn/textFC/gat.shtml']

    for url in urls:
        # 调用解析函数
        parse_page(url)

if __name__ == '__main__':

    main()

结果

城市: 北京 温度: 19
城市: 海淀 温度: 18
城市: 朝阳 温度: 20
城市: 顺义 温度: 18
城市: 怀柔 温度: 17
城市: 通州 温度: 18
城市: 昌平 温度: 18
城市: 延庆 温度: 14
城市: 丰台 温度: 19
城市: 石景山 温度: 18
城市: 大兴 温度: 18
城市: 房山 温度: 18
城市: 密云 温度: 16
城市: 门头沟 温度: 19
城市: 平谷 温度: 17
城市: 东城 温度: 20
城市: 西城 温度: 18
城市: 天津 温度: 21
城市: 武清 温度: 20
城市: 宝坻 温度: 18
城市: 东丽 温度: 20
城市: 西青 温度: 20
城市: 北辰 温度: 19
城市: 宁河 温度: 19
城市: 和平 温度: 21
城市: 静海 温度: 20
城市: 津南 温度: 20
城市: 滨海新区 温度: 20
城市: 河东 温度: 21
城市: 河西 温度: 21
城市: 蓟州 温度: 18
城市: 南开 温度: 21
城市: 河北 温度: 21
城市: 红桥 温度: 21
城市: 石家庄 温度: 19
城市: 保定 温度: 16
城市: 张家口 温度: 11
城市: 承德 温度: 12
城市: 唐山 温度: 16
城市: 廊坊 温度: 18
城市: 沧州 温度: 17
城市: 衡水 温度: 18
城市: 邢台 温度: 19
城市: 邯郸 温度: 18
城市: 秦皇岛 温度: 16
城市: 雄安新区 温度: 17
城市: 太原 温度: 9
城市: 大同 温度: 5
城市: 阳泉 温度: 13
城市: 晋中 温度: 12
城市: 长治 温度: 12
城市: 晋城 温度: 15
城市: 临汾 温度: 15
城市: 运城 温度: 15
城市: 朔州 温度: 6
城市: 忻州 温度: 9
城市: 吕梁 温度: 11
城市: 呼和浩特 温度: 8
城市: 包头 温度: 8
城市: 乌海 温度: 11
城市: 乌兰察布 温度: 7
城市: 通辽 温度: 16
城市: 赤峰 温度: 13
城市: 鄂尔多斯 温度: 10
城市: 巴彦淖尔 温度: 9
城市: 锡林郭勒 温度: 9
城市: 呼伦贝尔 温度: 7
城市: 兴安盟 温度: 14
城市: 阿拉善盟 温度: 12
城市: 哈尔滨 温度: 17
城市: 齐齐哈尔 温度: 15
城市: 牡丹江 温度: 18
城市: 佳木斯 温度: 18
城市: 绥化 温度: 17
城市: 黑河 温度: 12
城市: 大兴安岭 温度: 8
城市: 伊春 温度: 15
城市: 大庆 温度: 16
城市: 七台河 温度: 18
城市: 鸡西 温度: 18
城市: 鹤岗 温度: 17
城市: 双鸭山 温度: 18
城市: 长春 温度: 18
城市: 吉林 温度: 16
城市: 延边 温度: 18
城市: 四平 温度: 18
城市: 通化 温度: 17
城市: 白城 温度: 16
城市: 辽源 温度: 19
城市: 松原 温度: 17
城市: 白山 温度: 16
城市: 沈阳 温度: 16
城市: 大连 温度: 21
城市: 鞍山 温度: 17
城市: 抚顺 温度: 16
城市: 本溪 温度: 14
城市: 丹东 温度: 19
城市: 锦州 温度: 19
城市: 营口 温度: 18
城市: 阜新 温度: 16
城市: 辽阳 温度: 16
城市: 铁岭 温度: 16
城市: 朝阳 温度: 16
城市: 盘锦 温度: 18
城市: 葫芦岛 温度: 18
城市: 香港 温度: 28
城市: 澳门 温度: 27
城市: 台北 温度: 25
城市: 高雄 温度: 27
城市: 台中 温度: 22

你可能感兴趣的:(python)