记得考研的时候,补习班里的数学老师问我们“夹逼定理是夹重要还是逼重要?”记得好多学生不论出于什么心理,或污或正经,都不约而同的回答“逼重要”。老师一本正经地说“逼有什么重要!夹才最重要,当你找到了函数的上下限,就缩小了这个范围,然后逼就是水到渠成的事儿。”
而正则的用法在爬虫的使用上就类似于“夹逼定理”,它利用了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 i 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) |