您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

花了三天时间,终于把网络爬虫和正则表达式做了个总结

时间:2019-11-26 11:01:41  来源:  作者:

以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset、beachmark等等。但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的。最近在国内一家互联网公司实习,我的mentor交给我的第一件事就是去网络上爬取数据,并对爬取的数据进行相关的分析和解析。

回到顶部

1.利用urllib2对指定的URL抓取网页内容

  网络爬虫(Web Spider),顾名思义就是将庞大的互联网看做是一张大网,而我们要做的就是用代码去构造一个类似于爬虫的实体,在这张大网上爬取我们需要的数据。

  所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源。Python中提供了专门抓取网络的组件urllib和urllib2。

  最简单的抓取网络的Python代码,四行就可以搞定:

1 import urllib2 
2 response = urllib2.urlopen('http://www.toutiao.com/') 
3 html = response.read() 
4 print html

私信小编01 领取完整项目代码!

  显示抓取的结果:

  

花了三天时间,终于把网络爬虫和正则表达式做了个总结

 

  我们可以打开百度主页,右击,选择查看源代码(火狐OR谷歌浏览器均可),会发现也是完全一样的内容。也就是说,上面这四行代码将我们访问百度时浏览器收到的代码们全部打印了出来。这就是一个最简单的利用urllib2进行网页爬取的例子。

  当然,有的网站为了防止爬虫,可能会拒绝爬虫的请求,这就需要我们来修改http中的Header项了。还有一些站点有所谓的反盗链设置,其实说穿了很简单,就是检查你发送请求的header里面,referer站点是不是他自己,所以我们只需要像把headers的referer改成该网站即可。有关Header项的修改请转至下边的链接查看,里边详细地介绍了Header的修改、Cookie和表单的处理,等等。

  1)urllib2的使用细节和抓站技巧

  2)用Python爬虫抓站的一些技巧总结

  3)用python写爬虫,去爬csdn的内容,完美解决 403 Forbidden

  4)用Python爬取网页或下载文档的登陆问题

  5)用python2和python3伪装浏览器爬取网页

  6)Python专题教程:抓取网站,模拟登陆,抓取动态网页

回到顶部

2. 使用正则表达式过滤抓取到的网页信息

  如果说网页爬虫爬取的网页信息是数据大海的话,那么正则表达式就是我们进行“大海捞针”的工具。

  首先声明一点,正则表达式不是Python的语法,并不属于Python,其他的语言中也同样支持正则表达式的使用。具体来说,它是一种强大的字符串匹配和处理规则。

回到顶部

2.1 正则表达式介绍

  下图展示了使用正则表达式进行匹配的流程:

  

花了三天时间,终于把网络爬虫和正则表达式做了个总结

 

  下图列出了Python支持的正则表达式元字符和语法:

2.1.1 正则表达式元字符

  

花了三天时间,终于把网络爬虫和正则表达式做了个总结

 

2.1.2 数量词的贪婪模式与非贪婪模式

  正则表达式通常用于在文本中查找匹配的字符串。贪婪模式,总是尝试匹配尽可能多的字符;非贪婪模式则相反,总是尝试匹配尽可能少的字符。Python里数量词默认是贪婪的。

  例如:正则表达式"ab*"如果用于查找"abbbc",将找到"abbb"。而如果使用非贪婪的数量词"ab*?",将找到"a"。

2.1.3 反斜杠的问题

  与大多数编程语言相同,正则表达式里使用""作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\":第一个和第三个用于在编程语言里将第二个和第四个转义成反斜杠,转换成两个反斜杠\后再在正则表达式里转义成一个反斜杠用来匹配反斜杠。这样显然是非常麻烦的。

  Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\"表示。同样,匹配一个数字的"\d"可以写成r"d"

回到顶部

2.2 Python的re模块

  Python通过re模块提供对正则表达式的支持。

  使用re的一般步骤是:

  Step1:先将正则表达式的字符串形式编译为Pattern实例。

  Step2:然后使用Pattern实例处理文本并获得匹配结果(一个Match实例)。

  Step3:最后使用Match实例获得信息,进行其他的操作。

  一个使用Python的re模块进行正则表达式匹配的例子:

  1. # -*- coding: utf-8 -*- #一个简单的re实例,匹配字符串中的hello字符串 #导入re模块 import re # 将正则表达式编译成Pattern对象,注意hello前面的r的意思是“原生字符串” pattern = re.compile(r'hello') # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None match1 = pattern.match('hello world!') match2 = pattern.match('helloo world!') match3 = pattern.match('helllo world!') #如果match1匹配成功 if match1: # 使用Match获得分组信息 print match1.group() else: print 'match1匹配失败!' #如果match2匹配成功 if match2: # 使用Match获得分组信息 print match2.group() else: print 'match2匹配失败!' #如果match3匹配成功 if match3: # 使用Match获得分组信息 print match3.group() else: print 'match3匹配失败!'   

  输出结果:

    hello

    hello

    match3匹配失败!

  当然,也可以省略编译pattern的过程,如下所示:

 

# -*- coding: utf-8 -*- 
#一个简单的re实例,匹配字符串中的hello字符串 
import re 
 
m = re.match(r'hello', 'hello world!') 
print m.group() 

  除了match以外,Python中还提供了其他的匹配模式,可以针对不同的环境和用途来选择不同的匹配模式。  

  1)match:只从字符串的开始与正则表达式匹配,匹配成功返回matchobject,否则返回none;
  2)search:将字符串的所有字串尝试与正则表达式匹配,如果所有的字串都没有匹配成功,返回none,否则返回matchobject;(re.search相当于perl中的默认行为)

  3)findall:匹配所有匹配成功的结果。

  详细的使用细则,可以查看下边的内容:

  1)Python正则表达式的七个使用范例

  2)Python中正则表达式教程

  当然,如果你觉得使用正则表达式太繁琐的话,Python提供了BeautifulSoup插件来取代正则表达式,进行网页的解析。想了解有关BeautifulSoup方面的知识,请移至下边链接:

  Python抓取网页&批量下载文件方法(正则表达式+BeautifulSoup)

回到顶部

2.3 Python正则表达式汇总

  2.3.1 正则表达式模式

  模式字符串使用特殊的语法来表示一个正则表达式:

  字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。

  多数字母和数字前加一个反斜杠时会拥有不同的含义。

  标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。

  反斜杠本身需要使用反斜杠转义。

  由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'/t',等价于'//t')匹配相应的特殊字符。

  下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。

模式描述^匹配字符串的开头$匹配字符串的末尾。.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。[...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'[^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。re*匹配0个或多个的表达式。re+匹配1个或多个的表达式。re?匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式re{ n} re{ n,}精确匹配n个前面表达式。re{ n, m}匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式a| b匹配a或b(re)G匹配括号内的表达式,也表示一个组(?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匹配任意空白字符,等价于 [tnrf].S匹配任意非空字符d匹配任意数字,等价于 [0-9].D匹配任意非数字A匹配字符串开始Z匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。cz匹配字符串结束G匹配最后匹配完成的位置。b匹配一个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。B匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。n, t, 等.匹配一个换行符。匹配一个制表符。等1...9匹配第n个分组的子表达式。10匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。

  2.3.2 正则表达式实例

  字符匹配:

实例描述python匹配 "python".

  字符类:

实例描述[Pp]ython匹配 "Python" 或 "python"rub[ye]匹配 "ruby" 或 "rube"[aeiou]匹配中括号内的任意一个字母[0-9]匹配任何数字。类似于 [0123456789][a-z]匹配任何小写字母[A-Z]匹配任何大写字母[a-zA-Z0-9]匹配任何字母及数字[^aeiou]除了aeiou字母以外的所有字符[^0-9]匹配除了数字外的字符

  特殊字符类:

实例描述.匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.n]' 的模式。d匹配一个数字字符。等价于 [0-9]。D匹配一个非数字字符。等价于 [^0-9]。s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。S匹配任何非空白字符。等价于 [^ fnrtv]。w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。



Tags:网络爬虫   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在了解爬虫基础、请求库和正则匹配库以及一个具体豆瓣电影爬虫实例之后,可能大家还对超长的正则表达式记忆犹新,设想如果想要匹配的条目更加多那表达式长度将会更加恐怖,这显然...【详细内容】
2021-04-12  Tags: 网络爬虫  点击:(262)  评论:(0)  加入收藏
布隆过滤器(BloomFilter)类似于hash set,用来判断元素是否在集合中。但是与hash set区别是:布隆过滤器不需要存储元素值,就能判断元素是否在集合中。说一下布隆过滤器优缺点: 优点...【详细内容】
2020-09-29  Tags: 网络爬虫  点击:(121)  评论:(0)  加入收藏
我们先以一个最简单的实例来了解模拟登录后页面的抓取过程,其原理在于模拟登录后 Cookies 的维护。1. 本节目标私信小编01即可获取大量的Python学习资料本节将讲解以 GitHub...【详细内容】
2020-09-27  Tags: 网络爬虫  点击:(84)  评论:(0)  加入收藏
网络相关 通用 urllib – 网络库(标准库) requests – 网络库 grab – 网络库(基于pycurl) pycurl – 网络库 (与 libcurl 绑定) urllib3 – 具有...【详细内容】
2020-03-14  Tags: 网络爬虫  点击:(94)  评论:(0)  加入收藏
网络爬虫基本思路基本思路:由关键字指定的url把所有相关的html页面全抓下来(html即为字符串),然后解析html文本(通常是正则表达式或者现成工具包如jsoup),提取文本信息,然后把文本信...【详细内容】
2020-03-12  Tags: 网络爬虫  点击:(80)  评论:(0)  加入收藏
写爬虫,是一个非常考验综合实力的活儿。有时候,你轻而易举地就抓取到了想要的数据;有时候,你费尽心思却毫无所获。好多Python爬虫的入门教程都是一行代码就把你骗上了“贼船”,等...【详细内容】
2020-03-12  Tags: 网络爬虫  点击:(110)  评论:(0)  加入收藏
以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset、beachmark等等。但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的。最近在国内一...【详细内容】
2019-11-26  Tags: 网络爬虫  点击:(71)  评论:(0)  加入收藏
很多程序员都很清楚一个专属名词,那就是——爬虫,而大多数网友对于这个词语还比较陌生,属于新鲜的词汇,但是随着互联网的发展,这种网络爬虫其实和我们日常生活息息相关...【详细内容】
2019-10-28  Tags: 网络爬虫  点击:(161)  评论:(0)  加入收藏
爬虫的编程语言有不少,但 Python 绝对是其中的主流之一。下面就为大家介绍下 Python 在编写网络爬虫常常用到的一些库。请求库:实现 HTTP 请求操作 urllib:一系列用于操作URL...【详细内容】
2019-09-26  Tags: 网络爬虫  点击:(118)  评论:(0)  加入收藏
Beautiful Soup库安装pip install beautifulsoup4测试:import requestsr = requests.get("http://python123.io/ws/demo.html")demo = r.textform bs4 import BeautifulSoup...【详细内容】
2019-09-23  Tags: 网络爬虫  点击:(140)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条