网站建设的安全威胁,衡水提供网站设计公司哪家专业,烟台城乡住房建设厅网站,手机wap网站建设多少钱文章目录 前言一、 爬虫的初识1.1 什么是爬虫1.2 爬虫的核心1.3 爬虫的用途1.4 爬虫分类1.5 爬虫带来的风险1.6. 反爬手段1.7 爬虫网络请求1.8 爬虫基本流程 二、urllib库初识2.1 http和https协议2.2 编码解码的使用2.3 urllib的基本使用2.4 一个类型六个方法2.5 下载网页数据2… 文章目录 前言一、 爬虫的初识1.1 什么是爬虫1.2 爬虫的核心1.3 爬虫的用途1.4 爬虫分类1.5 爬虫带来的风险1.6. 反爬手段1.7 爬虫网络请求1.8 爬虫基本流程 二、urllib库初识2.1 http和https协议2.2 编码解码的使用2.3 urllib的基本使用2.4 一个类型六个方法2.5 下载网页数据2.6 带单个参数的页面抓取get请求2.7 定制request使用ua反爬2.8 多字段的字符转码2.9 post请求的使用2.10 异常处理 三、 requests请求的使用3.1 下载requests包3.2 requests的基本使用3.3 响应的保存3.4 响应对象的其他属性3.5 用户代理介绍3.6 构建ua池3.7 带参数的请求3.8 通过面向对象的方式来获取数据3.9 post请求 总结 前言
在当今信息爆炸的时代互联网上的数据呈指数级增长如何高效地获取、处理和分析这些数据成为一项重要的技能。网络爬虫Web Crawler作为一种自动化数据采集工具能够帮助我们快速地从海量网页中提取有价值的信息广泛应用于搜索引擎、数据分析、市场调研、舆情监控等领域。
学习爬虫技术不仅能提升我们的编程能力还能培养数据思维为后续的数据挖掘、机器学习等方向奠定基础。然而爬虫开发并非简单的“请求-解析”过程它涉及HTTP协议、HTML解析、反爬机制应对、数据存储等多个技术点同时还需遵守相关法律法规合理合法地使用爬虫技术。
本教程将从基础概念入手逐步介绍爬虫的核心技术并结合实际案例帮助读者掌握爬虫开发的完整流程。无论你是编程初学者还是希望提升数据采集能力的开发者都可以通过本教程系统地学习爬虫技术并将其应用于实际项目中。 一、 爬虫的初识
1.1 什么是爬虫 如果我们把互联网比作一张大的蜘蛛网那一台计算机上的数据便是蜘蛛网上的一个猎物而爬虫程序就是一只小蜘蛛沿着蜘蛛网抓取自己想要的数据 解释1: 通过一个程序根据url(http://www.taobao.com)进行爬取网页获取有用信息 解释2: 使用程序模拟浏览器去向服务器发送请求获取响应信息
1.2 爬虫的核心 爬取网页:爬取整个网页 包含了网页中所有得内容 解析数据:将网页中你得到的数据 进行解析 难点:爬虫和反爬虫之间的博弈(数据获取与数据保护之间的对抗)
1.3 爬虫的用途 数据分析/人工数据集 社交软件冷启动(新平台没有足够的人流使用爬虫爬去其他类似于(微博)等的用户数据来吸引用户下载) 舆情监控(一些灾情信息等数据的获取) 竞争对手监控(不同购物平台爬取对方相同物品的价格来适当降低价格吸引用户购买#) 1.4 爬虫分类 通用爬虫不常用抓取系统重要组成部分抓取的是一整张页面的数据。 聚焦爬虫建立在通用爬虫的基础上抓取的是页面中特定的局部内容。 增量式爬虫检测网站中数据更新的情况只抓取网站中最新更新的数据。 1.5 爬虫带来的风险 爬虫干扰了被访问网站的正常运营 爬虫抓取了受到法律保护的特定类型的数据或信息
1.6. 反爬手段 1.7 爬虫网络请求
请求过程: 客户端指web浏览器向服务器发送请求
请求分为四部分: 请求网址 --request url 请求方法 --request methods 请求头 – request header 请求体 – request body
可以通过F12查看请求响应
1.8 爬虫基本流程
确认目标:目标url:www.baidu.com发送请求: 发送网络请求获取到特定的服务端给你的响应提取数据:从响应中提取特定的数据jsonpath/xpath/re保存数据:本地(html、json、txt)、数据库 注意: 获取到的响应中有可能会提取到还需要继续发送请求的ur1可以拿着解析到的url继续发送请求 二、urllib库初识
2.1 http和https协议
概念和区别
http协议:超文本传输协议默认端口号是80 超文本:不仅仅限于文本还包括图片、音频、视频 传输协议:指使用共用约定的固定格式来传递转换成字符串的超文本内容
https协议: http ssl(安全套接字层)默认端口号是443 带有安全套接字层的超文本传输协议 ssl对传输的内容进行加密
https比http更安全但是性能更低
2.2 编码解码的使用 图片、视频、音频需要以bytes类型的格式来存储 # 编码--encode() 将str转变为对应的二进制
str 周杰伦
print(str.encode())# 解码--decode() 将二进制转为str
str b\xe5\x91\xa8\xe6\x9d\xb0\xe4\xbc\xa6
print(str.decode())2.3 urllib的基本使用
# 前提获取数据的前提要联网# 需求使用urllib获取百度首页的源码# 1. 导入urllib包不用安装
import urllib.request# 1.定义一个url就是需要访问的地址
url http://www.baidu.com# 2.模拟浏览器向服务器发送请求
# response包含页面源码和响应头信息等等
response urllib.request.urlopen(url)# 3.获取响应中的页面源码只要源码
# read方法返回的是带b的二进制的数据
content response.read()# 4.打印数据
# print(content) 二进制# 5.该编码格式(解码 decode方法)
# decode的默认解码就是utf-8 因而也可以省略参数
print(content.decode(utf-8))2.4 一个类型六个方法
# 基础操作
import urllib.requesturl http://www.baidu.comresponse urllib.request.urlopen(url)# 一个类型和六个方法# 判断类型
# class http.client.HTTPResponse
# print(type(response))# read()方法是单字节的读取数据速度慢
# content response.read()
# 表示只读5个字节
# content response.read(5)
# print(content)# readline()方法 读取一行速度快
# content response.readline()
# print(content)# readlines()方法 读取所有行
# content response.readlines()
# print(content)# 返回状态码 200表示成功 证明逻辑是对的
print(response.getcode())# 返回url地址
print(response.geturl())# 返回状态信息和响应头
print(response.getheaders())2.5 下载网页数据
# 可以下载文件/音频/视频.....
# 适用于批量下载import urllib.requesturl_page http://baidu.com# 使用urlretrieve()方法
# 第一个参数是url地址第二个参数是保存的文件名
# 返回的是html文件所以后缀写html
# urllib.request.urlretrieve(url_page, baidu.html)# 下载图片
url_img https://tse1-mm.cn.bing.net/th/id/OIP-C.hMxUTa_ah0EEEKjzMrcKZgHaJF?w204h318c7r0o7cbiwp1dpr1.1pid1.7rm3.jpg
urllib.request.urlretrieve(url_img, img.jpg)# 下载视频mp4不再演示2.6 带单个参数的页面抓取get请求
import urllib.request
import urllib.parse# url http://www.baidu.com/s?ieUTF-8wd%E8%94%A1%E5%BE%90%E5%9D%A4
# url http://www.baidu.com/s?ieUTF-8wd蔡徐坤
# 需要将中文进行编码 导入quote即可
name urllib.parse.quote(蔡徐坤)
# print(name)# 将%E8%94%A1%E5%BE%90%E5%9D%A4 转化为 蔡徐坤
# 使用unquote即可
# rename urllib.parse.unquote(name)
# print(rename)# 可以用户自己输入名字进行修改name
url http://www.baidu.com/s?ieUTF-8wd name
response urllib.request.urlopen(url)
content response.read().decode()
print(content)2.7 定制request使用ua反爬
再来了解一下ua反爬
user Agent中文名为用户代理简称 UA它是一个特殊字符串头使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引、浏览器语言、浏览器插件等。
通俗的讲 ua能使得浏览器认为是请求不来自我们的爬虫程序而是来自浏览器本身
import urllib.request
import urllib.parsename urllib.parse.quote(蔡徐坤)url https://www.baidu.com/s?ieUTF-8wd name
# 定制request
header {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
}
request urllib.request.Request(urlurl, headersheader)
response urllib.request.urlopen(request)
content response.read().decode()
print(content)2.8 多字段的字符转码
# 当url为多个参数的时候进行转码
import urllib.parse
import urllib.request# http://www.baidu.com/s?wd周杰伦sex男# 必须用字典才可以
data {wd: 周杰伦,sex: 男
}a urllib.parse.urlencode(data)
# print(a)
# 获取网页源码
url https://www.baidu.com/s? a
# print(url)
header {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
}
request urllib.request.Request(urlurl, headersheader)
response urllib.request.urlopen(request)
content response.read().decode()
print(content)2.9 post请求的使用
import json
import urllib.request
import urllib.parseurl https://fanyi.baidu.com/sug# 构建post请求的数据 字典形式
data {kw: translate
}
# post请求必须添加编码 转变为二进制的数据
data urllib.parse.urlencode(data).encode(utf-8)
# print(data)
request urllib.request.Request(url url, data data)
response urllib.request.urlopen(request)
content response.read().decode(utf-8)
print(content)
# 获取的数据是json格式 字符串被编码了转化为字典字符串正常显示
obj json.loads(content)
print(obj,type(obj))
2.10 异常处理
import urllib.request
url http://www.baidu.com1
try:response urllib.request.urlopen(url)print(response.read().decode(utf-8))
except urllib.error.URLError:print(发送错误)三、 requests请求的使用 上面单纯使用urllib的方式显然麻烦了不少并且不易于理解那么有没有更简单更容易上手的方法呢有的兄弟有的可以直接使用requests的方式。 3.1 下载requests包
方式一使用命令行安装
打开命令行cmdwin R输入pip -V 查看pip是否正常安装python正常安装的情况下pip自动安装输入 pip install requests默认国外地址安装较慢这里使用国内地址 pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple等待安装成功提示即可
方式二使用pycharm直接安装
在右下脚找到python软件包搜索requests下载安装即可也可以使用国内地址进行安装 Tip: 可以使用pip uninstall 包名 来卸载指定的包。 3.2 requests的基本使用
# 爬取百度页面的源码# 1. 导包
import requests# 2. 发送请求
# 进入百度查看是否是get请求
url http://www.baidu.com
response requests.get(url)
# print(response) #Response [200]可以直接获取响应码# 获取相应
# text属性会自动寻早一个解码方式去解码会出现报错
# 解决方式为 讲response直接加入encoding即可
# response.encoding utf-8
# print(response.text)# 方式二 使用content方法 加上解码即可
print(response.content.decode())3.3 响应的保存
图片的保存
# 用resquests来保存一张图片import requests
url https://ww4.sinaimg.cn/mw690/0078WY2egy1i139fqp2wqj31jk2bcn61
# 先判断get请求
res requests.get(url)
# b形式数据图片存储
# print(res.content)
# 通过文件的形式保存 一定要带上b模式啊
with open(img.jpg, wb) as f:f.write(res.content)百度页面的保存
import requests
url http://www.baidu.com
res requests.get(url)
with open(baidu.html, w,encodingutf-8) as f:f.write(res.content.decode())3.4 响应对象的其他属性
import requests
url http://www.baidu.com
res requests.get(url)
#打印响应的ur1
print(res.url)#打印响应对象的请求头
print(res.request.headers)# 打印响应头
print(res.headers)3.5 用户代理介绍
import requests
url1 http://www.baidu.com #509723
url2 https://www.baidu.com #227# res requests.get(url2)
# content res.content.decode()
# print(len(content))# 使用用户代理反爬虫
# 依旧是写成字典形式
headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
}# 添加ua 让服务器认为是浏览器在发送请求response requests.get(url2,headersheaders)
content response.content.decode()
print(len(content)) # 289183.6 构建ua池
import random
# 构建ua池防止多次调用被反爬# 方法1 自己写ua池
uAlist [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36,Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1,Mozilla/5.0 (Linux; Android 8.0.0; SM-G955U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Mobile Safari/537.36
]
# 随机获取一个ua
# print(random.choice(uAlist))# 方法2 外包生成ua
# 下载fake-useragent包
# 频繁调用的时候可能会报错
from fake_useragent import UserAgent
print(UserAgent().random)3.7 带参数的请求
# 带参数数据的请求爬取
import requestsurl https://www.baidu.com/s?ieUTF-8headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
}
data {wd: 蔡徐坤
}res requests.get(url,headersheaders,paramsdata)
content res.content.decode()
print(content)3.8 通过面向对象的方式来获取数据
# 获取明星页面信息并且保存
import requests
class Star:def __init__(self):self.url https://www.baidu.com/s?ieUTF-8self.headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36}# 发送数据def send(self,params):response requests.get(self.url,headersself.headers,paramsparams)return response.text# 保存数据def save(self,content):with open(star.html,w,encodingutf-8) as f:f.write(content)def run(self):name input(请输入明星名称)params {wd:name}content self.send(params)self.save(content)star Star()
star.run()3.9 post请求
post请求: 登录注册传输大文本内容# requests.post(url,data)# data参数接收一个字典
get跟post区别 get请求—比较多 post请求 – 比较少 get请求直接向服务器发送请求获取应内容 post请求是先给服务器一些数据然后再获取响应 get请求携带参数-- params post诗求携带参数- data
# 百度翻译案例
import jsonimport requestsurl https://fanyi.baidu.com/sugheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
}
data {kw: eye
}
response requests.post(url,headersheaders,datadata)
content response.text
# print(content)
obj json.loads(content)
print(obj)总结
通过本教程的学习我们系统地掌握了网络爬虫的基本原理和关键技术。从HTTP请求、HTML解析到动态页面渲染、反爬策略应对再到数据的清洗与存储我们一步步构建了一个完整的爬虫知识体系。
爬虫技术不仅仅是一种数据采集手段更是连接互联网世界与数据分析的桥梁。掌握爬虫技能后我们可以高效地获取所需数据为商业分析、学术研究、自动化运维等场景提供强大的数据支持。
然而爬虫开发并非没有边界。在实践过程中我们必须遵守目标网站的robots.txt协议尊重版权和隐私避免对服务器造成过大压力。同时随着反爬技术的不断升级爬虫开发者也需要持续学习灵活应对各种挑战。
未来随着人工智能和大数据的发展爬虫技术将继续演进与自然语言处理NLP、机器学习ML等技术结合创造更大的价值。希望读者能够在本教程的基础上进一步探索爬虫的高级应用如分布式爬虫、智能解析等不断提升自己的技术能力。
数据驱动未来爬虫赋能探索