爬取和预处理网页div标签数据
1.爬取数据
2.将爬取数据转换为DataFrame
3.预处理爬取后的数据
发了好几遍,都是版权问题审核不通过,以为是网址的问题,屏蔽了网址,还是不行,以为是数据的问题,删除数据还是不行,代码基本都是自己敲的,不知道到底是什么原因。
1. 爬取数据
设置爬取参数
爬取网页信息
解析爬取网页
提取有用信息
import pandas as pd
import requests
from bs4 import BeautifulSoup as bs
# 设置请求header信息,有些网站是禁止爬虫程序爬取数据的,可以通过设置header信息来伪造浏览器浏览数据
headers = {'User-Agent': 'Mozilla/5.0',
'Host':'设置网站主机'}
# 查看和分析爬取数据的网址
url = 'https://lishi.*****.com/lanzhou/202201.html'
# 爬取2022年12个月份的数据
data_all=[]
# 设置爬取年份
year=2022
# 通过分析爬取页面,可以观察到数据是按月份呈现在不同的页面,因此构造循环来爬取每个月的数据
for i in range(12):
url = 'https://lishi.*****.com/lanzhou/{}{:0>2d}.html'.format(year,i+1)
r = requests.request("GET", url, headers=headers)
r.encoding = 'utf-8'
# 观察爬取到的数据或者是爬取页面的源代码,分析爬取内容,用bs对爬取内容进行解析
# 重点掌握BeautifulSoup的find方法和find_all方法
soup = bs(r.text,'html.parser')
qianqi=soup.find("div",{"class":"tian_three"})# 查找的div标签class为tian_three
daylist=qianqi.find_all("li")
for i in daylist:
weather_div=i.find_all("div")
temp=[]
for j in weather_div:
temp.append(j.text)
data.append(temp)
## 2. 将爬取数据转换为DataFrame
```python
columns_name=['日期','最高温度','最低温度','天气状况','风向']
df=pd.DataFrame(data_all,columns=columns_name)
df
df.columns=['date_week','max_T','min_T','weather','wind']
df
# 保存爬取数据
df.to_excel('data/lanzhou_weather_2018.xlsx',encoding='utf_8')
df.dtypes
date_week object
max_T object
min_T object
weather object
wind object
dtype: object
3. 预处理爬取数据
### 拆分日期星期信息
### 拆分风向信息
df
df['date_week'].apply(str)
temp = pd.DataFrame(df['date_week'].apply(lambda x:pd.Series(str(x).split(' '))))
temp
# 发现有多余空列
拆分表格列数据
temp=temp.loc[:,0:1]
temp.columns=['date','week']
# df=df.join(temp)
df
df['wind'].apply(str)
temp2=pd.DataFrame(df['wind'].apply(lambda x:pd.Series(str(x).split(' '))))
处理风向信息
temp2.columns = ['wind_direction','wind_level']
df=df.join(temp2)
df
处理日期信息
df = df.drop(columns="date_week")
df = df.drop(columns='wind')
设置爬取表格头信息
df=df[['date','week','max_T','min_T','weather','wind_direction','wind_level']]
df
# df.insert(loc=0,column="date",value=temp['date'])
# df.insert(loc=1,column="week",value=temp['week'])
# df.insert(loc=5,column="wind_direction",value=temp2['wind_direction'])
# df.insert(loc=6,column="wind_level",value=temp2['wind_level'])
# df
#保存预处理结果
df.to_excel('data/lanzhou_weather_2018pro.xlsx',encoding='utf_8')