Python 爬虫学习笔记之正则表达式


Posted in Python onSeptember 21, 2016

正则表达式的使用

想要学习 Python 爬虫 , 首先需要了解一下正则表达式的使用,下面我们就来看看如何使用。

. 的使用这个时候的点就相当于一个占位符,可以匹配任意一个字符,什么意思呢?看个例子就知道

import re 
 content = "helloworld" 
 b = re.findall('w.',content) 
 print b`

注意了,我们首先导入了 re,这个时候大家猜一下输出结果是什么?因为 . 相当于一个占位符,所以理所当然的这个时候的输出结果是 wo 。

* 的使用跟上面的 . 不同,* 可以匹配前一个字符任意次数,看个例子

content = "helloworldhelloworld" 
b = re.findall('w*',content) 
print b

这个时候的输出结果是 ['', '', '', '', '', 'w', '', '', '', '', '', '', '', '', '', 'w', '', '', '', '', ''],可见是一个列表,长度和匹配的字符串一致,遇到要匹配的字符就打印出来。

.* 的使用.* 是一种组合使用,它可以尽可能多的匹配内容,比如下面这个例子

content = "helloworldhelloworldworld" 
b = re.findall('he.*ld',content) 
print b

它会输出 ['helloworldhelloworldworld'],它为什么不只打印一个 helloworld,为什么全部打印下来了?这就是一种贪心算法,也就是说我要找到最长的那个符合条件的内容。

.*? 的使用与 上面相反,这个符号会找到尽可能短的符合条件的内容,然后放到一个列表中去,如下所示

content = 'xxhelloworldxxxxhelloworldxx' 
b = re.findall('xx.*?xx',content) 
print b

输出的结果为 ['xxhelloworldxx', 'xxhelloworldxx'],可见,有个 xx 在前面好烦,怎么才能去掉呢?很简单,加个括号即可,括号加在哪?

content = 'xxhelloworldxxxxhelloworldxx' 
b = re.findall('xx(.*?)xx',content) 
print b

以上我们讨论的都是内容不包含换行符的情况,如果有了换行符结果又会发生什么变化呢?

content = '''xxhelloworld xx''' 
b = re.findall('xx(.*?)xx',content) 
print b

这个时候的输出结果为一个空列表,那怎么办啊?如果我们写网络爬虫的时候,网页源代码肯定不止是一行啊,如果换一行我们就读不出来了,那就好尴尬了,当然有解决办法~

content = '''xxhelloworld xx''' 
b = re.findall('xx(.*?)xx',content,re.S) 
print b

这样就可以了,还有一个非常方便的提取数字的技巧,如下所示

content = '''xx123456 xx''' 
b = re.findall('(d+)',content,re.S) 
print b

在网页源代码中爬取图片链接并下载

这篇文章中只是网络爬虫的第一步,所以讲解的也比较浅,所以现在我们先来利用正则表达式实现一个手动的网络爬虫,什么是手动的呢?就是我们自己把网页源代码复制下来,保存在一个 txt 文件中,然后利用正则表达式去过滤信息,然后去下载。

首先我搜索了一下 Linux 桌面,然后找到了如下一个网页

Python 爬虫学习笔记之正则表达式

右击查看网络源代码,按 ctrl+f 搜索 img src 找到中间一部分进行复制,并且粘贴到一个 txt 文件中去,

Python 爬虫学习笔记之正则表达式

然后就可以利用我们上述的知识去提取我们想要的信息,源代码如下

import re import requests 
 f = open('source.txt', 'r') 
 html = f.read() 
 f.close() 
 pattern = '<img src="(.*?)"' 
 pic_url = re.findall(pattern, html, re.S)
 i = 0 
 for each in pic_url: 
   print 'Downloading :' + each 
   pic = requests.get(each) 
   fp = open('picture\\' + str(i) + '.jpg', 'wb') 
   fp.write(pic.content) 
   fp.close() 
   i = i + 1

首先打开我们保存网络源代码的 txt文件,进行读取,关闭文件流,然后就是利用正则表达式提取图片链接,最后利用requests 中的 get() 方法进行图片下载,注意这个 requests 不是Python 中自带的,我们需要下载指定的文件,然后将其放入到 Python 的Lib 目录下,此处下载,进入网站后,按ctrl+f 搜索关键词 requests 就可以看到如下页面

Python 爬虫学习笔记之正则表达式

,可以看出,我们下载的是 .whl 后缀的文件,手动将其改成 .zip 后缀,然后解压,就可以得到两个目录,将名为 requests 的目录复制粘贴到上面讲的目录即可使用。

好了介绍完了,我们去看下运行结果

C:Python27python.exe E:/PythonCode/20160820/Spider.py
 Downloading:http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112732422680200576.JPG
 Downloading :http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112640070563900918.JPG
 Downloading :http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112547718465744154.JPG
 Downloading :http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112455366330382227.JPG
 Downloading :http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112363014254719641.JPG
 Downloading :http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112270662197888742.JPG
 Downloading :http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112178310031994750.JPG
 Downloading :http://n1.itc.cn/img8/wb/smccloud/fetch/2015/07/04/112085957910403853.JPG
 
 Process finished with exit code 0

这个时候就下载成功了,到我们的 picture 目录下去查看下载的图片

Python 爬虫学习笔记之正则表达式

下载成功了。注意,自己找网页源代码实验的时候,最好不要让链接中带有中文,否则可能会出现乱码,由于我本身学习 Python 也才很短的时间,关于中文乱码问题,应对起来还不是那么得心应手,所以在此也就不再讲解,本文暂时告以段落,有意见或疑问可留言或者私聊我。

Python 相关文章推荐
Python实现数据库编程方法详解
Jun 09 Python
Python返回数组/List长度的实例
Jun 23 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
使用Python横向合并excel文件的实例
Dec 11 Python
使用python进行波形及频谱绘制的方法
Jun 17 Python
Selenium 滚动页面至元素可见的方法
Mar 18 Python
如何基于python实现不邻接植花
May 01 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
Python简单实现安全开关文件的两种方式
Sep 19 #Python
Python打包可执行文件的方法详解
Sep 19 #Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 #Python
利用Python画ROC曲线和AUC值计算
Sep 19 #Python
Python文件与文件夹常见基本操作总结
Sep 19 #Python
Python实现批量更换指定目录下文件扩展名的方法
Sep 19 #Python
Python按行读取文件的实现方法【小文件和大文件读取】
Sep 19 #Python
You might like
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
2019/06/17 PHP
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
js 页面元素的几个用法总结
2013/11/18 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
2014/01/07 Javascript
网页运行时提示对象不支持abigimage属性或方法
2014/08/10 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
详解基于node的前端项目编译时内存溢出问题
2017/08/01 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
wxPython框架类和面板类的使用实例
2014/09/28 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Python中psutil的介绍与用法
2019/05/02 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
用python做游戏的细节详解
2019/06/25 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
python import 上级目录的导入
2020/11/03 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
美国在线旅行社:Crystal Travel
2018/09/11 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
医生实习工作总结的自我评价
2013/09/27 职场文书
团组织关系介绍信
2014/01/12 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
庆祝教师节标语
2014/10/09 职场文书
2014年实习期工作总结
2014/11/27 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
世界遗产的导游词
2015/02/13 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python