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

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

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

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

<html>

 <head>

    <title>爬虫测试</title>

 </head>

 <body>

  <div class="topic"><a href="

    <div class="list">

      <url>

        <li><a href="

        <li><a href="

        <li><a href="

      </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)