记得考研的时候,补习班里的数学老师问我们“夹逼定理是夹重要还是逼重要?”记得好多学生不论出于什么心理,或污或正经,都不约而同的回答“逼重要”。老师一本正经地说“逼有什么重要!夹才最重要,当你找到了函数的上下限,就缩小了这个范围,然后逼就是水到渠成的事儿。”


而正则的用法在爬虫的使用上就类似于“夹逼定理”,它利用了web代码的夹,然后“逼”出来一个又一个结果。

===================================分割线========================================

假设电脑里有这样一个111.txt文件,存储路径是e:/pythonaaa/a,他里面装的是网页代码:

<html>

 <head>

    <title>爬虫测试</title>

 </head>

 <body>

  <div class="topic"><a href="www.51cto.com/welcome.html">欢迎来到这里!</a>

    <div class="list">

      <url>

        <li><a href="http://www.51cto.com/1.html">这是第一页</a></li>

        <li><a href="http://www.51cto.com/2.html">这是第二页</a></li>

        <li><a href="http://www.51cto.com/3.html">这是第三页</a></li>

      </url>

    </div>

   </div>

 </body>

</html>


这是一个很简单的网页,学半个小时的网页工程师基本就能写出来。这不是主要内容,主要内容是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
25
26
27
import  os      #载入os模块#
import  re     #载入re模块#   
old_url = "http://www.51cto.com/nihaoma/PageNum=2"     
total_page  =  20    #假设只有20页#
f = open ( "e:/pythonaaa/a/111.txt" , "r" )    #开启这个网页的文本文件#
html = f.read()                #阅读里面的内容,是str形式的,并且给变量html#
f.close()                
title = re.search("<title>(. * ?)< / title>,html,re.S).group( 1 )
#发现网页的“标题”在web源码里在<title>和</title>之间,于是就可以用正则提取#
#这里使用的是re.search,这是因为re.search找到需要的内容就停手了,而re.findall会“刨根问底拦不住”,为了省事省电脑,这里用re.search#
print (title)
links = re.findall( 'a href="(.*?)"' ,html,re.S)
#发现所有网页链接,就是a href字段的后面内容,于是乎,可以用这样的方式捕获#
for  each  in  links:
     print (each)    #逐条打印#
text_field = re.findall("<url>(. * ?)< / url>,html,re.S)[ 0 ]
#这里的目的是要捕获“这是第一页”“这是第二页”“这是第三页”。但是这里不可以用“"a href=(.*?)</a>"”,这是因为标题的“欢迎来到这里”也符合这个要求。于是要“先大后小”,先大锤敲缝然后小锤搞定#
#这里先选择了一个大区域#
text = re.findall(">(. * ?)< / a>,text_field,re.S)
#这里不再引用html作为引用句,而是用上面刚刚切出来的text_field,这样选材更加精细#
for  every_text  in  text:
     print (every_text)
for  in  range ( 2 ,total_page + 1 ):
#range是顾头不顾腚的,所以后面的函数要+1,不然的话只能取到19,取不到20#
     new_link = re.sub( "pageNum=" \d + "," pageNum = % d"  % i,old_url,re.S)
#使用re.sub作为替换功能,因为源网址里右面的pageNum是一个纯数字,于是用"\d+"来捕获纯数字内容,%d代表的是一个十进制数字,而i是从2~20的滚动数字,不断用i的值来代替pageNum,这样来达到翻页的目的#
     print (new_link)