业务需要所以爬取了这网站,这里分享些经验,爬取的网站是https://solarmonitor.org/
先说一下难点,
- url后面是通过日期进行翻页,但是如何输出循环式的日历式的格式呢
- 需要计算耀斑爆发次数,而不是爆发的等级
针对第一个难点,下面提供解决办法,
import datetime
day_list = []
begin = datetime.date(2013,1,1) #初始日期
end = datetime.date(2014,1,1) #目标日期
for i in range((end-begin).days+1):
day = begin+datetime.timedelta(days=i)
day_list.append(str(day.strftime('%Y%m%d'))) #进行格式转换
print(day_list)
第二个难点如何计算耀斑爆发次数,这边就不提供了,思路需要转变下就出来了。
下面列出源代码
import datetime,requests,csv
from bs4 import BeautifulSoup
#日期循环
day_list=[]
begin = datetime.date(2013,1,1)
end = datetime.date(2014,1,1)
for i in range((end-begin).days+1):
day = begin+datetime.timedelta(days=i)
day_list.append(str(day.strftime('%Y%m%d')))#进行格式转换
print(day_list)
headers={
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
#文件写入
csv_file = open('a2013.csv','w',newline='')
write = csv.writer(csv_file)
for q in day_list:
url = 'https://solarmonitor.org/index.php?date='+ q
res = requests.get(url,headers=headers)
bs = BeautifulSoup(res.text,'html.parser')
noaa=bs.find_all('tr',class_='noaaresults')
#print('爬完'+q +"日") #用于查看爬完的日期
for i in noaa:
f = []
number = i.find(id='noaa_number').text
position = i.find(id='position').text
positions = position.replace('S','+').replace('N','-') #需求要把南北换成 +\-
flares = i.find(id='events').text
flares = 已打码 #计算耀斑次数
# print(number,positions[4:7],flares)
write.writerow([number,positions[4:7],flares])
因为爬取的周期很长,所以通过异步多线程解决是最好也是最快的,爬取5年大概130秒左右,但我提供的这段代码是单线程的,所以效率比较低。