鱼C论坛

 找回密码
 立即注册
查看: 2689|回复: 1

[技术交流] 14 简单爬虫的编写

[复制链接]
发表于 2017-6-21 10:44:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
14 简单爬虫的编写

本文使用的编辑器是Anaconda下的jupyter notebook,关于其的教程,可以看看这篇:http://codingpy.com/article/getting-started-with-jupyter-notebook-part-1/


一、简单网络爬虫


直接使用自带的urllib库进行编写。

爬取网址:http://edu.csdn.net/

  1. #导入urllib库
  2. import urllib.request
  3. #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
  4. data = urllib.request.urlopen("http://edu.csdn.net/").read()
  5. #网页的信息量很大,一般不要全部输出,可以输出部分
  6. print(data[:1000])
复制代码
未命名图片.png

二、提取网页的特定信息
爬取这个网页: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>

只找到一处,因此这就是我们要提取的邮箱。所以:
  1. #导入urllib库
  2. import urllib.request
  3. import re
  4. #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
  5. data = urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/394").read()
  6. #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
  7. pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
  8. rst = re.compile(pat).findall(data)
  9. print(rst)
复制代码
但是出现了错误:
  1. ---------------------------------------------------------------------------
  2. TypeError                                 Traceback (most recent call last)
  3. <ipython-input-6-c43015b2da29> in <module>()
  4.       6 #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
  5.       7 pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
  6. ----> 8 rst = re.compile(pat).findall(data)
  7.       9 print(rst)

  8. TypeError: cannot use a string pattern on a bytes-like object
复制代码
可以发现,这个问题是由于data中的数据格式不一样,因此要解一下码(.decode("utf-8")。
  1. #导入urllib库
  2. import urllib.request
  3. import re
  4. #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
  5. data = urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/394").read().decode("utf-8")
  6. #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
  7. pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
  8. rst = re.compile(pat).findall(data)
  9. print(rst)
复制代码
但是没有结果:
  1. []
复制代码
进一步分析,正则表达式没有错误。是因为默认情况下 . 不能匹配换行符,而网页原码中出现了换行。因此使用模式修正符(re.S)。

  1. #导入urllib库
  2. import urllib.request
  3. import re
  4. #利用urllib.request下的urlopen()方法打开网页,以read()取出内容
  5. data = urllib.request.urlopen("http://edu.csdn.net/huiyiCourse/detail/394").read().decode("utf-8")
  6. #写正则时,要提取什么内容就用()把它括起来,加?就是精准的匹配
  7. pat = '<div class="contact_r fr">.*?<p>邮箱:(\w*?@.*?)</p>'
  8. rst = re.compile(pat,re.S).findall(data)
  9. print(rst)
复制代码
搞定:
  1. ['xieting@csdn.net']
复制代码


















评分

参与人数 1鱼币 +6 收起 理由
小甲鱼 + 6 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-18 01:22:51 | 显示全部楼层
非常细致,支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 00:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表