突然心血来潮,想要好好研究下python的正则表达式,每次遇到正则总是百度这个.*?什么意思,感觉好烦。。不如来好好研究下具体的符号,但是研究了总要有个用途,于是我决定配合requests库,来进行页面的爬取,然后利用正则表达式,来对页面的标题进行一个匹配,从而得到我们博客的所有页面标题~
下面我普及一下requests库和re库的运用:
1、requests库
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3。
安装requests库:
1
|
pip install requests
|
或者
1
2
3
|
git clone git://github.com/kennethreitz/requests.git
cd requests
python setup.py install
|
上述两种方法基本是python库函数的通用两种安装方法,如果是python新手,建议先学会上述两种安装方法,很重要!
这里就只介绍我们用到函数,具体应用请看这里:传送门
1
2
3
4
5
6
7
8
|
import requests
url=“http://foreversong.cn”
#页面地址
print requests.get(url).status_code
#status_code即为页面的状态码
#正常相应即为200,页面不存在即为404(好熟悉的数字是吧~)
print requests.get(url).content
#输出页面的源代码
|
这里我们首先需要在头部调用requests库,好多次代码调试失败最后都是忘了头部的调用!
这里我们用到的是GET方法来获取的页面,相对的还有POST形式。
这里可能有人对content不理解,我们看到的页面是经过各类js的优化,最终看到的页面,在页面源代码中记录了我们这个页面的各项参数,标题、内容、调用了什么js函数、post表单等等,因此我们需要获取这个页面源代码。
对requests的讲解就到这里,具体的用法还有很多,但是最常用的就是GET和POST方式,使用方法其实很类似~
2、re库
这个库是python自带的,不需要我们安装
我们只需要在头部调用这个函数即可,re的用法非常多,基本能想到的匹配原则,都有相应的实现方式,这里具体的使用方法请看这里:传送门
这里我只讲解最简单最基础的匹配原则,复杂的可能我自己也讲不清。。。
1
2
3
|
import re
content=“balalalala<title>foreversong</title>balalalala”
print re.findall(“<title>.*</title>”,content)
|
看上面的代码,首先我们在头部调用了re库函数
接着我们定义了一个content的字符串,这里的“balalalala”模拟的是一个页面的任意内容,而我们的标题就存在在页面的某一个地方,这时候我们需要运用正则匹配来讲我们的标题挖出来,从而实现标题的获取
re.findall这个函数是获取页面所有的匹配到的字符串,常用的函数还有match、search等等,在正则匹配中最重要的是我们的匹配规则,这里就是”<title>.*</title>”,
这里的<title></title>不多说,HTML标签,页面的标题一定都是存在在这个标签里,因此我们如果想要爬取标题,一定会到这个HTML标签里来找数据,最主要的是这个.*什么意思。
这才是正则匹配的难点,当然还有很多符号,如^[]+等等,这些符号都代表了不同的含义,因此也就有了不同的用法,所以每次遇到正则表达式,都会来百度这些符号的具体含义。。。
这里的.代表的是匹配任意字符,*代表匹配字符无限次,在这里即为匹配任意字符任意多次,加入只有一个.则标识匹配任意字符但是只有一个字符能够被匹配到,
还是上面的例子
1
2
3
4
5
6
7
8
9
10
|
#-*-coding:utf-8-*-
import re
content=“balalalala<title>foreversong</title>balalalala”
print re.findall(“<title>.*</title>”,content)
#这里返回的是任意字符任意多个,因此在<title></title>中间无论有多少个字符都能被匹配到
print re.findall(“<title>.</title>”,content)
#这里只匹配一个任意字符,结果返回为空
content=“balalalala<title>f</title>balalalala”
print re.findall(“<title>.</title>”,content)
#同样是匹配一个字符,这里结果返回为[‘<title>f</title>’],因为中间只有一个字符,因此能够被匹配到
|
因此由于我们也不知道标题到底有多少个字符,因此我们需要使用.*
这里我们可以看到的返回的是一个列表,findall是搜寻所有能被匹配的,因此可能不止有一个,但是标题只有一个,因此在标题爬取的实际编程中,我们只需要找列表的第一个值即可~
下面附上标题爬取的源代码(python2.7)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#-*-coding:utf-8-*-
import re
import requests
def replacetitle(string):
string=string.replace(“<title>”,”)
string=string.replace(“</title>”,”)
#去除html标签
string=string.replace(‘| ADog-信息安全博客’,”)
#去除标题后的多余信息
return string
#返回我们经过处理的标题
for i in range(200,250):
#这里的i就好像是php中的?id=xxx一样
#利用i的变化来进行页面的遍历
url=“http://foreversong.cn/archives/%d” % i
#WordPress的url固定格式
code=requests.get(url).status_code
#返回页面的状态码,若为200则表示存在,403则标识不存在
if code==200:
#print “%d 页面存在” % i
contentall=requests.get(url).content
#返回页面的源代码,这里包括页面的所有信息
#print contentall
try:
title=re.findall(‘<title>.*</title>’,contentall)
#正则匹配标题,返回一个列表
#findall多用于匹配多个内容,在这里用的不是太好
except:
print “not found”
try:
pagetitle=title[0]
#由于页面只有一个标题,因此固定位列表的第一个值
pagetitle=replacetitle(pagetitle)
#将得到的标题字符串进行处理
if pagetitle[0:3]==‘img’:
print ‘%d is a image page’ % i
#在实际测试过程中,我曾经上传的图片也会被分配一个页面
#这些页面实际用处不大
else:
print ‘%d 页面的标题:’% i,pagetitle
#最后我们得到我们爬取的页面
except:
print “%d 页面出错” % i
#由于WordPress好像对页面的返回状态码总是200
#就算不存在的页面也会个提示“页面不存在”什么的,因此针对这些页面进行报错
|
维吉尼亚作为古典密码,本身的加解密并不是很难,因此也就有了这篇文章~ 下面初步解释下维吉尼亚密码的加密原理,假设现在有明文‘a’,加密密钥为‘b’,然后我们参照上面的维吉尼亚密码表进行加密,在a行的b列即为我们加密过后的密文,在这里我们的密文即为‘b’。同理,…
请登录后发表评论
注册