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进阶教程之词典、字典、dict
Aug 29 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
Dec 24 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
Python 线程池用法简单示例
Oct 02 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
安装Anaconda3及使用Jupyter的方法
Oct 27 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 Python
Python docx库删除复制paragraph及行高设置图片插入示例
Jul 23 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
php实现图片以base64显示的方法
2016/10/13 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
jQuery.extend 函数的详细用法
2012/06/27 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
JavaScript动态生成二维码图片
2016/04/20 Javascript
仿百度换肤功能的简单实例代码
2016/07/11 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
jQuery实现下拉菜单动态添加数据点击滑出收起其他功能
2018/06/14 jQuery
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
利用python为运维人员写一个监控脚本
2018/03/25 Python
PyQt5组件读取参数的实例
2019/06/25 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
python之openpyxl模块的安装和基本用法(excel管理)
2021/02/03 Python
css3实现画半圆弧线的示例代码
2017/11/06 HTML / CSS
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
工作表现评语
2014/01/19 职场文书
数学国培研修感言
2014/02/13 职场文书
市场专员岗位职责
2014/02/14 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
2015年资料员工作总结
2015/04/25 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA