Python制作简单的网页爬虫


Posted in Python onNovember 22, 2015

1.准备工作:

工欲善其事必先利其器,因此我们有必要在进行Coding前先配置一个适合我们自己的开发环境,我搭建的开发环境是:

操作系统:Ubuntu 14.04 LTS
Python版本:2.7.6
代码编辑器:Sublime Text 3.0

这次的网络爬虫需求背景我打算延续DotNet开源大本营在他的那篇文章中的需求,这里就不再详解。我们只抓取某一省中所有主要城市从2015-11-22到2015-10-24的白天到夜间的所有天气情况。这里以湖北省为例。
2.实战网页爬虫:
2.1.获取城市列表:
首先,我们需要获取到湖北省所有城市的网页,然后进行网页解析。网络地址为:http://www.tianqihoubao.com/weather/province.aspx?id=420000
我们查看该网页的源码可以发现所有的城市列表都是以<td style="height: 22px" align="center"><a href="城市天气链接+城市名称">,因此,我们可以封装一个函数来通过使用正则表达式获取我们想要的数据,示例代码如下所示:

def  ShowCity():

    html=requests.get("http://www.tianqihoubao.com/weather/province.aspx?id=420000")

    citys= re.findall('<td style="height: 22px" align="center"><a href="(.*?)">', html.text,re.S)

    for city in citys:

        print city

抓取的结果如下所示:
1 top/anlu.html" title="安陆历史天气查询
 2 top/badong.html" title="巴东历史天气查询
 3 top/baokang.html" title="保康历史天气查询
 4 top/caidian.html" title="蔡甸历史天气查询
 5 top/changyang.html" title="长阳历史天气查询
 6 top/chibi.html" title="赤壁历史天气查询
 7 top/chongyang.html" title="崇阳历史天气查询
 8 top/dawu.html" title="大悟历史天气查询
 9 top/daye.html" title="大冶历史天气查询
10 top/danjiangkou.html" title="丹江口历史天气查询
11 top/dangyang.html" title="当阳历史天气查询
12 top/ezhou.html" title="鄂州历史天气查询
13 top/enshi.html" title="恩施历史天气查询
14 top/fangxian.html" title="房县历史天气查询
15 top/gongan.html" title="公安历史天气查询
16 top/gucheng.html" title="谷城历史天气查询
17 top/guangshui.html" title="广水历史天气查询
18 top/hanchuan.html" title="汉川历史天气查询
19 top/hanyang.html" title="汉阳历史天气查询
20 top/hefeng.html" title="鹤峰历史天气查询
21 top/hongan.html" title="红安历史天气查询
22 top/honghu.html" title="洪湖历史天气查询
23 top/huangpi.html" title="黄陂历史天气查询
24 top/huanggang.html" title="黄冈历史天气查询
25 top/huangmei.html" title="黄梅历史天气查询
26 top/huangshi.html" title="黄石历史天气查询
27 top/jiayu.html" title="嘉鱼历史天气查询
28 top/jianli.html" title="监利历史天气查询
29 top/jianshi.html" title="建始历史天气查询
30 top/jiangxia.html" title="江夏历史天气查询
31 top/jingshan.html" title="京山历史天气查询
32 top/jingmen.html" title="荆门历史天气查询
33 top/jingzhou.html" title="荆州历史天气查询
34 top/laifeng.html" title="来凤历史天气查询
35 top/laohekou.html" title="老河口历史天气查询
36 top/lichuan.html" title="利川历史天气查询
37 top/lvtian.html" title="罗田历史天气查询
38 top/macheng.html" title="麻城历史天气查询
39 top/nanzhang.html" title="南漳历史天气查询
40 top/qichun.html" title="蕲春历史天气查询
41 top/qianjiang.html" title="潜江历史天气查询
42 top/sanxia.html" title="三峡历史天气查询
43 top/shennongjia.html" title="神农架历史天气查询
44 top/shiyan.html" title="十堰历史天气查询
45 top/shishou.html" title="石首历史天气查询
46 top/songzi.html" title="松滋历史天气查询
47 top/suizhou.html" title="随州历史天气查询
48 top/tianmen.html" title="天门历史天气查询
49 top/hbtongcheng.html" title="通城历史天气查询
50 top/tongshan.html" title="通山历史天气查询
51 top/wufeng.html" title="五峰历史天气查询
52 top/wuchang.html" title="武昌历史天气查询
53 top/wuhan.html" title="武汉历史天气查询
54 top/wuxue.html" title="武穴历史天气查询
55 top/hbxishui.html" title="浠水历史天气查询
56 top/xiantao.html" title="仙桃历史天气查询
57 top/xianfeng.html" title="咸丰历史天气查询
58 top/xianning.html" title="咸宁历史天气查询
59 top/xiangyang.html" title="襄阳历史天气查询
60 top/xiaogan.html" title="孝感历史天气查询
61 top/hbxinzhou.html" title="新洲历史天气查询
62 top/xingshan.html" title="兴山历史天气查询
63 top/xuanen.html" title="宣恩历史天气查询
64 top/hbyangxin.html" title="阳新历史天气查询
65 top/yiling.html" title="夷陵历史天气查询
66 top/yichang.html" title="宜昌历史天气查询
67 top/yicheng.html" title="宜城历史天气查询
68 top/yidu.html" title="宜都历史天气查询
69 top/yingcheng.html" title="应城历史天气查询
70 top/hbyingshan.html" title="英山历史天气查询
71 top/yuanan.html" title="远安历史天气查询
72 top/yunmeng.html" title="云梦历史天气查询
73 top/yunxi.html" title="郧西历史天气查询
74 top/hbyunxian.html" title="郧县历史天气查询
75 top/zaoyang.html" title="枣阳历史天气查询
76 top/zhijiang.html" title="枝江历史天气查询
77 top/zhongxiang.html" title="钟祥历史天气查询
78 top/zhushan.html" title="竹山历史天气查询
79 top/zhuxi.html" title="竹溪历史天气查询
80 top/zigui.html" title="秭归历史天气查询
81 [Finished in 15.4s]

2.2.获取对应城市的所有天气信息:
然后我们需要根据抓取到的城市链接去抓取对应城市的天气情况,这里我们再封装一个函数用于显示对应城市的所有天气状况:

def ShowWeather(city):
 res =str(city).split('" title="')
 print res[1],'(白天-->夜间)'
 html=requests.get("http://www.tianqihoubao.com/weather/{0}".format(res[0]))
 weather=re.search('<table width="100%" border="0" class="b" cellpadding="1" cellspacing="1">(.*?)</table>', html.text,re.S).group(1)
 res=re.findall('<tr>(.*?)</tr>', weather,re.S)
 for x in res[2:]:
  w = re.findall('>(.*?)<', x,re.S)
  for y in w[1:]:
   if len(y.strip())<=0:
    pass
    else:
     print y
  print '--'*40

这样以来,我们就可以获取到了对应城市的天气情况了!!

完整代码:

#coding:UTF-8
import re
import requests
import sys
reload(sys)
sys.setdefaultencoding('UTF-8')

def ShowWeather(city):
 res =str(city).split('" title="')
 print res[1],'(白天-->夜间)'
 html=requests.get("http://www.tianqihoubao.com/weather/{0}".format(res[0]))
 weather=re.search('<table width="100%" border="0" class="b" cellpadding="1" cellspacing="1">(.*?)</table>', html.text,re.S).group(1)
 res=re.findall('<tr>(.*?)</tr>', weather,re.S)
 for x in res[2:]:
  w = re.findall('>(.*?)<', x,re.S)
  for y in w[1:]:
   if len(y.strip())<=0:
    pass
   else:
    print y
  print '--'*40
 print '\n','*'*40

def ShowCity():
 html=requests.get("http://www.tianqihoubao.com/weather/province.aspx?id=420000")
 citys= re.findall('<td style="height: 22px" align="center"><a href="(.*?)">', html.text,re.S)
 for city in citys:
  ShowWeather(city)

def main():
 ShowCity()

if __name__=='__main__':
 main()

是的,你没有看错,短短34行代码就可以爬取湖北省所有的主要城市1个月的所有天气情况,是不是很厉害呀!!???不过不要高兴的太早,凡事有利有弊,看看它的运行结果吧:[Finished in 371.8s]

3.知识总结:

3.1.编码问题: 
#在ubuntu上,由于编码问题,我们需要在代码的开始位置添加一行注释,告诉Pyhton解释器我们指定的编码格式:

#此外,我们还需要设置默认的编码格式,否则Sublime Text会无法识别中文,报告一个错误:“UnicodeEncodeError: 'ascii' codec can't encode characters in position”

#-*-coding:utf8-*-
import sys
reload(sys)
sys.setdefaultencoding('UTF-8')

3.2.正则表达式:

导入正则表达式库:import re
匹配任意字符:.
匹配前一个字符0次或无限次:*
匹配前一个字符0次或一次:?
贪心算法:.*
非贪心算法:.*?
匹配数字:(\d+)
常用函数:

re.findall(pattern, string)
re.search(pattern, string)
re.sub(pattern, repl, string)

最后的最后,如果你尝试过运行我贴出来的完整代码,或许你会遇到和我一样的瓶颈,就是运行的速度不够快(尤其像我这种机器配置不是很好的电脑)。在我的机器上运行这段脚本总共花费了 371.8s。我运行过多次,每次都是在350+。因此,如果你的程序不在乎运行速度,那么可能Python还是挺适合的,毕竟可以通过它写更少的代码去做更多的事情!!!!

Python 相关文章推荐
详解Python中的循环语句的用法
Apr 09 Python
在Python中移动目录结构的方法
Jan 31 Python
基于Python 的进程管理工具supervisor使用指南
Sep 18 Python
Python 绘图和可视化详细介绍
Feb 11 Python
python GUI实例学习
Nov 21 Python
浅析python协程相关概念
Jan 20 Python
python距离测量的方法
Mar 06 Python
Python实现的各种常见分布算法示例
Dec 13 Python
Python: 传递列表副本方式
Dec 19 Python
python实现输入三角形边长自动作图求面积案例
Apr 12 Python
Python基础详解之邮件处理
Apr 28 Python
Python数组变形的几种实现方法
May 30 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 #Python
在Mac OS系统上安装Python的Pillow库的教程
Nov 20 #Python
详解Python编程中time模块的使用
Nov 20 #Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
Nov 20 #Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 #Python
Python聚类算法之DBSACN实例分析
Nov 20 #Python
Python聚类算法之凝聚层次聚类实例分析
Nov 20 #Python
You might like
coreseek 搜索英文的问题详解
2013/06/08 PHP
在PHP程序中使用Rust扩展的方法
2015/07/03 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
babel基本使用详解
2017/02/17 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
微信跳一跳自动运行python脚本
2018/01/08 Python
对python使用http、https代理的实例讲解
2018/05/07 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
python实现随机漫步算法
2018/08/27 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
浅谈Python编程中3个常用的数据结构和算法
2019/04/30 Python
Python中的类与类型示例详解
2019/07/10 Python
python hashlib加密实现代码
2019/10/17 Python
Python中Subprocess的不同函数解析
2019/12/10 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
Python 日期与时间转换的方法
2020/08/01 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
Expedia加拿大官方网站:加拿大最大的在线旅游提供商
2017/12/31 全球购物
优秀教师先进事迹
2014/01/22 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
工作建议书范文
2014/05/13 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
2016大学生社会实践心得体会范文
2016/01/14 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
详解Laravel制作API接口
2021/05/31 PHP