(2)点击切换月份按钮,查看不同月份天气,发现网页URL没有变化,判断为js异步加载数据
网页URL.png
(3)按F12查看Network,点击切换月份,发现每次点击都有新的js加载出现:
F12-Network.png
(4)分别查看动态加载的js的Headers和Response查看请求的URL规律和返回值。发现日期的变化包含在Request Url中,返回值即为json格式的天气数据。
Headers_Resquest url.png
Response.png
(5)Copy as cURL使用Postman发送请求测试,发现Headers中不携带Referer将返回403拒绝访问,所以在Headers请求中需携带Referer。
Copy as cURL.png Postman请求测试.png
(6)程序代码1(存储到MySQL数据库):
import requests
import json
import pymysql
class WeatherSpider(object):
connect = pymysql.connect(
host='localhost',
user='root',
passwd='root',
db='test',
port=3306,
charset='utf8'
)
cursor = connect.cursor()
def __inti__(self):
pass
def request(self,url):
#请求头(不带Referer将返回403,用Postman测试)
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'Referer':
}
return requests.get(url,headers=headers)
def create_url(self):
year = '2016'
for i in range(1,13):
month = str(i) if i > 9 else "0" + str(i)
url = + year + "/101060201_" + year + month + ".html"
self.get_data(url)
#关闭数据库链接,释放资源
self.connect.close()
def get_data(self,url):
respone = self.request(url).content
json_str = respone.decode(encoding='utf-8')[11:]
weathers = json.loads(json_str)
for weather in weathers:
self.cursor.execute("use test")
self.cursor.execute("insert into jilin_weather_tbl (date,week,hmax,hmin,hgl) values(%s,%s,%s,%s,%s)",(weather.get('date'),'星期'+weather.get('wk'),weather.get('hmax'),weather.get('hmin'),weather.get('hgl')))
if __name__ == '__main__':
jl_weather = WeatherSpider()
jl_weather.create_url()
实现效果图:
存入MySQL数据库.png
(7)程序代码2(存储到Mongo数据库)
import requests
import json
import pymongo
class WeatherSpider(object):
client = pymongo.MongoClient('localhost', 27017)
mydb = client['mydb']
jilin_weather = mydb['jilin_weather']
def __inti__(self):
pass
def request(self,url):
#请求头(不带Referer将返回403,用Postman测试)
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'Referer':
}
return requests.get(url,headers=headers)
def create_url(self):
year = '2016'
for i in range(1,13):
month = str(i) if i > 9 else "0" + str(i)
url = + year + "/101060201_" + year + month + ".html"
self.get_data(url)
def get_data(self,url):
respone = self.request(url).content
json_str = respone.decode(encoding='utf-8')[11:]
weathers = json.loads(json_str)
for weather in weathers:
#构建插入Mongo数据库的字典data
data = {
'日期': weather.get('date'),
'星期': weather.get('wk'),
'最高温度':weather.get('hmax'),
'最低温度':weather.get('hmin'),
'降水概率':weather.get('hgl')
}
self.jilin_weather.insert_one(data)
if __name__ == '__main__':
jl_weather = WeatherSpider()
jl_weather.create_url()
实现效果图:
存入Mongo数据库.png
(8)程序代码3(存储到CSV文件)
import requests
import json
import csv
class WeatherSpider(object):
#csv文件表头
with open('jilin_weather.csv', 'w') as f:
f_csv = csv.writer(f)
f_csv.writerow(['日期', '星期', '最高温', '最低温', '降水概率'])
def __inti__(self):
pass
def request(self,url):
#请求头(不带Referer将返回403,用Postman测试)
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'Referer':
}
return requests.get(url,headers=headers)
def create_url(self):
year = '2016'
for i in range(1,13):
month = str(i) if i > 9 else "0" + str(i) #给一位数前加0
url = + year + "/101060201_" + year + month + ".html"
self.get_data(url)
def get_data(self,url):
respone = self.request(url).content
json_str = respone.decode(encoding='utf-8')[11:]
weathers = json.loads(json_str)
for weather in weathers:
#构建插入csv文件的列表data
data = [weather.get('date'),weather.get('wk'),weather.get('hmax'),weather.get('hmin'),weather.get('hgl')]
with open('jilin_weather.csv', 'a') as f: #以a(append)的方式追加写入
f_csv = csv.writer(f)
f_csv.writerow(data)
if __name__ == '__main__':
jl_weather = WeatherSpider()
实现效果图:
保存到CSV文件.png
这三种数据的存储方式,代码分别引用了Python的pymysql库、pymongo库和csv库
1.使用MySQL数据库需要提前建立数据表,并设定好对应存储数据的字段,字段的类型(int、varchat、date......)以及字段的长度。
2.Mongo数据库我也是刚刚使用,但是对这个非关系型数据库比较有好感,因为使用它不必向MySQL数据库那样,要建立数据表和设定字段,给我的感觉就是直接将Python字典型数据直接“怼”进去既可以,比较方便。
3.将数据保存到csv文件的方式比较简单,比较适合没有搭建数据库环境和没有数据库基础的使用者,这种类似Excel表格的文件格式,在获取数据后可以转换为Excel文件,利用VBA和Excel函数进行数据的处理。
以上仅是个人近阶段学习的总结,可能存在着许多片面和理解不到位的地方,还请大家不吝赐教,批评指正。