爬虫-Day1
爬虫相关介绍
爬虫的本质就是模拟客户端请求来获取服务端数据
若无法爬取到想要的数据,因为爬虫模拟的力度不够
-
通用爬虫:将一个页面中所有的数据都爬取到
-
聚焦爬虫:建立于通用爬虫之上,针对指定数据爬取(如:图片,标题等)
-
增量式爬虫:监控网站更新情况,爬取最新的数据
案例应用
需用到requests 模块可通过 :
pip install requests进行下载
东方财富首页数据爬取
-
通过数据包分析可很轻松的找到的大多数数据存在的数据包,其余的请求可发现都是请求的图片或其他格式

-
分析此数据包的请求信息,数据包为网站的默认根路径,请求方式为GET (也就是说我们只需要构建一个GET 请求包访问根路径即可)

-
使用requests 模块进行get 方式请求发送
import requests #1.指定服务器url url = "https://www.eastmoney.com/" #2.发送请求:根据指定url发送get 请求,得到响应对象 response = requests.get(url) # 3. 查看响应状态码 print(response.status_code) # 得到响应状态码 200 # 设置获取响应数据的编码格式 response.encoding='utf-8' #4.获取字符串形式的响应数据 data=response.text #5.持久化存储,响应数据存储于caifu.html with open ('caifu.html','w',encoding='utf-8') as f: f.write(data) -
获取到此响应包数据(这里由于响应包为html 格式所以存储同样为html)

爬取51游戏中任何游戏对应的搜索结果页面数据
-
首页存在游戏搜索功能,进行搜索的话会新发起新请求
-
可采用开发者工具进行分析,若对于HTTP 协议较熟悉的话,可直接分析确认为GET 请求,参数为"传奇"

-
逻辑分析完成,进行爬虫代码块编写
import requests # 用于动态请求参数的指定 game_name = input("请输入游戏关键字") url = 'https://game.51.com/search/action/game/' # 构建字典,用于指定发送参数, p = { 'q':game_name } # 发起get 请求,指定发送参数为q字典中的参数 response = requests.get(url,parmes=p) page_html = response.text with open(f"{game_name}.html",'w',encoding='utf-8') as f: f.wirte(page_html) -
成功获取到相应的html 页面

中国人事考试网爬取[UA伪装]
-
UA(User-Agent) 头 :HTTP 协议请求头的一个头部字段,其作用是告知服务器当前浏览器、系统等信息,服务器可针对UA提供服务
反爬机制:采用各种手段,用来检测爬虫程序,并拒绝为其提供服务,其中就存在典型的UA 头检测(requests库默认会使用自己的UA)
反反爬机制:绕过服务器检测的各种手段,进行数据爬出
-
爬取方式与第一个案例方法一致,这里就不过多赘述了,这里只做差异的演示 ,这里采用无任何反反爬机制的爬取
import requests url = " http://www.cpta.com.cn" response = requests.get(url) data = response.text with open('人事考试.html','w',encoding='utf-8') as f: f.write(data) -
最终爬取下来的页面内容为,进行分析,推测后端服务器的WAF 规则库存在UA 头的检测
- WAF (应用防火墙): 一种恶意请求的检测手段

-
进行UA 头伪造,反反爬对方的爬虫检测
import requests url = " http://www.cpta.com.cn" # 指定请求头字段中的UA h={ "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0" } # 指定get请求,且指定请求头为h 字典中字段,发送请求 response = requests.get(url,headers=h) data = response.text with open('人事考试.html','w',encoding='utf-8') as f: f.write(data) -
反反爬绕过成功,成功爬取下首页数据(但目前该网站似乎进行了规则库的更新,仅仅UA 头伪造无法绕过)

中国人事考试网(站内搜索post + 请求参数)
-
进行数据包的分析,分析为POST 请求,请求体参数为 keywords + 固定搜索参数

-
进行数据包构造,keywords 可为变量,爬取指定内容
keyword={ keywords:变量 "搜 索":"搜 索" } -
构思完成,进行爬虫代码编写
import requests url = 'http://www.cpta.com.cn/category/search' keyword = input('请输入:') # 构建指定UA 头,绕过反爬 h={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36" } # 构建请求体 d={ "keywords":keyword, "搜 索":"搜 索" } # 以post 请求发送参数和指定请求头 response = request.post(url,header=h,data=p) # 持久化存储 with open(f'{keyword}.html','w',encoding='utf-8') as f: f.write(response.text) -
爬取成功

智慧职教(动态加载数据爬取)(重点)
-
https://www.icve.com.cn/search
动态加载数据:不是通过单一数据包进行页面渲染,也就无法进行一个数据包爬完数据了
需求分析:获取到教师姓名、来源学校、课程热度、
-
数据包获取,无法快速定位爬取的数据包? 可用到开发者工具搜索关键字找到需求数据包

-
数据包分析:GET方式请求,通过pagenum 参数判断返回页,响应包为序列化后的JSON 数据(后端应该是以先加载框架,后加载数据的方式将两者分离了出来)


-
编写爬虫代码,需接受格式为JSON 数据,这里已经成功获取到值,接下来进行筛选和持久化存储即可
import requests # 可定义爬出页面 url = "https://www.icve.com.cn/prod-api/homePage/zykCourseList?pageSize=16&pageNum=1" # 定义UA头和Referer headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0", "Referer":"https://www.icve.com.cn/search" } # 发送请求包并以json 形式接受响应包 response=requests.get(url,headers=headers) json_data=response.json() print(json_data)

- 这里分析,响应包为嵌套于rows 列表中的每个字典

-
编写筛选代码
# 进行数据筛选 for i in json_data["rows"]: data=f"教师姓名:{i["teacherName"]},学校:{i["schoolName"]},热度:{i["studentNum"]}" # 进行数据持久存储 with open('智慧.cvs','a+',encoding='utf-8') as f: f.write(f"{data}\n") f.close print("爬取完毕")

- 这里还可以再根据GET 请求中**pageNum **或 pageSize 参数进行多页爬取,步骤于之前实例的步骤一致修改,指定parmes 即可,这里不做演示了
图片数据爬取
-
response.text 接受数据为字符串形式
-
response.json() 接受数据为 json 格式*数据
-
response.content 接受数据为二进制形式,如视频、音频、压缩包等
图片爬取仅需注意接受数据时为content ,接受二进制即可
import requests
url = 'https://ts1.tc.mm.bing.net/th/id/R-C.a22ba862dc4024396921dee05c16b698?rik=j6jky8wC6ZrBUQ&riu=http%3a%2f%2fpic.baike.soso.com%2fp%2f20100127%2fbki-20100127214000-1068687119.jpg&ehk=8f8CTwGTqQyZY0AuFfHuo41VxikBPGpKPafik0dKVfA%3d&risl=&pid=ImgRaw&r=0'
respons = requests.get(url)
# 二进制形式接受图片
img = respons.content
# 二进制形式写入jpeg 图片中
with open("pikachu.jpeg",'wb') as f:
f.write(img)


浙公网安备 33010602011771号