首页 > 编程语言 > 详细

[Python] 网络爬虫和正则表达式学习总结

时间:2015-06-05 22:32:24      阅读:262      评论:0      收藏:0      [点我收藏+]

  以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset、beachmark等等。但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的。最近在国内一家互联网公司实习,我的mentor交给我的第一件事就是去网络上爬取数据,并对爬取的数据进行相关的分析和解析。

  1.利用urllib2对指定的URL抓取网页内容

  网络爬虫(Web Spider),顾名思义就是将庞大的互联网看做是一张大网,而我们要做的就是用代码去构造一个类似于爬虫的实体,在这张大网上爬取我们需要的数据。

  所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源Python中提供了专门抓取网络的组件urllib和urllib2。

  最简单的抓取网络的Python代码,四行就可以搞定:

 

1 import urllib2  
2 response = urllib2.urlopen(http://www.toutiao.com/)  
3 html = response.read()  
4 print html

 

  显示抓取的结果:

  技术分享

  我们可以打开百度主页,右击,选择查看源代码(火狐OR谷歌浏览器均可),会发现也是完全一样的内容。也就是说,上面这四行代码将我们访问百度时浏览器收到的代码们全部打印了出来。这就是一个最简单的利用urllib2进行网页爬取的例子。

   当然,有的网站为了防止爬虫,可能会拒绝爬虫的请求,这就需要我们来修改http中的Header项了。还有一些站点有所谓的反盗链设置,其实说穿了很简单,就是检查你发送请求的header里面,referer站点是不是他自己,所以我们只需要像把headers的referer改成该网站即可。有关Header项的修改请转至下边的链接查看,里边详细地介绍了Header的修改、Cookie和表单的处理,等等。

  1)urllib2的使用细节和抓站技巧

  2)用Python爬虫抓站的一些技巧总结

  3)用python写爬虫,去爬csdn的内容,完美解决 403 Forbidden

  4)用Python爬取网页或下载文档的登陆问题

  5)用python2和python3伪装浏览器爬取网页

  6)Python专题教程:抓取网站,模拟登陆,抓取动态网页

 

  2. 使用正则表达式过滤抓取到的网页信息

  如果说网页爬虫爬取的网页信息是数据大海的话,那么正则表达式就是我们进行“大海捞针”的工具。

  首先声明一点,正则表达式不是Python的语法,并不属于Python,其他的语言中也同样支持正则表达式的使用。具体来说,它是一种强大的字符串匹配和处理规则。

  2.1 正则表达式介绍

  下图展示了使用正则表达式进行匹配的流程:

 

  技术分享

 

  下图列出了Python支持的正则表达式元字符和语法:

  2.1.1 正则表达式元字符

  技术分享

  2.1.2 数量词的贪婪模式与非贪婪模式

 

  正则表达式通常用于在文本中查找匹配的字符串。贪婪模式,总是尝试匹配尽可能多的字符;非贪婪模式则相反,总是尝试匹配尽可能少的字符。Python里数量词默认是贪婪的。

 

  例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

 

  2.1.3 反斜杠的问题

 

  与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\":第一个和第三个用于在编程语言里将第二个和第四个转义成反斜杠,转换成两个反斜杠\\后再在正则表达式里转义成一个反斜杠用来匹配反斜杠\。这样显然是非常麻烦的。

 

  Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"

  2.2 Python的re模块

  Python通过re模块提供对正则表达式的支持。

  使用re的一般步骤是:

  Step1:先将正则表达式的字符串形式编译为Pattern实例。

  Step2:然后使用Pattern实例处理文本并获得匹配结果(一个Match实例)。

  Step3:最后使用Match实例获得信息,进行其他的操作。

  一个使用Python的re模块进行正则表达式匹配的例子:

  1. # -*- coding: utf-8 -*-  
    #一个简单的re实例,匹配字符串中的hello字符串  
      
    #导入re模块  
    import re  
       
    # 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串”  
    pattern = re.compile(rhello)  
       
    # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None  
    match1 = pattern.match(hello world!)  
    match2 = pattern.match(helloo world!)  
    match3 = pattern.match(helllo world!)  
      
    #如果match1匹配成功  
    if match1:  
        # 使用Match获得分组信息  
        print match1.group()  
    else:  
        print match1匹配失败!  
      
      
    #如果match2匹配成功  
    if match2:  
        # 使用Match获得分组信息  
        print match2.group()  
    else:  
        print match2匹配失败!  
      
      
    #如果match3匹配成功  
    if match3:  
        # 使用Match获得分组信息  
        print match3.group()  
    else:  
        print match3匹配失败!   

  输出结果:

    hello

    hello

    match3匹配失败!

  当然,也可以省略编译pattern的过程,如下所示:

# -*- coding: utf-8 -*-  
#一个简单的re实例,匹配字符串中的hello字符串  
import re  
  
m = re.match(rhello, hello world!)  
print m.group() 

  除了match以外,Python中还提供了其他的匹配模式,可以针对不同的环境和用途来选择不同的匹配模式。  

  1)match:只从字符串的开始与正则表达式匹配,匹配成功返回matchobject,否则返回none;
  2)search:将字符串的所有字串尝试与正则表达式匹配,如果所有的字串都没有匹配成功,返回none,否则返回matchobject;(re.search相当于perl中的默认行为)

  3)findall:匹配所有匹配成功的结果。

  详细的使用细则,可以查看下边的内容:

  1)Python正则表达式的七个使用范例

  2)Python中正则表达式教程

  当然,如果你觉得使用正则表达式太繁琐的话,Python提供了BeautifulSoup插件来取代正则表达式,进行网页的解析。想了解有关BeautifulSoup方面的知识,请移至下边链接:

  Python抓取网页&批量下载文件方法(正则表达式+BeautifulSoup)

[Python] 网络爬虫和正则表达式学习总结

原文:http://www.cnblogs.com/maybe2030/p/4555382.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!