什么是爬虫?
通过编写程序模拟浏览器让其去互联网上获取数据
爬虫的分类:
1. 通用爬虫:爬取的是一整张网页源码数据
2.聚集爬虫:爬取网页中局部的内容,聚集是建立在通用爬虫之上
3.增量式爬虫:用来检测网站数据更新情况,从而爬取到网站找中最新出来的数据。
反爬机制:对应的载体是门户网站,网站中可以指定相关的机制防止爬虫程序对其网站数据爬取
反反爬机制:对应的载体是爬虫程序,爬虫程序可以破解网站采取的反爬机制,从而使得爬虫可以获取数据。
第一个反爬机制:robots.txt协议
-User-Agent: 请求载体的身份标识
特征:文本协议,防君子不防小人
requests模块
环境的安装: pip install requests
作用:用于模拟浏览器发起网络请求
requests的编码流程:
1.指定url
2.发起请求
3.获取响应数据
4.持久化存储
参数动态化:get(params)
UA 伪装:get(headers)
UA检测被应用到了绝大数网站中。
动态加载的数据:
- 是由另一个单独的请求请求到的数据
- 特性:可见非可得
-如何鉴定一个网站中的相关数据是否为动态加载的数据
-使用抓包工具做局部搜索
-可以搜到就不是动态加载的,否则就不是
-如何鉴定出数据为动态加载,如何捕获动态加载的数据?
-在抓包工具中做全局搜索,从定位到的数据包中提取url请求参数,对其进行请求发送即可
数据解析:
-正则表达式
-bs4
-xpath
-数据解析的通用原理
- 概念:将爬取到的网页源码中指定的内容进行提取
- 作用:用来实现聚焦爬虫(将页面中局部数据进行提取)
-原理:
-页面中数据是 存储在哪里的
-存在于某个标签之中
-存在于标签的属性中
- 1.定位标签
- 2. 数据的提取
- 正则表达式实现的数据解析
- 定位标签
- 数据的提取
- bs4解析
-解析原理
- 1. 实例化一个BeautifulSoup的对象,然后把即将被解析的页码数据加载到该对象中
- 2. 调用该对象中相关的方法和属性实现标签定位和数据提取
-BeautifulSoup对象实例化
- BeautifulSoup(fp,'lxml') :将本地存储的html文档中的数据进行解析
-BeautifulSoup(page_text,'lxml') :将互联网请求到的页面源码进行解析
-lxml:一种解析器
-环境安装
pip install bs4
pip install lxml
- 标签定位
- soup.tagName :定位到第一次出现的tagName
- 属性定位find('tagName',attrName='value') find 只能定位符合要求的第一个标签
- find_all()
- select(选择器): id,class,tag,层级选择器 一个大于号表示一个层级 空格表示多个层级
- 取值
- text :获取的是标签下面所有的文本内容 也包含其子标签下面的所有内容
- string :获取标签的直系内容
- 取属性值
- tag['attrName']
a_tag = soup.find('a',id="feng")
print(a_tag['href'])
- xpath解析原理:
- 1. 实例化一个etree类型的对象,吧即将被解析的页面源码数据加载到该对象中
- 2. 调用该对象中的xpath方法结合着不同形式的xpath表达式进行标签定位和数据提取
-etree对象实例化
- etree.parse(filePath)
- etree.HTML(page_text)
- 环境的安装:
pip install lxml
- html 标签是满足树状结构的
- 标签的定位
最左侧的 / :表示xpath表达式必须从跟节点进行标签定位
非最左侧斜杠表示一个层级
最左侧是// : 表示从任意位置进行标签定位
非最左侧// : 表示横跨多个层级
tree = etree.parse('./test.html')
print(tree.xpath('/html/head/title'))
- 属性定位 //tag[@attrName="value]
print(tree.xpath('//div[@class="song"]'))
- 索引定位 从1开始
tree.xpath('//div[@class="tang"]/ul/li[3]'
- 取文本值:
- /text() 取某个标签下的直系标签的值
- //text() 取某个标签下所有的值
print(tree.xpath('//p[1]/text()'))
print(tree.xpath('//div[@class="tang"]//text()'))
- 取属性
print(tree.xpath('//a[@id="feng"]/@href'))
- xpath 表达式的管道符作用
-- 提升通用性