设为首页收藏本站

追梦Linux

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 757|回复: 0

【python爬虫系列】一、网络爬虫原理及正则表达式

[复制链接]

482

主题

485

帖子

16万

积分

CEO

Rank: 9Rank: 9Rank: 9

积分
169037

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2018-3-15 17:22:49 | 显示全部楼层 |阅读模式
一、通用爬虫和聚焦爬虫
根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种.
通用爬虫
通用网络爬虫 是 捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。

通用搜索引擎(Search Engine)工作原理
通用网络爬虫 从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。

聚焦爬虫
聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于: 聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。
二、正则表达式
正则表达式:世界上信息非常多,而我们关注的信息有限。假如我们只想提取关注的数据,此时需要通过一些表达式来提取,正则表达式就是其中一种进行数据筛选的表达式。
原子:原子是正则表达式中最基本的组成单位,每个正则表达式中至少包含一个原子。常见的原子类型有:
a、普通字符作为原子
[Python] 纯文本查看 复制代码
import re
pat = 'yue'
string = 'http://yum.iqinayue.com'
ret1 = re.search(pat,string)
print(ret1)

b、非打印字符作为原子
[Python] 纯文本查看 复制代码
"""
\t 制表符
\n 换行符
"""
pat2 = '\n'
string2 = """sdkhjkhak
sadsad;l
"""
ret2 = re.search(pat2,string2)
print(ret2)

c、通用字符作为原子
[Python] 纯文本查看 复制代码
'''
通用字符:
\w 匹配任意字母数字下划线 (非特殊字符)
\d 匹配任意一个十进制数
\s 匹配任意一个空白字符
\W 匹配任意一个除了字母数字下划线以外的字符
\D 匹配任意一个除了十进制数以外的字符
\S 匹配任意一个除了空白字符以外的字符
'''

pat3 = '\w\dpython\w'
string = 'asdjhj1pythonhsad'
ret3 = re.search(pat3,string)
print(ret3)

d、原子表
[Bash shell] 纯文本查看 复制代码
'''
#原子表,从里面取出任意一个
^ 放在原子表里面表示非谁
'''

pat = 'pyth[jsz]n'
string = 'hasjdhjashdasdjpythsnashkjdh'
ret = re.search(pat,string)
print(ret)


元字符:正则表达式中具有特殊含义的字符,比如重复前面N次的字符
[Python] 纯文本查看 复制代码
'''
元字符 有特殊含义:
. 匹配除了换行符任意字符
^ 匹配字符串开始位置
$ 匹配字符串结束位置
* 匹配0次、1次或多次前面字符
? 匹配0次或1次前面字符,也用于懒惰匹配
+ 匹配1次或多次前面字符
{n} 前面的原子恰好出现n次
{n,} 前面的原子至少出现n次
{n,m} 前面的原子至少出现n次至多出现m次
| 模式选择符,或
() 模式单元 提取某一段内容

'''
pat = '.python....'
string = 'asdasfdpythonadasdaggsa'
ret = re.search(pat,string)
print(ret)

pat = 'python|php'
string = 'asdasphpd333sdjgapythonj'
ret = re.search(pat,string) #将第一个满足条件的匹配出来
print(ret)


模式修正符:
可以在不改变表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。
[Python] 纯文本查看 复制代码
'''
模式修正符:
I 不区分大小写
M 多行匹配
L 本地化识别匹配
U 根据Unicode 字符解析字符
S 让 . 匹配包含换行符
'''
pat1 = 'python'
pat2 = 'python'
string = 'jasdhakjdhajksdhjahPythonasssssss4ssssss'
ret = re.search(pat1,string)
print(ret)
ret = re.search(pat2,string,re.I)
print(ret)


贪婪匹配和懒惰匹配
[Python] 纯文本查看 复制代码
'''
贪婪匹配:尽可能多的匹配 
懒惰匹配:尽可能少的匹配
'''
pat1 = 'p.*y'   #贪婪匹配
pat2 = 'p.*?y'  #懒惰匹配,更精确的定位
string = 'asddddddddddddqwejhjpythonasdjashdjpy'
ret = re.search(pat1,string)
print(ret)

ret = re.search(pat2,string)
print(ret)


正则表达式函数
[Python] 纯文本查看 复制代码
'''
正则表达式函数
re.search 从任意开始搜索
re.match 从头开始搜索
re.compile(pat1).findall(string)  全局搜索
'''
print('-------正则表达式函数--------')
pat1 = 'p.*y'
pat2 = 'p.*?y'
string = 'asddddddddddddqwejhjpythonasdjashdjpy'
ret = re.match(pat1,string)
print(ret)

string = 'pasddddddddddddqwejhjpythonasdjashdjpy'
ret = re.match(pat1,string)
print(ret)

string = 'pasddddddddddddqwejhjpythonasdjashdjpy'
ret = re.match(pat2,string)
print(ret)


pat1 = 'p.*?y'
string = 'pasdddyddddpdddyddqwejhjpythonasdjashdjp45y'
ret = re.search(pat1,string) #只给出一个结果
print(ret)

ret = re.compile(pat1).findall(string)
print(ret)

# 常见正则实例
pat = '[a-zA-Z]+://[^\s]*[.com|.cn]'
string = '<a href="http://www.baidu.com">jdsfjskdjfkshsdk</a>'
ret = re.compile(pat).findall(string)
print(ret)


##################################################################
[Python] 纯文本查看 复制代码
'''
提取[url]https://read.douban.com/provider/all[/url] 所有出版社信息
'''
import urllib.request
import re
pat = '<div class="name">(.*?)</div>'

data = urllib.request.urlopen('https://read.douban.com/provider/all').read().decode()
ret = re.compile(pat).findall(str(data))
print(ret)
fh = open('day3','w',encoding='utf-8')
for i in range(0,len(ret)):
    fh.write(ret[i]+'\n')
fh.close()


小黑屋|手机版|Archiver|追梦Linux    点击这里给我发消息

GMT+8, 2021-6-15 22:11 , Processed in 0.945152 second(s), 31 queries .

Powered by 追梦Linux! X3.3 Licensed

© 2015-2017 追梦Linux!.

快速回复 返回顶部 返回列表