0°

Python带你轻松进行网页爬虫

内容预览:
  • 始发于微信公众号: 程序员大咖 前不久DotNet开源大本营通过为.NET程序...~
  • 这里以湖北省为例~
  • 因此,如果你的程序不在乎运行速度,那么可能Python还是挺适合的,毕竟...~

始发于微信公众号: 程序员大咖

前不久DotNet开源大本营通过为.NET程序员演示如何在.NET下使用C#+HtmlAgilityPack+XPath进行网页数据的抓取,从而为我们展示了HtmlAgilitypack利器的优点和使用技巧,不熟悉的朋友可以去他的园子里看看这篇文章,真的很不错!我本身也是一名.NET程序员,只是个人兴趣和一些实际需求,所以就打算自学Python。在还没有学它的时候就听说用它来进行网页爬虫和自然语言处理非常方便,所以也就尝试了,结果让我真的很满意!这篇博文就当是对我这一阶段的学习总结吧!


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

抓取的结果如下所示:


 View Code


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还是挺适合的,毕竟可以通过它写更少的代码去做更多的事情!!!!


来自:hippieZhou – 博客园

链接:http://www.cnblogs.com/hippieZhou/p/4967075.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

以上就是:Python带你轻松进行网页爬虫 的全部内容。

本站部分内容来源于互联网和用户投稿,如有侵权请联系我们删除,谢谢。
Email:[email protected]


0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论