爬虫入门
一、什么是爬虫?
通过编写程序模拟人浏览网页的行为,然后在互联网上抓取数据的过程。爬虫的价值如下:
- 处于大数据时代,有更多有用的数据则更有利
- 批量获取网络上的公开信息,能够提高工作效率
二、爬虫分类
爬虫的种类如下表所示,
爬虫种类 | 简介 |
---|---|
通用爬虫 | 搜索引擎抓取系统重要组成部分,抓取整张网页数据 |
聚焦式爬虫 | 建立在通用爬虫的基础上,抓取页面中特定的局部内容 |
增量式爬虫 | 监测网站中数据更新的情况,只会抓取网站中最新更新的数据 |
深层网络爬虫 | 主要用来爬取非静态网页,例如仅仅只有用户注册后才能显示的内容 |
2.1 通用爬虫
2.1.1 通用爬虫基础知识
通用爬虫的步骤如下,
(1) 指定url
> UA(User-Agent)伪装,UA-为请求载体的身份标识
> 请求参数处理
(2) 向服务器发送请求-常用requests模块
> requests.get()–>如,在浏览器中输入链接,按下回车属于get请求
> requests.post()–>如,提交表单等属于post请求
(3) 获取响应数据
(4) 持久化存储
2.1.2 实战演练一:爬取搜狗网页
import requests
# 指定rul
url = 'https://www.sogou.com/'
# UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
# 发起请求,get方法会返回一个响应对象
response = requests.get(url=url, headers=headers)
# 获取响应数据
page_text = response.text
print(page_text)
# 持久话存储
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('爬取结束!')
2.1.3 实战演练二:搜狗网页采集器
采集搜狗引擎指定搜索关键词的网页,因此需要输入搜索的关键词参数,而这些参数可以通过网络抓包的方式查看。具体如下所示,本文以搜狗引擎搜索关键字“爬虫”为例。
(1) 首先对请求前后的网址进行分析, 搜狗首页网页地址如下:
https://www.sogou.com/
当输入关键词“爬虫”搜索时搜索结果的网页地址为:
https://www.sogou.com/web?query=%E7%88%AC%E8%99%AB&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=6271&sst0=1630408012176&lkt=0%2C0%2C0&sugsuv=1629165356788438&sugtime=1630408012176
通过对比发现,搜索结果网址比搜狗首页网址多了很多内容,搜索结果网址问号(?)后面的内容为请求参数。
(2) 抓包分析请求链接,请求方式,请求参数,响应数据格式。
F5网页刷新快捷键,F12打开网页开发者模式快捷键,具体步骤如下所示。
![](https://static01.imgkr.com/temp/0fb13ce1c3ac45c6859d3e09b7773249.png)
![](https://static01.imgkr.com/temp/db1990227f764b36b1dd7e3ca81a4505.png)
![](https://static01.imgkr.com/temp/735a1e7edb6440419d02f45817dd3ae0.png)
代码如下所示,
import requests
# 指定请求连接,将链接后面的请求参数删掉,改为由用户输入
url ='https://www.sogou.com/web?'
# 输入关键词,如“爬虫”
keyword = input('enter a word: ')
# 封装网页请求参数,不需要用户输入的参数默认即可
param = {
'query': keyword
}
# 请求头
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
# 对指定的url发起的请求,该函数会自动将请求参数与目标链接进行拼接
response = requests.get(url, params=param, headers=headers)
# 获取搜索结果网页内容
page_text = response.text
# 持久化存储
fileName = keyword + '.html'
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print("保存成功!")
2.1.4 实战演练三:爬取豆瓣电影喜剧排行榜电影
在对相应数据进行爬取之前,还需进行网址和抓包分析,分析步骤如2.1.3所示。
# 爬取豆瓣喜剧排行榜电影,网址如下所示:
# https://movie.douban.com/typerank?type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action=
import requests
import json
# 指定链接
url = 'https://movie.douban.com/j/chart/top_list' # 通过抓包发现,服务器响应的喜剧列表为ajax请求
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
# 携带参数
param = {
'type': 24,
'interval_id': '100:90',
'action': '',
'start': '0', # 从服务器中的第几部电影开始读取数据
'limit': '20'
}
# 发起请求
response = requests.get(url, params=param, headers=headers)
# 获取响应数据,通过抓包发现其返回的响应数据为json格式
list_data = response.json() # 返回一个转换后的对象
# 存储
fp = open('douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
print('over!!!')
2.2 聚焦爬虫
2.2.1 聚焦式爬虫基础知识
聚焦式爬虫的步骤如下,
(1) 指定url
> UA(User-Agent)伪装,UA-为请求载体的身份标识
> 请求参数处理
(2) 向服务器发送请求-常用requests模块
> requests.get()–>如,在浏览器中输入链接,按下回车属于get请求
> requests.post()–>如,提交表单等属于post请求
(3) 获取响应数据
(4) 数据解析
(5) 持久化存储
数据解析方式如下所示,
(1) 正则化表达式
(2) bs4
(3) xpath(通用性较强)
(4) pyquery
数据解析原理概述,
(1) 进行标签定位
(2) 提取标签或者标签中对应的属性中存储的数据值
2.2.2 实战演练一:三国演义小说爬取(bs4解析)
# -*- coding: utf-8 -*-
import lxml
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
# 爬取首页信息
url = 'http://www.shicimingju.com/book/sanguoyanyi.html'
# page_text=requests.get(url=url,headers=headers).text
response = requests.get(url=url, headers=headers)
response.encoding = 'utf-8'
page_text = response.text
# 在首页中解析出章节标题和详情页的url
# 1、实例化BeautifulSoup对象,且将网页源码传入到BeautifulSoup对象中
soup = BeautifulSoup(page_text, 'lxml')
# 2、解析章节标题和章节详情内容的url
li_list = soup.select('.book-mulu > ul > li')
# 文本文件相关
fp = open('./三国演义.txt', 'w', encoding='utf-8')
for li in li_list:
title = li.a.string
detail_url = 'http://www.shicimingju.com'+li.a['href']
# 对详情页进行请求
# detail_page_text=requests.get(url=detail_url,headers=headers).text
detail_response = requests.get(url=detail_url, headers=headers)
detail_response.encoding='utf-8'
detail_page_text = detail_response.text
# 解析出详情页中的相关的章节内容
detail_soup = BeautifulSoup(detail_page_text, 'lxml')
div_tag=detail_soup.find('div',class_='chapter_content')
# 解析出的章节内容
content=div_tag.text
fp.write(title+':'+'\n'+content+'\n')
print(title, "获取成功")
print("三国演义爬取完成")
2.2.3 实战演练二:58同城手房信息(xpath解析)
xpath解析步骤如下所示:
(1). 实例化一个etree对象
a). 将本地的html文档中的源码加载到etree对象中:etree.parse(filePath)
b). 可以将直接从互联网中获取的源码数据加载到etree对象中:etree.HTML(‘page_text’)
(2). xpath(‘xpath表达式’)
a) /表示从根目录上定位,且表示一个层级(绝对路径)
b) //表示多个层级,相对路径。可以从任意位置开始定位
c) 属性定位://div[@class=‘song’]
d) 索引定位://div[@class=‘song’]/p[1]
e) (//div[@class=‘tang’]//li[5]/a/text())[0]/text()获取标签的直系文本内容
f) //text() 获取该标签下的所有的文本内容
g) /@attrName img/@src 获取标签属性值
from lxml import etree
import requests
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
}
# 指定url
url = 'https://cd.58.com/ershoufang/?from=esf&from=esf_list&PGTID=0d30000c-0006-63d0-5e97-fd6b8c12e5eb&ClickID=1'
# 对链接发起get请求
response = requests.get(url=url, headers=headers)
response.encoding='utf-8'
# 将网页源码存储到本地中
with open('58.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
# 实例化etree对象,并将网页源码写入到etree对象中
tree = etree.HTML(response.text)
# 标签定位,找到section标签中class属性为list,且其下子标签class属性为property的div标签
div_tag = tree.xpath("//section[@class='list']/div[@class='property']")
# 遍历div标签,获取其中的文本内容
for div in div_tag:
title = div.xpath("./a/div[2]/div[1]//h3/text()")
print(title)