python强大之处在于各种功能完善的模块。合理的运用可以省略很多细节的纠缠,提高开发效率。

用python实现一个功能较为完整的爬虫,不过区区几十行代码,但想想如果用底层C实现该是何等的复杂,光一个网页数据的获得就需要字节用原始套接字构建数据包,然后解析数据包获得,关于网页数据的解析,更是得喝一壶。

下面具体分析分析用python如何构建一个爬虫。

0X01  简单的爬虫主要功能模块

URL管理器:管理待抓取URL集合和已抓取URL集合,防止重复抓取、防止循环抓取。主要需要实现:添加新URL到待爬取集合中、判断待添加URL是否在容器中、判断是否还有待爬取URL、获得爬取URL、将URL从带爬取移动到已爬取。URL实现方式可以采用内存set()集合、关系数据库、缓存数据库。一般小型爬虫数据保存内存中已经足够了。

网页下载器:通过URL获得HTML网页数据保存成文本文件或者内存字符串。在python中提供了urlllib2模块、requests模块来实现这个功能。具体的代码实现在下面做详细分析。

网页解析器:通过获取的HTML文档,从中获得新的URL以及关心的数据。如何从HTML文档中获得需要的信息呢?  可以分析信息的结构,然后通过python正则表达式模糊匹配获得,但这种方法再面对复杂的HTML时就有点力不从心。可以通过python自带的html.parser来解析,或者通过第三方模块Beautiful Soup、lxml等来结构化解析。什么是结构化解析?  就是把把网页结构当做一棵树形结构,官方叫DOM(Document Object Model)。

然后通过搜索节点的方式来获得关心的节点数据。

运行流程:调度程序询问URL是否有带爬取的URL,如果有就获得一个,然后送到下载器获得HTML内容,然后再将内容送到解析器进行解析,得到新的URL和关心的数据,然后把新增加的URL放入URL管理器。

0X02 urllib2模块的使用

urllib2的使用有很多种方法。

第一种:

直接通过urlopen的方式获得HTML。

  1. url = "http://www.baidu.com"
  2.  
  3. print 'The First method'
  4. response1 = urllib2.urlopen(url)
  5. print response1.getcode()
  6. print len(response1.read())

第二种:

这个方法是自己构建HTTP请求头,伪装成一个浏览器,可以绕过一些反爬机制,自己构造HTTP请求头更加灵活。

  1. url = "http://www.baidu.com"
  2.  
  3. print 'The Second method'
  4. request = urllib2.Request(url)
  5. request.add_header("user-agent", "Mozilla/5.0")
  6. response2 = urllib2.urlopen(request)
  7. print response2.getcode()
  8. print len(response2.read())

第三种:

增加cookie处理,可以获得需要登录的页面信息。

  1. url = "http://www.baidu.com"
  2.  
  3. print 'The Third method'
  4. cj = cookielib.CookieJar()
  5. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  6. urllib2.install_opener(opener)
  7. response3 = urllib2.urlopen(url)
  8. print response3.getcode()
  9. print cj
  10. print len(response3.read())

当然这几种方法的使用都需要导入urllib2,第三种还需要导入cookielib。

0X03 BeautifulSoup的实现

下面简单说说BeautifulSoup的用法。大致也就是三步走:创建BeautifulSoup对象,寻找节点,获得节点内容。

  1. from bs4 import BeautifulSoup
  2. import re
  3.  
  4. html_doc = """
  5. <html><head><title>The Dormouse's story</title></head>
  6. <body>
  7. <p class="title"><b>The Dormouse's story</b></p>
  8.  
  9. <p class="story">Once upon a time there were three little sisters; and their names were
  10. <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
  11. <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
  12. <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
  13. and they lived at the bottom of a well.</p>
  14.  
  15. <p class="story">...</p>
  16. """
  17.  
  18. soup = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8')
  19.  
  20. print 'Get all links'
  21. links = soup.find_all('a')
  22. for link in links:
  23. print link.name,link['href'],link.get_text()
  24.  
  25. print 'Get lacie link'
  26. link_node = soup.find('a',href='http://example.com/lacie')
  27. print link_node.name,link_node['href'],link_node.get_text()
  28.  
  29. print 'match'
  30. link_node = soup.find('a', href=re.compile(r'ill'))
  31. print link_node.name, link_node['href'], link_node.get_text()
  32.  
  33. print 'p'
  34. p_node = soup.find('p', class_="title")
  35. print p_node.name, p_node.get_text()

0X04 爬虫的简单实现

在此不再累赘,具体代码已上传到github  :  github.com/zibility/spider

python简单爬虫的实现的更多相关文章

  1. Python简单爬虫入门三

    我们继续研究BeautifulSoup分类打印输出 Python简单爬虫入门一 Python简单爬虫入门二 前两部主要讲述我们如何用BeautifulSoup怎去抓取网页信息以及获取相应的图片标题等信 ...

  2. Python简单爬虫入门二

    接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们Bea ...

  3. GJM : Python简单爬虫入门(二) [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  4. Python 简单爬虫案例

    Python 简单爬虫案例 import requests url = "https://www.sogou.com/web" # 封装参数 wd = input('enter a ...

  5. Python简单爬虫记录

    为了避免自己忘了Python的爬虫相关知识和流程,下面简单的记录一下爬虫的基本要求和编程问题!! 简单了解了一下,爬虫的方法很多,我简单的使用了已经做好的库requests来获取网页信息和Beauti ...

  6. Python简单爬虫

    爬虫简介 自动抓取互联网信息的程序 从一个词条的URL访问到所有相关词条的URL,并提取出有价值的数据 价值:互联网的数据为我所用 简单爬虫架构 实现爬虫,需要从以下几个方面考虑 爬虫调度端:启动爬虫 ...

  7. python简单爬虫一

    简单的说,爬虫的意思就是根据url访问请求,然后对返回的数据进行提取,获取对自己有用的信息.然后我们可以将这些有用的信息保存到数据库或者保存到文件中.如果我们手工一个一个访问提取非常慢,所以我们需要编 ...

  8. python 简单爬虫(beatifulsoup)

    ---恢复内容开始--- python爬虫学习从0开始 第一次学习了python语法,迫不及待的来开始python的项目.首先接触了爬虫,是一个简单爬虫.个人感觉python非常简洁,相比起java或 ...

  9. python 简单爬虫diy

    简单爬虫直接diy, 复杂的用scrapy import urllib2 import re from bs4 import BeautifulSoap req = urllib2.Request(u ...

  10. Python简单爬虫入门一

    为大家介绍一个简单的爬虫工具BeautifulSoup BeautifulSoup拥有强大的解析网页及查找元素的功能本次测试环境为python3.4(由于python2.7编码格式问题) 此工具在搜索 ...

随机推荐

  1. [loj3276]遗迹

    假设已知$a_{i}$,通过以下方式确定$b_{i}$:从后往前枚举每一个数$i$,先令$b_{i}=a_{i}$,再将$b_{i}$不断减1直至不存在$j>i$且$b_{i}=b_{j}$或$ ...

  2. Chrome 插件特性及实战场景案例分析

    一.前言 提起Chrome扩展插件(Chrome Extension),每个人的浏览器中或多或少都安装了几个插件,像一键翻译.广告屏蔽.录屏等等,通过使用这些插件,可以有效的提高我们的工作效率:但有时 ...

  3. java配置方法

    1.新建一个Config文件夹 2.代码 package com.shao.config; import com.shao.pojo.User; import org.springframework. ...

  4. hutool的时间工具类

    hutool的时间工具类 糊涂的时间工具类有很多使用方法,用到了这几个 日期向后偏移     String now = DateUtil.now();        Date date4= DateU ...

  5. idea增加jvm内存

    -server -XX:PermSize=256M -XX:MaxPermSize=1024m

  6. Feed系统设计分析(类似微博的用户动态分享问题)

    Feed系统 最近在研究一个个人动态分享平台,对动态的推送方式有些疑惑,于是研究到了以下结果. 简介 在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态.一条微博.一条资讯或一条短视频等,所 ...

  7. [FJ2021]D2T3题解

    考试的时候一点思路没有,最近听福州的神仙的一些做法. 想自己推一下. 题目大概是这样的 \(a_i = \frac{i\ *\ a_{i - 1} \ + \ i\ * \ (i\ -\ 1)\ * ...

  8. 洛谷 P5540 - [BalkanOI2011] timeismoney | 最小乘积生成树(最小生成树)

    洛谷题面传送门 大概是一个比较 trivial 的小 trick?学过了就不要忘了哦( 莫名奇妙地想到了 yyq 的"hot tea 不常有,做过了就不能再错过了" 首先看到这种二 ...

  9. 微前端框架 single-spa 技术分析

    在理解微前端技术原理中我们介绍了微前端的概念和核心技术原理.本篇我们结合目前业内主流的微前端实现 single-spa 来说明在生产实践中是如何实现微前端的. single-spa 的文档略显凌乱,概 ...

  10. linux中conda升级R到4.0?

    目录 前言 问题 曲线救国 前言 虽然我的win版本R已经用4了,但之前在Linux环境一直没用R4.0,因为Linux涉及的东西太多,担心不稳定,牵一发而动全身. 但现在有好些R包必须要用更新到R4 ...