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使用新浪微博api上传图片到微博示例
Jan 10 Python
Python模拟登录验证码(代码简单)
Feb 06 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
Python实现寻找回文数字过程解析
Jun 09 Python
python实现学生成绩测评系统
Jun 22 Python
详解Python中的路径问题
Sep 02 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
Python爬虫之Selenium鼠标事件的实现
Dec 04 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中http与https跨域共享session的解决方法
2014/12/20 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
基于jquery实现状态限定编辑的代码
2012/02/11 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
Anaconda入门使用总结
2018/04/05 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python 进程的几种创建方式详解
2019/08/29 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
RIP版本1跟版本2的区别
2013/12/30 面试题
计算机专业个人求职自荐信
2013/09/21 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang