python简单爬取一个页面_python小脚本之页面标题的爬取

突然心血来潮,想要好好研究下python的正则表达式,每次遇到正则总是百度这个.*?什么意思,感觉好烦。。不如来好好研究下具体的符号,但是研究了总要有个用途,于是我决定配合requests库,来进行页面的爬取,然后利用正则表达式,来对页面的标题进行一个匹配,从而得到我们博客的所有页面标题~

下面我普及一下requests库和re库的运用:

1、requests库

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3。

安装requests库:

pip install requests

1

pipinstallrequests

或者

git clone git://github.com/kennethreitz/requests.git

cd requests

python setup.py install

1

2

3

gitclonegit://github.com/kennethreitz/requests.git

cdrequests

pythonsetup.pyinstall

上述两种方法基本是python库函数的通用两种安装方法,如果是python新手,建议先学会上述两种安装方法,很重要!

这里就只介绍我们用到函数,具体应用请看这里:传送门

import requests

url="http://foreversong.cn"

#页面地址

print requests.get(url).status_code

#status_code即为页面的状态码

#正常相应即为200,页面不存在即为404(好熟悉的数字是吧~)

print requests.get(url).content

#输出页面的源代码

1

2

3

4

5

6

7

8

importrequests

url="http://foreversong.cn"

#页面地址

printrequests.get(url).status_code

#status_code即为页面的状态码

#正常相应即为200,页面不存在即为404(好熟悉的数字是吧~)

printrequests.get(url).content

#输出页面的源代码

这里我们首先需要在头部调用requests库,好多次代码调试失败最后都是忘了头部的调用!

这里我们用到的是GET方法来获取的页面,相对的还有POST形式。

这里可能有人对content不理解,我们看到的页面是经过各类js的优化,最终看到的页面,在页面源代码中记录了我们这个页面的各项参数,标题、内容、调用了什么js函数、post表单等等,因此我们需要获取这个页面源代码。

对requests的讲解就到这里,具体的用法还有很多,但是最常用的就是GET和POST方式,使用方法其实很类似~

2、re库

这个库是python自带的,不需要我们安装

我们只需要在头部调用这个函数即可,re的用法非常多,基本能想到的匹配原则,都有相应的实现方式,这里具体的使用方法请看这里:传送门

这里我只讲解最简单最基础的匹配原则,复杂的可能我自己也讲不清。。。

import re

content="balalalala

foreversongbalalalala"

print re.findall("

.*",content)

1

2

3

importre

content="balalalala

foreversongbalalalala"

printre.findall("

.*",content)

看上面的代码,首先我们在头部调用了re库函数

接着我们定义了一个content的字符串,这里的“balalalala”模拟的是一个页面的任意内容,而我们的标题就存在在页面的某一个地方,这时候我们需要运用正则匹配来讲我们的标题挖出来,从而实现标题的获取

re.findall这个函数是获取页面所有的匹配到的字符串,常用的函数还有match、search等等,在正则匹配中最重要的是我们的匹配规则,这里就是"

.*",

这里的

不多说,HTML标签,页面的标题一定都是存在在这个标签里,因此我们如果想要爬取标题,一定会到这个HTML标签里来找数据,最主要的是这个.*什么意思。

这才是正则匹配的难点,当然还有很多符号,如^[]+等等,这些符号都代表了不同的含义,因此也就有了不同的用法,所以每次遇到正则表达式,都会来百度这些符号的具体含义。。。

这里的.代表的是匹配任意字符,*代表匹配字符无限次,在这里即为匹配任意字符任意多次,加入只有一个.则标识匹配任意字符但是只有一个字符能够被匹配到,

还是上面的例子

#-*-coding:utf-8-*-

import re

content="balalalala

foreversongbalalalala"

print re.findall("

.*",content)

#这里返回的是任意字符任意多个,因此在

中间无论有多少个字符都能被匹配到

print re.findall("

.",content)

#这里只匹配一个任意字符,结果返回为空

content="balalalala

fbalalalala"

print re.findall("

.",content)

#同样是匹配一个字符,这里结果返回为['

f'],因为中间只有一个字符,因此能够被匹配到

1

2

3

4

5

6

7

8

9

10

#-*-coding:utf-8-*-

importre

content="balalalala

foreversongbalalalala"

printre.findall("

.*",content)

#这里返回的是任意字符任意多个,因此在

中间无论有多少个字符都能被匹配到

printre.findall("

.",content)

#这里只匹配一个任意字符,结果返回为空

content="balalalala

fbalalalala"

printre.findall("

.",content)

#同样是匹配一个字符,这里结果返回为['

f'],因为中间只有一个字符,因此能够被匹配到

因此由于我们也不知道标题到底有多少个字符,因此我们需要使用.*

这里我们可以看到的返回的是一个列表,findall是搜寻所有能被匹配的,因此可能不止有一个,但是标题只有一个,因此在标题爬取的实际编程中,我们只需要找列表的第一个值即可~

下面附上标题爬取的源代码(python2.7)

#-*-coding:utf-8-*-

import re

import requests

def replacetitle(string):

string=string.replace("

",'')

string=string.replace("

",'')

#去除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('

.*',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

#就算不存在的页面也会个提示“页面不存在”什么的,因此针对这些页面进行报错

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-*-

importre

importrequests

defreplacetitle(string):

string=string.replace("

",'')

string=string.replace("

",'')

#去除html标签

string=string.replace('| ADog-信息安全博客','')

#去除标题后的多余信息

returnstring

#返回我们经过处理的标题

foriinrange(200,250):

#这里的i就好像是php中的?id=xxx一样

#利用i的变化来进行页面的遍历

url="http://foreversong.cn/archives/%d"%i

#WordPress的url固定格式

code=requests.get(url).status_code

#返回页面的状态码,若为200则表示存在,403则标识不存在

ifcode==200:

#print "%d 页面存在" % i

contentall=requests.get(url).content

#返回页面的源代码,这里包括页面的所有信息

#print contentall

try:

title=re.findall('

.*',contentall)

#正则匹配标题,返回一个列表

#findall多用于匹配多个内容,在这里用的不是太好

except:

print"not found"

try:

pagetitle=title[0]

#由于页面只有一个标题,因此固定位列表的第一个值

pagetitle=replacetitle(pagetitle)

#将得到的标题字符串进行处理

ifpagetitle[0:3]=='img':

print'%d is a image page'%i

#在实际测试过程中,我曾经上传的图片也会被分配一个页面

#这些页面实际用处不大

else:

print'%d 页面的标题:'%i,pagetitle

#最后我们得到我们爬取的页面

except:

print"%d 页面出错"%i

#由于WordPress好像对页面的返回状态码总是200

#就算不存在的页面也会个提示“页面不存在”什么的,因此针对这些页面进行报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值