参考:
python爬虫系列(一)_Huterox的博客-优快云博客
python爬虫系列(二)_Huterox的博客-优快云博客
一、准备
pip install urllib3
urllib的模块
request:基本的HTTP请求模块用于模拟发送请求
error:异常处理模块
parse:用于处理URL比如拆分,解析,合并,data参数等
robotparser:用于识别网站的robot.txt文件,判断网站是否可以爬取
urllib.request
urllib.request的方法有:
urlretrieve() 下载文件
urlcleanup() 释放缓存
urlopen() 发送请求get
import urllib.request as u
r=u.urlopen('https://123.sogou.com/')
u.urlcleanup()
print(r.read().decode('utf-8'))
urlopen 方法
info 获取当前内容状态
getcode 输出状态码
geturl 获取当前网址
import urllib.request as u
r= u.urlopen('https://123.sogou.com/')
u.urlcleanup()
# print(r.read().decode('utf-8'))
print(r.info()) #内容状态
print(r.getcode()) #状态码
print(r.geturl()) #当前网址

二、实例
正则表达式
作用:提取出对我们有用的内容。
说到提取也许你们会先想到使用解析库比如BeautifulSoup 但是对于处理一些简单问题的话正则表达式无疑会更加高效!
Python 正则表达式:
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块
也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
re.match函数:
示例:
re.match(pattern, string, flags=0)
pattern 匹配的正则表达式
string 要匹配的字符串。
flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。匹配成功re.match方法返回一个匹配的对象,否则返回None。
re.search函数:
re.search(pattern, string, flags=0)
re.search 扫描整个字符串并返回第一个成功的匹配。
区别
re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
检索和替换:
Python 的 re 模块提供了re.sub用于替换字符串中的匹配项
re.sub(pattern, repl, string, count=0, flags=0)
参数:
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为一个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
import re
phone = "2004-959-559 # 这是一个国外电话号码"
num = re.sub(r'#.*$',"",phone) # 删除字符串中的 Python注释
print( "电话号码是: ", num)
num = re.sub(r'\D', "", phone)# 删除非数字(-)的字符串
print( "电话号码是 : ", num)

re.compile 函数
根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re.compile(pattern[], flags)
// 模式字符串,标志参数
path = re.compile('p[y-z]*thon,re.I)
//path 就是正则表达式对象
pattern : 一个字符串形式的正则表达式
flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库
re.X 为了增加可读性,忽略空格和 # 后面的注释
findall函数
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
语法格式为:
findall(string, pos, endpos)
re.findall(path,string)
string : 待匹配的字符串。
pos : 可选参数,指定字符串的起始位置,默认为 0。
endpos : 可选参数,指定字符串的结束位置,默认为字符串的长
import re
pattern = re.compile(r'\d+') # 查找数字
result1 = pattern.findall('root 123 google 456')
result2 = pattern.findall('run88oob123gofuteroxe456', 0, 10)
print(result1)
print(result2)
输出结果:
['123', '456']
['88', '12']
正则表达式模式
前面我们介绍了re模块那么我们来介绍一下表达式模式,
比如pattern = re.compile(r’\d+’) 中'\d+'就是一种模式:
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的末尾 |
| . | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符 |
| […] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,‘m’或’k’ |
| [^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符 |
| re* | 匹配0个或多个的表达式 |
| re+ | 匹配1个或多个的表达式 |
| re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
| re{n} | 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的两个 o。 |
| re{n,} | 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 “foooood"中的所有 o。“o{1,}” 等价于 “o+”。“o{0,}” 则等价于 “o*”。 |
| re{n,m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
| a| b | 匹配a或b |
| (re) | 匹配括号内的表达式,也表示一个组 |
| (?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域 |
| (?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域 |
| (?: re) | 类似 (…), 但是不表示一个组 |
| (?imx:re) | 在括号中使用i, m, 或 x 可选标志 |
| (?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
| (?#…) | 注释. |
| (?= re) | 前向肯定界定符。如果所含正则表达式,以 … 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
| (?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
| (?> re) | 匹配的独立模式,省去回溯。 |
| \w | 匹配字母数字及下划线 |
| \W | 匹配非字母数字及下划线 |
| \s | 匹配任意空白字符,等价于 [\t\n\r\f] |
| \S | 匹配任意非空字符 |
| \d | 匹配任意数字,等价于 [0-9 |
| \D | 匹配任意非数字 |
| \A | 匹配字符串开始 |
| \Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
| \z | 匹配字符串结束 |
| \G | 匹配最后匹配完成的位置 |
| \b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’ |
| \B | 匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。 \n, \t, 等. 匹配一个换行符。匹配一个制表符。等 |
| \n, \t, | 匹配一个换行符。匹配一个制表符 |
| \10 | 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式 |
| \1…\9 | 匹配第n个分组的内容 |
内容有点多不要紧你只需要把常用的记住即可 \s \S \w \W \d \D 以及re.I re.M re.S 的含义即可
示例
[Pp]ython 匹配 “Python” 或 “python”
rub[ye] 匹配 “ruby” 或 “rube”
[aeiou] 匹配中括号内的任意一个字母
[0-9] 匹配任何数字。类似于 [0123456789]
[a-z] 匹配任何小写字母
[A-Z] 匹配任何大写字母
[a-zA-Z0-9] 匹配任何字母及数字
[^aeiou] 除了aeiou字母以外的所有字符
[^0-9] 匹配除了数字外的字符

898

被折叠的 条评论
为什么被折叠?



