网络爬虫与正则表达式

http基本原理
http和https:访问资源需要的协议类型,还有其他类型,ftp,sftp,smb等
http:hyper text transfer protocol, 超文本传输协议,网络传输超文本数据到本地浏览器的传送协议,保证高效而准确的传送超文本文档
作用:建立一个信息安全通道来保证数据传输的安全,确认网站的真实性

请求方法分为get和post请求
get请求:
– 请求中参数包含在url里
–请求提交的数据最多只有1024字节
–百度中输入的关键字,wd表示要搜索的关键字
post请求:
– 表单提交时候发起,用户登录
– 数据以表单形式传输,不会体现在url中
– 请求提交的数据没有大小限制
– 数据传输更安全(参数不会体现在url中)

请求体:一般承载内容是post请求中的表单数据,对于get请求,请求体为空
响应:由服务器返回给客户端,可分为三部分,响应状态码,响应头,响应体
响应状态码:表示服务器的响应状态,200代表服务器正常响应,404代表页面未找到,500代表服务器内部发生错误
可以根据状态码来判断服务器的响应状态:
– 常见的错误代码及错误原因

网页的组成:HTML, CSS和javascript
HTML相当于骨架,javascript相当于肌肉,css相当于皮肤
三者结合起来形成完善的网页

模式匹配与正则表达式
正则表达式,简称regex,是文本模式的描述方

ex:\d是一个正则表达式,表示一位数字字符,即任何一位0到9的数字
\d\d\d-\d\d\d-\d\d\d\d,匹配前面isPhoneNumber()函数匹配的同样文本:3个数字,一个短横线,3个数字,一个短横线,4个数字
模式匹配与正则表达式
在这里插入图片描述

创建正则表达式对象
– python中所有正则表达式的函数都在re模块中
– 向re.compile()传入一个字符串值,表示正则表达式,它将返回一个regex模式对象

匹配regex对象
– regex对象的search()方法查找传入的字符串,寻找该正则表达式的所有匹配
– 如果字符串中没有找到该正则表达式模式,search()方法将返回None;如果找到了该模式,search()方法将返回一个match对
– search对象有一个group()方法,它将返回被查找字符串中实际匹配的文本

利用括号分组
–将区号从电话号码中分离,添加括号将在正则表达式中创建‘分组’
–(\d\d\d)-(\d\d\d-\d\d\d\d)
–然后可使用group()匹配对象方法,从一个分组中获取匹配的文本
–第一对括号是第一组,第二对括号是第二组;向group()传入整数1或2,可取得匹配文本的不同部分,向group()方法传入0或不传入参数,将返回整个匹配的文本
#括号进行分组
ex:
import re
phoneNumRegex = re.compile(r’(\d\d\d)-(\d\d\d-\d\d\d\d)’)
mo = phoneNumRegex.search(‘My number is 341-555-4242.’)

用管道匹配多个分组
– 字符| 称为“管道”;希望匹配许多表达式中的一个时,就可使用它;例如,正则表达式r’Batman|Spiderman’
–如果Batman和Spiderman都出现在被查找的字符串中,第一次出现的匹配文本,将作为match对象返回
#管道匹配多个
import re
heroRegex = re.compile (r’Batman|Spiderman’)
mo1 = heroRegex.search(‘Spiderman and Batman .’)
mo1.group()#第一次出现的匹配文本
mo.group(2)#通过group返回匹配结果

用问好实现可选匹配
– 不论这段文本在不在,正则表达式都会认为匹配,字符?表明它前面的分组在这个模式中是可选的
#问号,可选匹配
import re
batRegex = re.compile(r’Bat(wo)?man’)
mo1 = batRegex.search(‘The Adventures of Batwoman’)
mo1.group()

用星号匹配零次或多次
– *(星号) 意味着“匹配零次或多次”,即星号之前的分组,可以在文本中出现任意次,它可以完全不存在,或一次又一次的重复
– +(加号)则意味着“匹配一次或多次”;星号不要求分组出现在匹配的字符串中,但加号不同,加号前面的分组必须“至少出现一次”
#星号,零次或多次
import re
batRegex = re.compile(r’Bat(wo)*man’)
mo1 = batRegex.search(‘The Adventures of Batwowowoman’)
mo1.group()
#加号,至少出现一次
import re
batRegex = re.compile(r’Bat(wo)+man’)
mo1 = batRegex.search(‘The Adventures of Batwoman’)
mo1.group()

用花括号匹配特定次数
–如果想要一个分组重复特定次数,就在正则表达式中该分组的后面,跟上花括号包围的数字;例如,正则表达式(Ha){3}将匹配字符串‘HaHaHa’,但不会匹配‘HaHa’
–可以指定一个范围,即在花括号中写下一个最小值,一个逗号和一个最大值;例如,正则表达式(Ha){3,5}将匹配‘HaHaHa’,‘HaHaHaHa’和‘HaHaHaHaHa’
#匹配特定次数
haRegex = re.compile(r’(ha){2,4}’)#贪婪匹配,在范围内默认匹配尽可能的多
mo1 = haRegex.search(‘hahahahha’)
mo1.group()

贪婪与非贪婪
– 正则表达式默认是贪婪的,尽可能匹配最长的字符串
– 非贪婪:加问号,尽可能匹配最短的字符
#匹配特定次数,?表示非贪婪匹配
haRegex = re.compile(r’(ha){2,4}?’)#非贪婪匹配
mo1 = haRegex.search(‘hahahahha’)
mo1.group()

用点-星匹配所有字符
– .:匹配任意字符,除非换行
:匹配零个或多个表达式
#点星匹配任意字符,?表示非贪婪匹配,所以直接匹配到第一个右括号
haRegex = re.compile(r’<.
?>’)
mo2 = haRegex.search(‘fdfhaha>kkkfk’)
mo2.group()

haRegex = re.compile(r’<.*>’,re.DOTALL) #re.DOTALL表示跨行匹配,可以匹配到多行上
text=’’‘weretfdf’’’
mo2 = haRegex.search(text)
mo2.group()

findall方法
– 匹配表达式所有内容;search和group只能一次匹配,而findall可以匹配所有
#findall
import re
kk = re.compile(r’\d+’)
kk.findall(‘one1two2three34four4444’)#匹配所有数字,加表示一个或者多个

爬虫库的使用
urllib:python内置的http请求库,包括以下模块
– requests: http请求模块,用来模拟发送请求,传入url及额外参数
–error:异常处理模块,如果出现请求错误,可以捕获异常
– parse:提供url处理方法,如拆分,解析,合并等
– robotparse: 识别网站的robots.txt文件,判断哪些网站可以爬

发送请求:两种方法
– urlopen(): 最基本的构造http请求的方法,模拟浏览器的一个请求发起过程,可get请求或post请求
– request:声明一个request对象,该对象可以包括header等信息,然后用urlopen打开

beautiful soup
– python的一个HTML解析库,借助网页的结构和属性来解析网页(比正则表达式简单,有效)
– beautiful soup自动将输入的文档转换为unicode编码,输出文档转换为utf-8编码
节点数:
– HTML中,所有标签定义的内容都是节点,共同构成了HTML节点数
– 整个文档是一个文档节点
– 每个HTML元素是元素节点
– HTML元素内的文本是文本节点
– 每个HTML属性时属性节点
– 注释是注释节点
beautiful soup节点选择器:直接调用节点名称就可以选择节点元素,调用string属性可以得到节点内的文本
– 选择元素
– 获取名称
– 获取属性
– 获取内容
– 嵌套选择
beautiful soup的方法选择器
– find_all
– find

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值