|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
14 简单爬虫的编写
本文使用的编辑器是Anaconda下的jupyter notebook,关于其的教程,可以看看这篇:http://codingpy.com/article/getting-started-with-jupyter-notebook-part-1/
一、简单网络爬虫
直接使用自带的urllib库进行编写。
爬取网址:http://edu.csdn.net/
- #导入urllib库
- import urllib.request
- #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
- data = urllib.request.urlopen("http://edu.csdn.net/").read()
- #网页的信息量很大,一般不要全部输出,可以输出部分
- print(data[:1000])
复制代码
二、提取网页的特定信息
爬取这个网页:http://edu.csdn.net/huiyiCourse/detail/394,并提取末尾的邮箱账号(利用正则表达式)。
1.用搜狗浏览器(其他也行)打开这个网页,复制邮箱。然后右键,点击“查看源文件”。按“Ctrl+F”,粘贴刚才复制的邮箱,可以发现:
<div class="contact_r fr">
<h4>有任何问题请联系我们</h4>
<p>邮箱:xieting@csdn.net</p>
<p> 电话:18611740170</p>
<p> 微信:csdncxrs</p>
</div>
只找到一处,因此这就是我们要提取的邮箱。所以:- #导入urllib库
- import urllib.request
- import re
- #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
- data = urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/394").read()
- #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
- pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
- rst = re.compile(pat).findall(data)
- print(rst)
复制代码 但是出现了错误:- ---------------------------------------------------------------------------
- TypeError Traceback (most recent call last)
- <ipython-input-6-c43015b2da29> in <module>()
- 6 #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
- 7 pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
- ----> 8 rst = re.compile(pat).findall(data)
- 9 print(rst)
- TypeError: cannot use a string pattern on a bytes-like object
复制代码 可以发现,这个问题是由于data中的数据格式不一样,因此要解一下码(.decode("utf-8")。- #导入urllib库
- import urllib.request
- import re
- #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
- data = urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/394").read().decode("utf-8")
- #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
- pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
- rst = re.compile(pat).findall(data)
- print(rst)
复制代码 但是没有结果:进一步分析,正则表达式没有错误。是因为默认情况下 . 不能匹配换行符,而网页原码中出现了换行。因此使用模式修正符(re.S)。
- #导入urllib库
- import urllib.request
- import re
- #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
- data = urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/394").read().decode("utf-8")
- #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
- pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
- rst = re.compile(pat,re.S).findall(data)
- print(rst)
复制代码 搞定:
|
评分
-
查看全部评分
|