Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我
所有文章 外链

Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我

精通Python网络爬虫-第五章-正则表达式与Cookie的使用

阅读数:次 2017-07-30
字数统计: 2.1k字   |   阅读时长≈ 10分

这一章看的的有点慢,原因是最近工作确实也忙,还有一个原因是晚上回来晚也要花时间锻炼,天气热没心情看啊,所以看书的时间很少。

感到很惭愧,任何理由都不是不看书的原因,错在自己变懒了。

接下来应该轻松一点了,晚上还是要看书的。

目录:

5.1 正则表达式含义
5.2 正则基础知识
–1.原子
–2. 元字符
–3. 模式修正
–4. 贪婪模式与懒惰模式
5.3 正则常见函数
5.4 常见实例
–实例1:匹配.com或.cn后缀的URL网址
–实例2:匹配电话号码
–实例3:匹配电子邮件
5.5 Cookie(客户端)
5.6 Cookiejar实战

5.1 正则表达式含义

描述字符串排列的一套规则。

5.2 正则基础知识

1.原子

1)普通字符
数字、大小写字母、下划线等

1
2
3
4
5
6
7
import re
pattern = "yue"
string = "http://yum.iqianyue.com"
result = re.search(pattern=pattern,string=string)
print(result)

# <_sre.SRE_Match object; span=(16, 19), match='yue'>

2)非打印字符

符号 含义
\n 换行符
|制表符
1
2
3
4
5
6
7
8
9
import re
pattern = "\n"
string='''http://yum.iqianyue.com
http://baidu.com
'''
result = re.search(pattern,string)
print(result)

# <_sre.SRE_Match object; span=(23, 24), match='\n'>

3)通用字符

符号 含义
\w 任意一个字幕、数字或下划线
\W 与上反
\d 一个十进制数
\D 反上
\s 一个空白字符
\S 反上
1
2
3
4
5
6
7
import re
pattern = "\w\dpython\w"
string="abcdfphp345pythony_py"
result = re.search(pattern,string)
print(result)

# <_sre.SRE_Match object; span=(9, 18), match='45pythony'>

4)原子表
[xyz],地位平等的原子,匹配一个。

“[^xyz]py”,[^]除括号里的都匹配。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import re
pattern1 = "\w\dpython[xyz]\w"
pattern2 = "\w\dpython[^xyz]\w"
pattern3 = "\w\dpython[xyz]\W"
string="abcdfphp345pythony_py"
result1 = re.search(pattern1,string)
result2= re.search(pattern2,string)
result3 = re.search(pattern3,string)
print(result1)
print(result2)
print(result3)

# <_sre.SRE_Match object; span=(9, 19), match='45pythony_'>
# None
# None

2. 元字符

即正则表达式中具有一些特殊含义的字符。

|分类序号|分类名|符号|含义|匹配个数|
|–|–|–|–|–|–|
|1|任意匹配元字符|.|除换行符以外的任意字符|1|
|2|边界限制元字符|^|字符串开始位置|-|
|2|边界限制元字符||$|字符串结束位置|-|
|3|限定符|*|0、1或多次前面的原子|>=0|
|3|限定符|?|0次或1次前面的原子|0、1|
|3|限定符|+|1或多次前面的原子|>=1|
|3|限定符|{n}|前面的原子恰好出现n次|n|
|3|限定符|{n,}|至少n次|>=n|
|3|限定符|{n,m}|n到m次|>=n,<=m|
|4|模式选择符|||或|-|
|5|模式单选符|()|大原子,整体|-|

3. 模式修正

在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。

符号 含义
I 忽略大小写
M 多行匹配
L 本地化识别匹配
U 根据Unicode字符集解析字符
S 让.匹配包括风换行符,则.可匹配任意一个字符
1
2
3
4
5
6
7
8
9
10
import re
pattern = "python"
string = "abcdfasdfasdf123Python_pyafasdf"
result1 = re.search(pattern,string)
result2 = re.search(pattern,string,re.I)
print(result1)
print(result2)

# None
# <_sre.SRE_Match object; span=(16, 22), match='Python'>

4. 贪婪模式与懒惰模式

贪婪者,尽可能多的匹配;懒惰者,尽可能少的匹配。

1
2
3
4
5
6
7
8
9
10
11
import re
pattern1 = "p.*y" # 贪婪模式
pattern2 = "p.*?y" # 懒惰模式
string = "asdfafaphp324pythony_py"
result1 = re.search(pattern1,string)
result2 = re.search(pattern2,string)
print(result1)
print(result2)

# <_sre.SRE_Match object; span=(7, 23), match='php324pythony_py'>
# <_sre.SRE_Match object; span=(7, 15), match='php324py'>

“.“ - 贪婪
“.
?” - 懒惰

5.3 正则常见函数

  1. re.match()
  2. re.search()
  3. 全局匹配函数re.compile(pattern).findall(string)
  4. re.sub()函数,替换某些字符串,re.sub(pattern,rep,string,max)

5.4 常见实例

实例1:匹配.com或.cn后缀的URL网址

1
2
3
4
5
6
7
import re
pattern = "[a-zA-Z]+://[^\s]*[.com|.cn]"
string = "<a href='http://www.baidu.com'>百度首页</a>"
result1 = re.search(pattern,string)
print(result1)

# <_sre.SRE_Match object; span=(9, 29), match='http://www.baidu.com'>

实例2:匹配电话号码

1
2
3
4
5
6
7
import re
pattern = "\d{4}-\d{7}|\d{3}-\d{8}"
string = "0551-54321234513451451345"
result1 = re.search(pattern,string)
print(result1)

# <_sre.SRE_Match object; span=(0, 12), match='0551-5432123'>

实例3:匹配电子邮件

1
2
3
4
5
6
7
import re
pattern = "\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*"
string = "<a href='http://www.baidu.com'>百度</a><br><a href='mailto:c-e+o@iqi-anyue.co.cn'>电邮</a>"
result = re.search(pattern,string)
print(result)

# <_sre.SRE_Match object; span=(57, 78), match='c-e+o@iqi-anyue.co.cn'>
1
2
3
4
5
6
7
import re
pattern = "\w+([.+-]\w+)*@\w+([.-]\w+)*\.\w+([.-]\w+)*"
string = "<a href='http://www.baidu.com'>百度</a><br><a href='w.linkings@gail.com'>电邮</a>"
result = re.search(pattern,string)
print(result)

# <_sre.SRE_Match object; span=(50, 69), match='w.linkings@gail.com'>

匹配邮件的关键是先确定「@」符号,然后观察两侧的字符。

5.5 Cookie(客户端)

保存会话信息的另外一种方式,Session存储在服务端。

HTTP协议是无状态协议,无法维持会话之间的状态。

服务器端给客户端发SessionID等信息,这些会保存在客户端的Cookie中。

Cookie可以第一次登陆成功后,保持登陆状态进行内容的爬取。

5.6 Cookiejar实战

Python3-Cookiejar;Python-Cookielib库。

登陆界面地址:http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes

第一步:使用F12调试界面或Fiddler等工具获取真实的(post方法)登录地址:http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LU7oB

第二步:查看源代码,构造表单数据;找到username和password两个字段。

1
2
3
4
{
"username":"linkingge",
"password":"linking1234"
}

第三步,写代码爬取网页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 带post数据来爬取
import urllib.request
import urllib.parse
url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LU7oB"
postData = urllib.parse.urlencode({
"username":"linkingge",
"password":"linking1234"
}).encode('utf-8')
req = urllib.request.Request(url, postData)
req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')
data = urllib.request.urlopen(req).read()
fhandler = open("/Users/linking/Dev/python/py-books-study/deep-in-python-web-crawler/chinaunix.html","wb")
fhandler.write(data)
fhandler.close()
url2 = "http://bbs.chinaunix.net/"
req2 = urllib.request.Request(url2, postData)
req2.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')
data2 = urllib.request.urlopen(url2).read()
fhandle = open("/Users/linking/Dev/python/py-books-study/deep-in-python-web-crawler/chinaunix2.html","wb")
fhandle.write(data2)
fhandle.close()
print("done")

打开chinaunix.html发现已经登录,但打开chinaunix2.html时未登录。因为没有设置Cookie啊,HTTP无状态协议啊。

导入Cookie步骤:

  • 1.导入处理模块http.cookiejar
  • 2.使用http.cookiejar.CookieJar()创建CookieJar对象
  • 3.使用HTTPCookieProcessor创建cookie处理器,以其为参数构建opener对象
  • 4.创建全局默认的opener对象
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
# 带post数据来爬取
import urllib.request
import urllib.parse
import http.cookiejar # 导入处理模块
url = "http://bbs.chinaunix.net/member.php?mod=logging&action=login&loginsubmit=yes&loginhash=LU7oB"
postData = urllib.parse.urlencode({
"username":"linkingge",
"password":"linking1234"
}).encode('utf-8')
req = urllib.request.Request(url, postData)
req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')
# 创建CookieJar对象
cjar = http.cookiejar.CookieJar()
# 构建opener对象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
# 将opener安装为全局
urllib.request.install_opener(opener)
file = opener.open(req)
data = file.read()
fhandler = open("/Users/linking/Dev/python/py-books-study/deep-in-python-web-crawler/chinaunix3.html","wb")
fhandler.write(data)
fhandler.close()
url2 = "http://bbs.chinaunix.net/"
# req2.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')
data2 = urllib.request.urlopen(url2).read()
fhandle = open("/Users/linking/Dev/python/py-books-study/deep-in-python-web-crawler/chinaunix4.html","wb")
fhandle.write(data2)
fhandle.close()
print("done")

打开chinaunix4.html 发现已经登录了,成功。说明登录状态已通过Cookie保存了。

这章看的时间有点长了,下面第六章-手写爬虫,会有更多的实战,开干了伙计。

  • 本文作者: Linking
  • 本文链接: https://linking.fun/2017/07/30/精通Python网络爬虫-第五章-正则表达式与Cookie的使用/
  • 版权声明: 版权所有,转载请注明出处!
  • Python
  • crawler
  • Python

扫一扫,分享到微信

微信好友分析
推荐几个项目-WritePPTwithMarkDown
  1. 1. 目录:
    1. 1.1. 5.1 正则表达式含义
    2. 1.2. 5.2 正则基础知识
      1. 1.2.1. 1.原子
      2. 1.2.2. 2. 元字符
      3. 1.2.3. 3. 模式修正
      4. 1.2.4. 4. 贪婪模式与懒惰模式
    3. 1.3. 5.3 正则常见函数
    4. 1.4. 5.4 常见实例
      1. 1.4.1. 实例1:匹配.com或.cn后缀的URL网址
      2. 1.4.2. 实例2:匹配电话号码
      3. 1.4.3. 实例3:匹配电子邮件
    5. 1.5. 5.5 Cookie(客户端)
    6. 1.6. 5.6 Cookiejar实战
© 2015-2026 Linking
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量次 | 本站访客数人
  • 所有文章
  • 外链

tag:

  • weather
  • 需求
  • essay
  • basketball
  • olympic
  • nginx
  • APPScan
  • SQl盲注
  • xss
  • Ajax
  • ajax
  • ai
  • agent
  • openclaw
  • ccf
  • Nginx
  • HTML5
  • html5
  • hmtl5
  • sse
  • JavaScriptCore
  • Oracle
  • operation
  • Linux
  • deploy
  • Mac Office
  • markdown
  • ListView
  • GridView
  • MySQL
  • 慢查询
  • mongodb
  • 转置
  • thought
  • network
  • ubuntu
  • NetworkManager
  • RFKill
  • Netplan
  • avatar
  • cocoa
  • blog
  • Gitalk
  • container
  • macvlan
  • docker
  • oracle
  • cookie
  • patch
  • gitea
  • git
  • iOS
  • https
  • 多线程
  • bundle
  • 兼容性
  • HTTP
  • 绘图
  • cs
  • java
  • 效率
  • 快捷键
  • route
  • nodejs
  • pip
  • arcgis
  • arcgis 建模
  • 标识
  • redis
  • read
  • bookList
  • running
  • showdoc
  • disk
  • unit-test
  • D.Wade
  • thoughts
  • duoduo
  • Python
  • python
  • tomcat
  • 读书节
  • session
  • jdk
  • war
  • 加班
  • Android onclick事件监听
  • 正则
  • 手机品牌匹配
  • ntp
  • OpenLayers
  • Geoserver
  • wechat
  • 微信公众号
  • 爬虫
  • WeChat
  • 张靓颖
  • 动漫
  • vpn
  • PPT
  • MarkDown
  • plan
  • 朱赟
  • 极客时间专栏
  • 极客邦
  • 模块化
  • MVC
  • excel
  • NBA
  • kobe
  • team
  • crawler
  • 进度条
  • ssl
  • book
  • anti-stealing-link
  • Agentic Engineering
  • Vibe Coding
  • Software 3.0
  • Andrej Karpathy
  • LLM
  • Programming

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • GitHub Trending
  • OpenAI ChatGPT
  • Gitee码云
  • 简书
  • CSDN