爬虫初探系列一共4篇,耐心看完,我相信你就能基本了解爬虫是怎样工作的了,目录如下:

代码已上传至github,在python2.7下测试成功(请原谅我浓浓的乡村非主流代码风格)summerliehu/SimpleSpiderFramework

上一篇谈到,HTML下载器l使用requests模块下载网页,并返回其内容,那么,其返回的内容究竟是什么呢?我们以贾总裁的百度百科词条为例来进行说明:

在终端中进入python环境并使用requests下载网页内容:

import requests

import codecs #codecs可以很方便地对文本文件进行编码和解码

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'

headers = {'User-Agent':user_agent}

#由于我的终端不支持汉语,下面链接中的汉字在复制的过程中已经被转码,不要紧

url = "https://baike.baidu.com/item/%E8%B4%BE%E8%B7%83%E4%BA%AD"

r = requests.get(url, headers = headers)

r.encoding = 'utf-8' #使用utf-8对内容编码

f = codecs.open('/home/***/test.txt', 'w', encoding='utf-8')

f.write(r.text)

f.close()

使用文本编辑器(在这里是Atom)打开上述test.txt文件:

可以看到,r.text中的内容正是该词条的html代码(对于大多数静态网页来说是这样的),在谷歌chrome浏览器中按F12功能键k也可以看到该网页的源代码。HTML解析器的作用就是从这标签与文字齐飞的代码中抽丝剥茧,将有用的信息提取出来。

我们接下来想要提取的信息有:指向其它词条的链接(如下图)该词条的url

该词条的标题(如下图)该词条的简介(如下图)

通过对比不同词条的网页代码,我们可以很容易地看出他们都具有一定的相似性,如指向其它词条的链接都是"/item/..."的形式,使用正则表达式很容易jd地j就可以把这些内容给匹配出来。

然而,python往往能给我们提供更加便利的工具。BeautifulSoup就是一个专门用来从html和xml文档中提取数据的库,现在的版本是bs4。除了BeautifulSoup之外,python还具有一些其它的库,如HTMLParser等,作用都差不多。解析器结合正则表达式,很容易将我们所需要的内容提取出来。

首先安装BeautifulSoup:

$pip install beautifulsoup4

在python环境下导入字符串,创建BeautifulSoup对象:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_str, 'lxml', from_encoding='utf-8')

BeautifulSoup可以将复杂的html文档转化成树形结构,每个节点都是pyhton对象,所有的对象可以归纳为4种:Tag

NavigableString

BeautifulSoup

Comment

Tag和NavigableString是我们最常使用的两种对象,具体选择对象的方法规则颇多,请初学者参考这篇博文Python爬虫利器二之Beautiful Soup的用法。(同时请参考正则表达式学习正则表达式的用法)

根据上图我们可以看到,HtmlParser将要接收一个字符串,输出data和新采集到的一些urls。之前写过的add_new_urls()函数接受一个可迭代对象,所以这里新的urls我们采用集合的形式(也可采用列表的形式)返回,data采用字典的形式存储并返回。

此外,我们观察到,词条内容中含有的链接为"/item/..."的形式,这并不是一个完整的url,要在前面加上“https://baike.baidu.com”进行补全,利用urlparse模块可以很方便地完成这个任务(当然也可以使用拼接字符串的方式)。

下面就是HtmlParser的完整代码:

'''-----------------------------------------------------------------HtmlParser'''

import re #正则表达式模块

import urlparse #用来拼接url

from bs4 import BeautifulSoup

class HtmlParser(object):

def parser(self, page_url, html_cont):

'''解析器主函数parm page_url:一个urlparm html_cont:网页内容,格式为字符串return: urls, 数据;格式为 set, dict'''

if page_url is None or html_cont is None:

print "page_url is None"

return

#建立bs对象,使用html.parser进行解析

soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='urf-8')

print "soup established"

#接下来分别调用两个私有函数返回urls和data

new_urls = self._get_new_urls(page_url, soup)

print "new_urls get"

new_data = self._get_new_data(page_url, soup)

print "new_data get"

return new_urls, new_data

def _get_new_urls(self, page_url, soup):

'''从页面中抽取指向其他词条的链接parm page_url: 当前页面urlparm soup: beautifulsoup对象return: 新url的set'''

new_urls = set()

#根据正则表达式规则对页面内的链接进行筛选,留下想要的链接

links = soup.find_all('a', href=re.compile(r'/item/.+'))

for link in links:

#每个link都是Tag对象,Tag对象的操作方法与字典相同

new_url = link['href']

#借助urljoin,可以很方便地拼接url

new_full_url = urlparse.urljoin(page_url, new_url)

new_urls.add(new_full_url)

return new_urls

def _get_new_data(self, page_url, soup):

'''提取想要的数据parm page_url: 当前页面urlparm soup: beautifulsoup对象return: dict'''

#声明字典

data = {}

data['url'] = page_url

data['title'] = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').find('h1').get_text()

data['summary'] = soup.find('div', class_='lemma-summary').get_text()

return data

本文的写作过程中参考了以下资料:

《Python爬虫开发与项目实战》,范传辉 编著

《Python网络数据采集》[美] 米切尔(Ryan Mitchell) 著

Python爬虫学习系列教程(来自崔庆才的博客)

python中的网页解析器_python爬虫初探(三):HTML解析器相关推荐

  1. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  2. python爬虫解析数据_Python爬虫入门知识:解析数据篇

    首先,让我们回顾一下入门Python爬虫的四个步骤吧: 而解析数据,其用途就是在爬虫过程中将服务器返回的HTML源代码转换为我们能读懂的格式.那么,接下来就正式进入到解析数据篇的内容啦. Part 1 ...

  3. python爬取网页数据流程_Python爬虫爬取数据的步骤

    爬虫: 网络爬虫是捜索引擎抓取系统(Baidu.Google等)的重要组成部分.主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份. 步骤: 第一步:获取网页链接 1.观察需要爬取的多 ...

  4. python中requests库的用途-数据爬虫(三):python中requests库使用方法详解

    有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下 使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理: 因为12306有一个错误证书,我们那它的网 ...

  5. python批量访问网页保存结果_Python爬虫(批量爬取某网站图片)

    1.需要用到的库有: Requests re os time 如果没有安装的请自己安装一下,pycharm中打开终端输入命令就可以安装 2.IDE : pycharm 3.python 版本: 3.8 ...

  6. python中scrapy加请求头_Python爬虫之scrapy框架随机请求头中间件的设置

    方法一,定义一个存放请求头的列表,并从中随机获取请求头: 获取请求头的网址http://www.useragentstring.com/pages/useragentstring.php?name=A ...

  7. python中显示第三行数据_Python从零开始第三章数据处理与分析①python中的dplyr(1)...

    前言 我经常使用R的dplyr软件包进行探索性数据分析和数据处理. dplyr除了提供一组可用于解决最常见数据操作问题的一致函数外,dplyr还允许用户使用管道函数编写优雅的可链接的数据操作代码. 现 ...

  8. python中异或怎么算_python 异或运算的前提_异或运算公式

    Python基础(10)–数字-Python-第七城市 609x288 - 73KB - JPEG Python基础(10)--数字_资讯_突袭网 609x288 - 33KB - JPEG pyth ...

  9. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

最新文章

  1. linux系统中离线安装python3.7过程记录
  2. MySQL查询的进阶操作--分页查询
  3. 三星笔试能带计算机吗,2021年三星笔试试题+经验谈
  4. docke容器无法访问宿主主机的端口
  5. 线程池什么时候调用shutdown方法_ThreadPoolExecutor.shutdown()?
  6. 《The Corporate Startup》作者访谈
  7. ./和bash的区别
  8. Kafka启动出现Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Pr
  9. python刷题相关资料汇总(二)
  10. visual foxpro 程序员指南_好程序员云计算培训分享云计算中SOA是什么?
  11. js修改mysql数据库数据_Node.js操作mysql数据库增删改查_node.js
  12. librdkafka交叉编译
  13. ipadmini1从9.3.5降级8.4.1最有效的方法
  14. mybatis事务原理与集成spring的事务原理
  15. 简单易懂,过程详述大整数进制转换
  16. 接口测试第三课(HTTP协议简介) -- 转载
  17. dq电压方程耦合项符号问题
  18. Ubuntu自己动手本地模拟搭建git服务器
  19. Linxu命令(3)
  20. SLUB和SLAB的区别

热门文章

  1. Python.Scrapy.12-scrapy-source-code-analysis-part-2
  2. Intellij IDEA 环境配置与使用
  3. linux下chmod使用
  4. 数据结构实验指导书(朱素英)
  5. 首尔日记——5月25日,出发
  6. linux qemu 源码编译
  7. python3 str() repr() 区别
  8. centos 7 安装xfce 4桌面环境
  9. 数据库 sqlite top写法
  10. linux journalctl 命令 查询systemd init 系统日志