网络编程 
首页 > 网络编程 > 浏览文章

python3爬虫之入门基础和正则表达式

(编辑:jimmy 日期: 2024/11/18 浏览:3 次 )

前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享;爬虫说的简单,就是去抓取网路的数据进行分析处理;这章主要入门,了解几个爬虫的小测试,以及对爬虫用到的工具介绍,比如集合,队列,正则表达式;

用python抓取指定页面:

代码如下:

import urllib.request
url= "http://www.baidu.com"
data = urllib.request.urlopen(url).read()#
data = data.decode('UTF-8')
print(data)

urllib.request.urlopen(url) 官方文档 返回一个 http.client.HTTPResponse 对象, 这个对象又用到的read()方法;返回数据;这个函数返回一个 http.client.HTTPResponse 对象, 这个对象又有各种方法, 比如我们用到的read()方法;

查找可变网址:

import urllib
import urllib.request
data={}
data['word']='one peace'
url_values=urllib.parse.urlencode(data)
url="http://www.baidu.com/s"
full_url=url+url_values
a = urllib.request.urlopen(full_url)
data=a.read()
data=data.decode('UTF-8')
print(data)
##打印出网址:
a.geturl()

data是一个字典, 然后通过urllib.parse.urlencode()来将data转换为 ‘word=one+peace'的字符串, 最后和url合并为full_url

python正则表达式介绍:

队列 介绍

在爬虫的程序中用到了广度优先级算法,该算法用到了数据结构,当然你用list也可以实现队列,但是效率不高。现在在此处介绍下:在容器中有队列:collection.deque

#队列简单测试:
from collections import deque
queue=deque(["peace","rong","sisi"])
queue.append("nick")
queue.append("pishi")
print(queue.popleft())
print(queue.popleft())
print(queue)

集合介绍:

在爬虫程序中, 为了不重复爬那些已经爬过的网站, 我们需要把爬过的页面的url放进集合中, 在每一次要爬某一个url之前, 先看看集合里面是否已经存在. 如果已经存在, 我们就跳过这个url; 如果不存在, 我们先把url放入集合中, 然后再去爬这个页面.

Python 还 包 含 了 一 个 数 据 类 型—— set ( 集 合 ) 。 集 合 是 一 个 无 序 不 重 复 元素 的 集 。 基 本 功 能 包 括 关 系 测 试 和 消 除 重 复 元 素 。 集 合 对 象 还 支 持 union( 联合),intersection(交),difference(差)和 sysmmetric difference(对称差集)等数学运算。

大括号或 set() 函数可以用来创建集合。 注意:想要创建空集合,你必须使用set() 而不是 {} 。{}用于创建空字典;

集合的创建演示如下:

 a={"peace","peace","rong","rong","nick"}
  print(a)
  "peace" in  a
  b=set(["peace","peace","rong","rong"])
  print(b)
  #演示联合
  print(a|b)
  #演示交
  print(a&b)
  #演示差
  print(a-b)
  #对称差集
  print(a^b)
#输出: 
{'peace', 'rong', 'nick'}
{'peace', 'rong'}
{'peace', 'rong', 'nick'}
{'peace', 'rong'}
{'nick'}
{'nick'}

正则表达式

在爬虫时收集回来的一般是字符流,我们要从中挑选出url就要求有简单的字符串处理能力,而用正则表达式可以轻松的完成这一任务;

正则表达式的步骤:1,正则表达式的编译 2,正则表达式匹配字符串 3,结果的处理

下图列出了正则表达式的语法:

python3爬虫之入门基础和正则表达式

在pytho中使用正则表达式,需要引入re模块;下面介绍下该模块中的一些方法;

1.compile和match

re模块中compile用于生成pattern的对象,再通过调用pattern实例的match方法处理文本最终获得match实例;通过使用match获得信息;

import re

# 将正则表达式编译成Pattern对象
pattern = re.compile(r'rlovep')
# 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
m = pattern.match('rlovep.com')
if m:
# 使用Match获得分组信息
  print(m.group())
### 输出 ###
# rlovep
re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符'|'表示同时生效,比如re.I | re.M。另外,你也可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('("1" cellpadding="0" width="432" style="border-bottom: #dddddd 1pt solid; border-left: medium none; width: 324pt; background: #fefefe; border-top: #dddddd 1pt solid; border-right: #dddddd 1pt solid"> 参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串。 flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 描述 group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 groups() 返回一个包含所有小组字符串的元组,从 1 到所含的小组号。

演示如下:

#re.match.
import re
print(re.match("rlovep","rlovep.com"))##匹配rlovep
print(re.match("rlovep","rlovep.com").span())##从开头匹配rlovep
print(re.match("com","http://rlovep.com"))##不再起始位置不能匹配成功
##输出:
<_sre.SRE_Match object; span=(0, 6), match='rlovep'>
(0, 6)
None

实例二:使用group

import re
line = "This is my blog"
#匹配含有is的字符串
matchObj = re.match( r'(.*) is (.*"matchObj.group() : ", matchObj.group())#匹配整个
 print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一个括号
 print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二个括号
else:
 print ("No match!!")
#输出:
matchObj.group() : This is my blog
matchObj.group(1) : This
matchObj.group(2) : my

3.re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

函数语法:

re.search(pattern, string, flags=0)

函数参数说明:

参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串。 flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。

匹配对象方法 描述 group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。 groups() 返回一个包含所有小组字符串的元组,从 1 到所含的小组号。

实例一:

import re
print(re.search("rlovep","rlovep.com").span())
print(re.search("com","http://rlovep.com").span())
#输出:
import re
print(re.search("rlovep","rlovep.com").span())
print(re.search("com","http://rlovep.com").span())

实例二:

import re
line = "This is my blog"
#匹配含有is的字符串
matchObj = re.search( r'(.*) is (.*"matchObj.group() : ", matchObj.group())#匹配整个
 print ("matchObj.group(1) : ", matchObj.group(1))#匹配的第一个括号
 print ("matchObj.group(2) : ", matchObj.group(2))#匹配的第二个括号
else:
 print ("No match!!")
#输出:
matchObj.group() : This is my blog
matchObj.group(1) : This
matchObj.group(2) : my

search和match区别:re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

python爬虫小试牛刀

利用python抓取页面中所有的http协议的链接,并递归抓取子页面的链接。使用了集合和队列;此去爬的是我的网站,第一版很多bug;代码如下:

import re
import urllib.request
import urllib
from collections import deque
#使用队列存放url 
queue = deque()
>前面的python3入门系列基本上也对python入了门,从这章起就开始介绍下python的爬虫教程,拿出来给大家分享;爬虫说的简单,就是去抓取网路的数据进行分析处理;这章主要入门,了解几个爬虫的小测试,以及对爬虫用到的工具介绍,比如集合,队列,正则表达式;
<!--more-->
#使用visited防止重复爬同一页面
visited = set()
url = 'http://rlovep.com' # 入口页面, 可以换成别的
 #入队最初的页面
queue.append(url)
cnt = 0
while queue:
 url = queue.popleft() # 队首元素出队
 visited |= {url} # 标记为已访问
 print('已经抓取: ' + str(cnt) + '  正在抓取 <--- ' + url)
 cnt += 1
 #抓取页面
 urlop = urllib.request.urlopen(url)
 #判断是否为html页面
 if 'html' not in urlop.getheader('Content-Type'):
  continue
 # 避免程序异常中止, 用try..catch处理异常
 try:
  #转换为utf-8码
  data = urlop.read().decode('utf-8')
 except:
  continue
 # 正则表达式提取页面中所有队列, 并判断是否已经访问过, 然后加入待爬队列
 linkre = re.compile("href=['\"]([^\"'>]*"].*")
 for x in linkre.findall(data):##返回所有有匹配的列表
  if 'http' in x and x not in visited:##判断是否为http协议链接,并判断是否抓取过
   queue.append(x)
   print('加入队列 ---> ' + x)

结果如下:

 python3爬虫之入门基础和正则表达式

上一篇:数据库中使用正则表达式小结
下一篇:swift中的正则表达式小结