这次爬取数据主要为了本人R语言期末作业第二部分,数据集不好获得,所以干脆自己爬取了一个简单数据集,使用方法为bs4,这个包我不太熟悉,主要是借鉴网上的主流思想方向,爬取了日期、天气状况、气温等数据并保存为csv表格。

  1. 导入包
    本次使用到requests爬虫必需包,pandas用来数据处理包,time休眠包,random随机数包,bs4解析网页源码包以及反爬取的模拟浏览器fake_useragent 包。
import requests
import pandas as pd
import time, random
import csv
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
  1. 首先设置headers及UA

#http://www.tianqihoubao.com/lishi/xinxiang/month/202111.html
天气后报网站爬取当天的天气页面

headers = {'Referer': 'www.tianqihoubao.com',
            'User-Agent': str(UserAgent().random)
               }
for page in range(11, 22, 1):
    url = f'http://www.tianqihoubao.com/lishi/xinxiang/month/20%s11.html' % page
        # 获取响应
    resp = requests.get(url, headers=headers)

     # 对于获取到的 HTML 二进制文件进行 'gbk' 转码成字符串文件
    html = resp.content.decode('gbk')
        # 通过第三方库 BeautifulSoup 缩小查找范围(同样作用的包库还有re模块、xpath等)
    soup = BeautifulSoup(html,'html.parser')
        # 获取 HTML 中所有<tr>…</tr>标签,因为我们需要的数据全部在此标签中存放
    tr_list = soup.find_all('tr')
        # 初始化日期dates、气候contains、温度temp值
    dates, contains, temp = [], [], []
    for data in tr_list[1:]:  # 不要表头
            # 数据值拆分,方便进一步处理(这里可以将获得的列表输出[已注释],不理解的读者可运行查看)
        sub_data = data.text.split()
            # 观察上一步获得的列表,这里只想要获得列表中第二个和第三个值,采用切片法获取
        dates.append(sub_data[0])
        contains.append(','.join(sub_data[1:3]))
            # print(contains)
            # 同理采用切片方式获取列表中的最高、最低气温
        temp.append(','.join(sub_data[3:6]))
            # print(temp)
        # 使用 _data 表存放日期、天气状况、气温表头及其值
        _data = pd.DataFrame()
        # 分别将对应值传入 _data 表中
        _data['日期'] = dates
        _data['天气状况'] = contains
        _data['气温'] = temp

    print(_data)
    data = pd.concat([_data]).reset_index(drop=True)
    data.to_csv('D:/666666/PycharmWorkspace/Pythonspider/系统学习/天气文件/%sYear11Mouth.csv ' % page, encoding='utf-8')
    print("第%s年的数据ok" % page)
    time.sleep(2)

其中URL的变化要注意一下,最好刚开始不要用循环,那样的话报错误的话比较难找,本人开始就是先爬取一年的,然后再做出循环的。

比较文件保存情况如下:

Python爬取全国省会城市的红色天气预警_数据

所有源码都已经上传,如果看到请给刚开始发表文章的我一个支持吧,本人会将自己学习中做出的一些代码分享给大家,同时与大家互相进步。