详解Python网络爬虫功能的基本写法


Posted in Python onJanuary 28, 2016

网络爬虫,即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。

1. 网络爬虫的定义

网络蜘蛛是通过网页的链接地址来寻找网页的。从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。这样看来,网络爬虫就是一个爬行程序,一个抓取网页的程序。网络爬虫的基本操作是抓取网页。

2. 浏览网页的过程

抓取网页的过程其实和读者平时使用IE浏览器浏览网页的道理是一样的。比如说你在浏览器的地址栏中输入    www.baidu.com  这个地址。

打开网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了 一次请求,把服务器端的文件“抓”到本地,再进行解释、展现。

HTML是一种标记语言,用标签标记内容并加以解析和区分。浏览器的功能是将获取到的HTML代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。

3. 基于python实现的网络爬虫功能

1). python获取html页面

其实,最基本的抓站,两句话就可以了:

import urllib2
content = urllib2.urlopen('http://XXXX').read()

这样可以得到整个 html 文档,关键的问题是我们可能需要从这个文档中获取我们需要的有用信息,而不是整个文档。这就需要解析充满了各种标签的 html。

2). python爬虫抓取页面后解析html方法

python爬虫html解析库SGMLParser

Python 默认自带 HTMLParser 以及 SGMLParser 等等解析器,前者实在是太难用了,我就用 SGMLParser 写了一个示例程序:

import urllib2
from sgmllib import SGMLParser
 
class ListName(SGMLParser):
def __init__(self):
SGMLParser.__init__(self)
self.is_h4 = ""
self.name = []
def start_h4(self, attrs):
self.is_h4 = 1
def end_h4(self):
self.is_h4 = ""
def handle_data(self, text):
if self.is_h4 == 1:
self.name.append(text)
 
content = urllib2.urlopen('http://169it.com/xxx.htm').read()
listname = ListName()
listname.feed(content)
for item in listname.name:
print item.decode('gbk').encode('utf8')

  很简单,这里定义了一个叫做 ListName 的类,继承 SGMLParser 里面的方法。使用一个变量 is_h4 做标记判定 html 文件中的 h4 标签,如果遇到 h4 标签,则将标签内的内容加入到 List 变量 name 中。解释一下 start_h4() 和 end_h4() 函数,他们原型是 SGMLParser 中的

start_tagname(self, attrs)
end_tagname(self)

tagname 就是标签名称,比如当遇到 <pre>,就会调用 start_pre,遇到 </pre>,就会调用 end_pre。attrs 为标签的参数,以 [(attribute, value), (attribute, value), ...] 的形式传回。

python爬虫html解析库pyQuery

pyQuery 是 jQuery 在 python 中的实现,能够以 jQuery 的语法来操作解析 HTML 文档,十分方便。使用前需要安装,easy_install pyquery 即可,或者 Ubuntu 下

sudo apt-get install python-pyquery

以下例子:

from pyquery import PyQuery as pyq
doc=pyq(url=r'http://169it.com/xxx.html')
cts=doc('.market-cat')
 
for i in cts:
print '====',pyq(i).find('h4').text() ,'===='
for j in pyq(i).find('.sub'):
print pyq(j).text() ,
print '\n'

python爬虫html解析库BeautifulSoup

有个头痛的问题是,大部分的网页都没有完全遵照标准来写,各种莫名其妙的错误令人想要找出那个写网页的人痛打一顿。为了解决这个问题,我们可以选择著名的 BeautifulSoup 来解析html 文档,它具有很好的容错能力。

以上就是本文的全部内容,对Python网络爬虫功能的实现进行了详细的分析介绍,希望对大家的学习有所帮助。

Python 相关文章推荐
使用python绘制人人网好友关系图示例
Apr 01 Python
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 Python
python中set()函数简介及实例解析
Jan 09 Python
python实现堆和索引堆的代码示例
Mar 19 Python
Python堆排序原理与实现方法详解
May 11 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
python实现logistic分类算法代码
Feb 28 Python
使用tensorflow进行音乐类型的分类
Aug 14 Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 Python
Python3实现Web网页图片下载
Jan 28 #Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 #Python
Python每天必学之bytes字节
Jan 28 #Python
Python装饰器入门学习教程(九步学习)
Jan 28 #Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 #Python
使用Python写个小监控
Jan 27 #Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 #Python
You might like
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
vue3弹出层V3Popup实例详解
2021/01/04 Vue.js
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python对配置文件.ini进行增删改查操作的方法示例
2017/07/28 Python
Python实现抓取网页生成Excel文件的方法示例
2017/08/05 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python脚本如何在bilibili中查找弹幕发送者
2020/06/04 Python
python中如何打包用户自定义模块
2020/09/23 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
JD Sports比利时官网:英国领先的运动鞋和运动服饰零售商
2018/10/10 全球购物
文科生自我鉴定
2014/02/15 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
公司庆典欢迎词
2015/01/26 职场文书
协议书格式模板
2016/03/24 职场文书