一、爬虫的概念
1.爬虫的概念
通过编写程序,模拟浏览器上网,在互联网上抓取数据的过程。
2.爬虫在使用场景上的分类
通用爬虫:抓取一整章页面数据。
聚焦爬虫:建立在通用爬虫基础之上,抓举页面中局部内容。
增量式爬虫:检测网站上的数据更新状况。
3.robots协议
君子协议规定哪些可以被爬取,哪些不可以被爬取。
4.http协议
概念:服务器和客户端进行数据交互的一种形式。
常用请求头信息:User-Agent表示请求载体的身份标识;Connection:表示请求完毕之后,是断开链接还是保持链接。
常用响应头信息:Content-Type表示服务器端响应回客户端的数据类型;
5.https协议
安全的超文本传输协议,使用到数据加密。
加密方式
对称密钥加密:客户端指定加密方式,将密文和密钥一起发送给服务器端。
非对称密钥加密:服务器端指定加密方式,并将加密方式发送给客户端,客户端进行加密后,之江密文发送给服务器端。服务器指定加密方式:公钥。服务器解密方式:私钥。
证书密钥加密:https采用的加密方式。非对称密钥加密加上证书认证机构。证书认证机构对密钥进行数字签名。
二、requests模块
1.概念
python原生的一款基于网络请求的模块,用来模拟浏览器发请求。
特点
功能强大
简单便捷
效率高
2.如何使用
使用流程:指定url(网址)->发起请求(http或者https)->获取响应数据->持久化存储
案例一:爬取sogou首页的页面数据
爬取代码如下所示
import requests as rq
#爬取搜狗首页的页面数据
#step1: 指定url
url = "https://www.sogou.com/"
#step2: 发起请求, get方法会返回相应对象
rp = rq.get(url=url)#url表示针对哪一个模块发起请求;
#step3:响应数据
page_text = rp.text
print(page_text)
#step4:持久化存储,存储在本地
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print("爬取数据结束")
案例二:网页采集器
import requests as rq
#爬取搜狗首页的页面数据
#UA检测:门户网站的服务器检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器则正常
#如果是爬虫软件,则拒绝请求。
#UA伪装:让爬虫对应的请求载体伪装成某一款浏览器
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.70'#对应的浏览器的UserAgent
}
#step1: 指定url
url = "https://www.sogou.com/web?"
kw = '美国国家统计局'
param = {
'query': kw
}
#step2: 发起请求, get方法会返回相应对象
rp = rq.get(url=url, params=param, headers=headers)#url表示针对哪一个模块发起请求;
#step3:响应数据
page_text = rp.text
print(page_text)
fileName = kw+'.html'
#step4:持久化存储
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print("爬取数据结束")
三、数据解析
1.数据解析基本介绍
分类:
-正则
-bs4
-xpath
原理:
解析的局部文本内容都会在标签或者标签对应的属性值进行存储
进行指定标签的定位
标签或者标签对应的属性存储的数据值进行提取
2.bs4数据解析
原理:
实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
通过调用BeautifulSoup对象中相关属性或者方法进行标签定位和数据提取
属性和方法
#(1)
soup.tagName #返回的html中第一次出现的tagName标签
#例如
soup.a
#(2)
soup.find()
#1.
soup('div') = soup.div
#2.属性定位
soup.find('div', class_/id_/attr_='song')
#(3)
soup.find_all('tagName')#返回的html中所有的tagName标签
#(4)
soup.select(选择器(class/id/标签...))#返回一个列表
#例如
soup.select(‘.tang’)
#区分层级
#例如
soup.select('.tang>ul>li a')# 空格标识多个层级, “>”标识多个层级
#(5)获取标签中文本内容
soup.a.text/.string/.get_text()
#.get_text()/.text获取标签中所有的文本内容
.String #只可以获取该标签下面的直系文本内容
3.xpath数据解析
实例化etree对象,并且要将为解析的页面源码加载到该对象中
调用etree对象中xpath方法结合着xpath表达式,实现标签的定位和内容的捕获
# /表示根节点 OR 表示一个层级
# //多个层级 OR 从任意位置开始定位
#属性定位
r = tree.xpath('//div[@class='song']')
#索引定位
r = tree.xpath('//div[@class='song']/p[3]') #索引是从1开始的
#取文本
r = tree.xpath('//div[@class='song']//li[3]/a/text()')#/text()去文本
#/text()获取标签中直系文本内容
#//text()非直系的文本内容
#去属性
r = tree.xpath('//div[@class='song']/img/@src')#/@src
四、scrapy框架
框架是集成了很多功能,并且具有很强通用的形式的项目模板
如何学习框架
学习框架封装的功能的用法
什么是scrapy
scrapy爬虫中封装后的框架,封装了高性能数据解析,存储,异步数据下载操作