Python爬虫实例扒取2345天气预报

时间:2022-10-31 22:42:45

寒假里学习了一下python爬虫,使用最简单的方法扒取需要的天气数据,对,没听错,最简单的方法。甚至没有一个函数封装。。

网址:http://tianqi.2345.com/wea_history/53892.htm

火狐中右键查看网页源代码,没有发现天气数据,因此推断网页采用的json格式数据。

右击->查看元素->网络->js,找到了位置

Python爬虫实例扒取2345天气预报

用python爬虫下载为json格式数据存储下来,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#-*- coding:utf-8 -*-
import urllib2
import json
 
months = [1,2,3,4,5,6,7,8,9,10,11,12]
years = [2011,2012,2013,2014,2015,2016]
city = [53892#邯郸代码53892
 
for y in years:
  for m in months:
    for c in city:
      url = "http://tianqi.2345.com/t/wea_history/js/"+str(c)+"_"+str(y)+str(m)+".js?qq-pf-to=pcqq.c2c"
      print url
      html = urllib2.urlopen(url)
      srcdata = html.read()
      #jsondata = json.loads(srcdata)
      file = open("d:/json/"+str(c)+"handan/weather"+str(c)+"_"+str(y)+str(m)+".json","w")
      file.write(srcdata)
      file.close()
扒取存到本地:

因为是刚学,学一点就动手实践了一下,还没有学到json的转换,直接使用的正则匹配,提取json中的数据,直接打印

提取转换json文件中的数据python代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#-*- coding:utf-8 -*-
import json
import re
import time
 
year = [2014]
month = [1]
 
for y in year:
  for m in month:
     
    """
    2016年2月15日终于改成功。
    是因为正则匹配后的编码问题,导致输出时无法显示。
    在每个正则匹配的元组后添加 .decode('gbk').encode('utf-8'),成功输出
    """
    content = fread.read()
    pattern = re.compile('{ymd:\'(.*?)\',bwendu:\'(.*?)\',ywendu:\'(.*?)\',tianqi:\'(.*?)\',fengxiang:\'(.*?)\',fengli:\'(.*?)\'},',re.s)
    items = re.findall(pattern,content)
    for item in items:
      print item[0].decode('gbk').encode('utf-8'),","+item[1].decode('gbk').encode('utf-8'),","+item[2].decode('gbk').encode('utf-8'),","+item[3].decode('gbk').encode('utf-8'),","+item[4].decode('gbk').encode('utf-8'),","+item[5].decode('gbk').encode('utf-8')
      time.sleep(0.1)
 
    fread.close()

使用sublime text 3运行

使用正则处理的一大问题就是,格式不整齐,总会漏掉一些数据。可能是由于匹配的速度过快导致部分数据缺失,但是通过time.sleep() 睡眠依旧不能解决问题。

由此可以看出正则匹配时的缺陷,待以后使用python中专门用于处理json数据的包以后,再重新试一下

原文链接:http://blog.csdn.net/BieberSen/article/details/50767095