本文分享的大体框架包含以下三部分
(1)首先介绍html网页,用来解析html网页的工具xpath
(2)介绍python中能够进行网络爬虫的库(requests,lxml,scrapy等)
(3)从四个案例出发有易到难依次介绍scrapy集成爬虫框架
下面开始对三部分内容逐一开始介绍。
一、html和xpath说明
1. html
超文本标记语言,是用来描述网页的一种语言。主要用于控制数据的显示和外观。HTML文档一定意义上可以被称为网页。但反过来说网页不仅仅是HTML,网页本质有三部分构成:负责内容结构的HTML,负责表现的CSS,以及负责行为的javascript。本文主要分享的是最核心的内容结构部分。
(1)html结构
完整的HTML文件至少包括标签、
标签、标签和标签,并且这些标签都是成对出现的,开头标签为<>,结束标签为>,在这两个标签之间添加内容。通过这些标签中的相关属性可以设置页面的背景色、背景图像等。例如,我们打开豆瓣首页,摁下键盘上的F12键,打开浏览器自带“开发者工具”,可以看到一个完整的html文档结构,如下图
HTML文档结构.jpg
从上图可以看出,一个完整的html文档主要包含三部分:DTD文档头,head头部信息和body正文信息。其中DTD文档头用来告诉浏览器执行标准是什么(比如html4或是html5),head头部信息用来说明浏览器的编码方式和文档头名称,body顾名思义就是浏览器的正文部分。
(2)html标签
作为开始和结束的标记,由尖括号包围的关键词,比如 ,标签对中的第一个标签是开始标签,第二个标签是结束标签。html中常见标签如下:
html常用标签.png
html常用标签2.png
其中, “< ul >< li >”是一种嵌套顺序,无序列表,成对出现;li的父元素必须是ul或者ol,不同之处在于ol是一种有序列列表,而ul是无序列表;
(3)html属性
属性是用来修饰标签的,放在开始标签里里面,html中常见四大属性:
属性
说明
class
规定元素的类名,大多数时候用于指定样式表中的类
id
唯一标识一个元素的属性,在html里面必须是唯一的
href
指定超链接目标的url
src
指定图像的url
2. xpath
(1)xpath定义
是一种路径查询语言,简单的说就是利用一个路径表达式从html文档中找到我们需要的数据位置,进而将其写入到本地或者数据库中。(可以将xpath类比为sql结构化查询语言)
(2)xpath常见使用方法
符号
功能
//
表示在整个文本中查找,是一种相对路径
/
表示则表示从根节点开始查找,是一种绝对路径
text()
找出文本值
@
找出标签对应的属性值,比如@href就是找出对应的href链接
.
表示当前节点
..
表示当前节点的父节点
当然xpath除了上述常见用法外,还存两种比较特殊的用法:以相同的字符开头;标签套标签。
用法1:以相同的字符开头:starts-with(@属性部分,属性字符相同部分
用法2:标签套标签:string(.)
#以相同的字符开头
#比如我们想同时提取到下列html中三条文本内容的话,就需要使用starts-with方法
html1 = """
#爬取代码
from lxml import etree
selector = etree.HTML(html1)
content = selector.xpath('//div[starts-with(@id,"test")]/text()')
for each in content:
print each
还有一种是标签套标签形式,参考如下例子
html2 = """
我左青龙,
右白虎
- 上朱雀,
- 下玄武,
龙头在胸口
"""
#如果我们想爬取的内容是html文档中的所有文本的话,需要使用string方法进行提取
selector2 = etree.HTML(html2)
content2 = selector2.xpath('//div[@id="test3"]')[0] #列表,只有一个元素
info = content2.xpath('string(.)')
content3 = info.replace('\n','').replace(' ','')
print content3
(3)xpath的谓语结构
该小节参考资料:阮一峰的网络日志
所谓"谓语条件",就是对路径表达式的附加条件。所有的条件,都写在方括号"[]"中,表示对节点进行进一步的筛选。例如:
Harry Potter29.99
Learning XML39.95
下面从几个简单的例子让大家体会一下
/bookstore/book[1] :表示选择bookstore的第一个book子元素。
/bookstore/book[last()] :表示选择bookstore的最后一个book子元素。
/bookstore/book[last()-