Python网络爬虫实例讲解


Posted in Python onApril 28, 2016

聊一聊Python与网络爬虫。

1、爬虫的定义

爬虫:自动抓取互联网数据的程序。

2、爬虫的主要框架

Python网络爬虫实例讲解

爬虫程序的主要框架如上图所示,爬虫调度端通过URL管理器获取待爬取的URL链接,若URL管理器中存在待爬取的URL链接,爬虫调度器调用网页下载器下载相应网页,然后调用网页解析器解析该网页,并将该网页中新的URL添加到URL管理器中,将有价值的数据输出。

3、爬虫的时序图

Python网络爬虫实例讲解

4、URL管理器

URL管理器管理待抓取的URL集合和已抓取的URL集合,防止重复抓取与循环抓取。URL管理器的主要职能如下图所示:

Python网络爬虫实例讲解

URL管理器在实现方式上,Python中主要采用内存(set)、和关系数据库(MySQL)。对于小型程序,一般在内存中实现,Python内置的set()类型能够自动判断元素是否重复。对于大一点的程序,一般使用数据库来实现。

5、网页下载器

Python中的网页下载器主要使用urllib库,这是python自带的模块。对于2.x版本中的urllib2库,在python3.x中集成到urllib中,在其request等子模块中。urllib中的urlopen函数用于打开url,并获取url数据。urlopen函数的参数可以是url链接,也可以使request对象,对于简单的网页,直接使用url字符串做参数就已足够,但对于复杂的网页,设有防爬虫机制的网页,再使用urlopen函数时,需要添加http header。对于带有登录机制的网页,需要设置cookie。

6、网页解析器

网页解析器从网页下载器下载到的url数据中提取有价值的数据和新的url。对于数据的提取,可以使用正则表达式和BeautifulSoup等方法。正则表达式使用基于字符串的模糊匹配,对于特点比较鲜明的目标数据具有较好的作用,但通用性不高。BeautifulSoup是第三方模块,用于结构化解析url内容。将下载到的网页内容解析为DOM树,下图为使用BeautifulSoup打印抓取到的百度百科中某网页的输出的一部分。

Python网络爬虫实例讲解

关于BeautifulSoup的具体使用,在以后的文章中再写。下面的代码使用python抓取百度百科中英雄联盟词条中的其他与英雄联盟相关的词条,并将这些词条保存在新建的excel中。上代码:

from bs4 import BeautifulSoup 
import re 
import xlrd 
<span style="font-size:18px;">import xlwt 
from urllib.request import urlopen 
 
 
 
excelFile=xlwt.Workbook() 
sheet=excelFile.add_sheet('league of legend') 
## 百度百科:英雄联盟## 
html=urlopen("http://baike.baidu.com/subview/3049782/11262116.htm") 
bsObj=BeautifulSoup(html.read(),"html.parser") 
#print(bsObj.prettify()) 
 
row=0 
 
for node in bsObj.find("div",{"class":"main-content"}).findAll("div",{"class":"para"}): 
  links=node.findAll("a",href=re.compile("^(/view/)[0-9]+\.htm$")) 
  for link in links: 
    if 'href' in link.attrs: 
      print(link.attrs['href'],link.get_text()) 
      sheet.write(row,0,link.attrs['href']) 
      sheet.write(row,1,link.get_text()) 
      row=row+1 
 
 
excelFile.save('E:\Project\Python\lol.xls')</span>

输出的部分截图如下:

Python网络爬虫实例讲解

excel部分的截图如下:

Python网络爬虫实例讲解

以上就是本文的全部内容,希望对大家学习Python网络爬虫有所帮助。

Python 相关文章推荐
基于python编写的微博应用
Oct 17 Python
Python的迭代器和生成器使用实例
Jan 14 Python
使用python3.5仿微软记事本notepad
Jun 15 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
python列表的增删改查实例代码
Jan 30 Python
Python线程下使用锁的技巧分享
Sep 13 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Python 抓取微信公众号账号信息的方法
Jun 14 Python
如何解决django-celery启动后迅速关闭
Oct 16 Python
简单了解Python write writelines区别
Feb 27 Python
python 提高开发效率的5个小技巧
Oct 19 Python
python动态规划算法实例详解
Nov 22 Python
Python脚本实现自动发带图的微博
Apr 27 #Python
Python实现新浪博客备份的方法
Apr 27 #Python
Python2.7简单连接与操作MySQL的方法
Apr 27 #Python
Python判断文本中消息重复次数的方法
Apr 27 #Python
python脚本监控docker容器
Apr 27 #Python
Python多进程同步简单实现代码
Apr 27 #Python
Python对象转JSON字符串的方法
Apr 27 #Python
You might like
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
深入解析php中的foreach问题
2013/06/30 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
PHP扩展类型及安装方式解析
2020/04/27 PHP
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
jQuery下的动画处理总结
2013/10/10 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
jQuery学习笔记之 Ajax操作篇(二) - 数据传递
2014/06/23 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
vue 对象添加或删除成员时无法实时更新的解决方法
2019/05/01 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
vue实现评价星星功能
2020/06/30 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
详解KMP算法以及python如何实现
2020/09/18 Python
DBA的职责都有哪些
2012/05/16 面试题
建筑结构施工求职信
2014/07/11 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
教师工作表现自我评价
2015/03/05 职场文书
会计试用期自我评价
2015/03/10 职场文书
好员工观后感
2015/06/17 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
Ruby使用Mysql2连接操作MySQL
2022/04/19 Ruby