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

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

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

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

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

  最简单的抓取网络的Python代码,四行就能够搞定:正则表达式

 

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

 

  显示抓取的结果:express

  

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

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

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

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

  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(r'hello')  
       
    # 使用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(r'hello', '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)

2.3 Python正则表达式汇总

  2.3.1 正则表达式模式

  模式字符串使用特殊的语法来表示一个正则表达式:

  字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配一样的字符串。

  多数字母和数字前加一个反斜杠时会拥有不一样的含义。

  标点符号只有被转义时才匹配自身,不然它们表示特殊的含义。

  反斜杠自己须要使用反斜杠转义。

  因为正则表达式一般都包含反斜杠,因此你最好使用原始字符串来表示它们。模式元素(如 r'/t',等价于'//t')匹配相应的特殊字符。

  下表列出了正则表达式模式语法中的特殊元素。若是你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式 描述
^ 匹配字符串的开头
$ 匹配字符串的末尾。
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则能够匹配包括换行符的任意字符。
[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...] 不在[]中的字符:[^abc] 匹配除了a,b,c以外的字符。
re* 匹配0个或多个的表达式。
re+ 匹配1个或多个的表达式。
re? 匹配0个或1个由前面的正则表达式定义的片断,非贪婪方式
re{ n}  
re{ n,} 精确匹配n个前面表达式。
re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片断,贪婪方式
a| b 匹配a或b
(re) G匹配括号内的表达式,也表示一个组
(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re) 相似 (...), 可是不表示一个组
(?imx: re) 在括号中使用i, m, 或 x 可选标志
(?-imx: re) 在括号中不使用i, m, 或 x 可选标志
(?#...) 注释.
(?= re) 前向确定界定符。若是所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,不然失败。但一旦所含表达式已经尝试,匹配引擎根本没有提升;模式的剩余部分还要尝试界定符的右边。
(?! re) 前向否认界定符。与确定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re) 匹配的独立模式,省去回溯。
\w 匹配字母数字
\W 匹配非字母数字
\s 匹配任意空白字符,等价于 [\t\n\r\f].
\S 匹配任意非空字符
\d 匹配任意数字,等价于 [0-9].
\D 匹配任意非数字
\A 匹配字符串开始
\Z 匹配字符串结束,若是是存在换行,只匹配到换行前的结束字符串。c
\z 匹配字符串结束
\G 匹配最后匹配完成的位置。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 能够匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等. 匹配一个换行符。匹配一个制表符。等
\1...\9 匹配第n个分组的子表达式。
\10 匹配第n个分组的子表达式,若是它经匹配。不然指的是八进制字符码的表达式。

  2.3.2 正则表达式实例

  字符匹配:

实例 描述
python 匹配 "python".

 

  字符类:

实例 描述
[Pp]ython 匹配 "Python" 或 "python"
rub[ye] 匹配 "ruby" 或 "rube"
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。相似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母之外的全部字符
[^0-9] 匹配除了数字外的字符

 

  特殊字符类:

实例 描述
. 匹配除 "\n" 以外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。

   Python正则表达式详细教程请见W3CSCHOOL Python正则表达式

  更加详细的正则表达式教程请见正则表达式手册

相关文章
相关标签/搜索