爬虫-Day1

爬虫相关介绍

爬虫的本质就是模拟客户端请求获取服务端数据

无法爬取到想要的数据,因为爬虫模拟的力度不够

  • 通用爬虫:将一个页面中所有的数据都爬取到

  • 聚焦爬虫:建立于通用爬虫之上,针对指定数据爬取(如:图片,标题等)

  • 增量式爬虫:监控网站更新情况,爬取最新的数据


案例应用

需用到requests 模块可通过 :pip install requests 进行下载


东方财富首页数据爬取

  1. 通过数据包分析可很轻松的找到的大多数数据存在的数据包,其余的请求可发现都是请求的图片或其他格式image-20250814103515639

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

  3. 使用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)
    
  4. 获取到此响应包数据(这里由于响应包为html 格式所以存储同样为html)

image-20250814110835584


爬取51游戏中任何游戏对应的搜索结果页面数据


  1. 首页存在游戏搜索功能,进行搜索的话会新发起新请求image-20250814112115058

  2. 可采用开发者工具进行分析,若对于HTTP 协议较熟悉的话,可直接分析确认为GET 请求参数为"传奇"
    image-20250814112413661

  3. 逻辑分析完成,进行爬虫代码块编写

    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)
    
  4. 成功获取到相应的html 页面
    image-20250814114630162


中国人事考试网爬取[UA伪装]

  • http://www.cpta.com.cn/

    UA(User-Agent) 头 :HTTP 协议请求头的一个头部字段,其作用是告知服务器当前浏览器、系统等信息,服务器可针对UA提供服务

    反爬机制采用各种手段,用来检测爬虫程序,并拒绝为其提供服务,其中就存在典型的UA 头检测requests库默认会使用自己的UA

    反反爬机制绕过服务器检测的各种手段,进行数据爬出


  1. 爬取方式与第一个案例方法一致,这里就不过多赘述了,这里只做差异的演示 ,这里采用无任何反反爬机制的爬取

    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)
    
  2. 最终爬取下来的页面内容为,进行分析,推测后端服务器的WAF 规则库存在UA 头的检测

    • WAF 应用防火墙): 一种恶意请求的检测手段

image-20250814121859845

  1. 进行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)
    
  2. 反反爬绕过成功,成功爬取下首页数据(但目前该网站似乎进行了规则库的更新,仅仅UA 头伪造无法绕过)
    image-20250814122850790


中国人事考试网(站内搜索post + 请求参数)

  1. 进行数据包的分析,分析为POST 请求请求体参数为 keywords + 固定搜索参数
    image-20250814145523373

  2. 进行数据包构造,keywords 可为变量,爬取指定内容

    keyword={
    	keywords:变量
        "搜 索":"搜 索"
    }
    
  3. 构思完成,进行爬虫代码编写

    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)
    
  4. 爬取成功
    image-20250814150606900


智慧职教(动态加载数据爬取)(重点)
  • https://www.icve.com.cn/search

    动态加载数据:不是通过单一数据包进行页面渲染,也就无法进行一个数据包爬完数据了

    需求分析:获取到教师姓名、来源学校、课程热度、


  1. 数据包获取,无法快速定位爬取的数据包? 可用到开发者工具搜索关键字找到需求数据包
    image-20250814154208563

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

image-20250814154340678

  1. 编写爬虫代码,需接受格式为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)
    

image-20250814160202420

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

image-20250814160744442

  1. 编写筛选代码

    # 进行数据筛选
    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("爬取完毕")
    

image-20250814162135160

  1. 这里还可以再根据GET 请求中**pageNum **或 pageSize 参数进行多页爬取,步骤于之前实例的步骤一致修改,指定parmes 即可,这里不做演示了

图片数据爬取
  1. response.text 接受数据为字符串形式

  2. response.json() 接受数据为 json 格式*数据

  3. 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)

image-20250814165120725


posted @ 2025-08-14 17:56  QZ不是crazy  阅读(18)  评论(0)    收藏  举报