这次爬取数据主要为了本人R语言期末作业第二部分,数据集不好获得,所以干脆自己爬取了一个简单数据集,使用方法为bs4,这个包我不太熟悉,主要是借鉴网上的主流思想方向,爬取了日期、天气状况、气温等数据并保存为csv表格。
- 导入包
本次使用到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
- 首先设置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的变化要注意一下,最好刚开始不要用循环,那样的话报错误的话比较难找,本人开始就是先爬取一年的,然后再做出循环的。
比较文件保存情况如下:
所有源码都已经上传,如果看到请给刚开始发表文章的我一个支持吧,本人会将自己学习中做出的一些代码分享给大家,同时与大家互相进步。