第3章 day03 xpath+反爬虫

news/2025/9/29 17:16:44/文章来源:https://www.cnblogs.com/fuminer/p/19119149

上次直播作业

  • 下厨房的菜谱搜索(多个请求参数)

    • 通过抓包工具的分析发现,搜索菜谱的数据包有两个请求参数:

      • keyword:搜索的关键字
      • cat:1001固定形式
    • import requests#请求头
      headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
      }
      title = input('请输入菜名:')
      params = {'keyword':title,'cat':'1001'
      }
      #1.指定url
      url = 'https://www.xiachufang.com/search/'#2.发起请求
      response = requests.get(url=url,headers=headers,params=params)
      #处理乱码
      response.encoding = 'utf-8' #gbk#3.获取响应数据
      page_text = response.text#4.持久化存储
      fileName = title + '.html'
      with open(fileName,'w') as fp:fp.write(page_text)
  • 肯德基

    • http://www.kfc.com.cn/kfccda/index.aspx

      • 将餐厅的位置信息进行数据爬取

      • import requests
        head = { #存放需要伪装的头信息'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
        }
        #post请求的请求参数
        data = {"cname": "","pid": "","keyword": "天津","pageIndex": "1","pageSize": "10",
        }
        #在抓包工具中:Form Data存放的是post请求的请求参数,而Query String中存放的是get请求的请求参数
        url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
        #在post请求中,处理请求参数的是data这个参数不是params
        response = requests.post(url=url,headers=head,data=data)
        #将响应数据进行反序列化
        page_text = response.json()
        for dic in page_text['Table1']:name = dic['storeName']addr = dic['addressDetail']print(name,addr)
        

数据解析

何为数据解析

  • 概念:可以将爬取到的数据中指定的数据进行单独提取。

  • 作用:实现聚焦爬虫。

  • 数据解析通用原理:

    • 在一张页面中,想要解析的数据是存在于相关的html的标签中。
    • 可以先将指定的标签进行定位,然后可以将该标签中展示的数据进行提取。
  • 聚焦爬虫编码流程:

    • 指定url
    • 发起请求
    • 获取页面源码数据
    • 数据解析
    • 持久化存储
  • python中可以实现数据解析的技术:

    • 正则表达式(复杂度高)
    • bs4(python独有,学习成本较低)
    • xpath(通用性最强,最重要)
    • pyquery(css语句)

数据解析的主流策略

  • 具体解析的操作:

    • 在当前目录下新建一个test.html文件,然后将下述内容拷贝到该文件中

      • <html lang="en">
        <head><meta charset="UTF-8" /><title>测试bs4</title>
        </head>
        <body><div><p>百里守约</p></div><div class="song"><p>李清照</p><p>王安石</p><p>苏轼</p><p>柳宗元</p><a href="http://www.song.com/" title="赵匡胤" target="_self"><span>this is span</span>宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a><a href="" class="du">总为浮云能蔽日,长安不见使人愁</a><img src="http://www.baidu.com/meinv.jpg" alt="" /></div><div class="tang"><ul><li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li><li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li><li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li><li><a href="http://www.sina.com" class="du">杜甫</a></li><li><a href="http://www.dudu.com" class="du">杜牧</a></li><li><b>杜小月</b></li><li><i>度蜜月</i></li><li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li></ul></div>
        </body>
        </html>
        

xpath(重点)

  • 环境安装:

    • pip install lxml
  • xpath解析的编码流程:

    • 创建一个etree类型的对象,把被解析的数据加载到该对象中
    • 调用etree对象中xpath函数结合不同形式的xpath表达式进行标签定位和数据的提取
  • xpath表达式如何理解?

  • from lxml import etree
    #1.创建一个etree的工具对象,然后把即将被解析的页面源码数据加载到该对象中
    tree = etree.parse('test.html')
    #2.调用etree对象的xpath函数然后结合着不用形式的xpath表达式进行标签定位和数据提取
    #xpath函数返回的是列表,列表中存储的是满足定位要求的所有标签
    #/html/head/title定位到html下面的head下面的title标签
    title_tag = tree.xpath('/html/head/title')
    #//title在页面源码中定位到所有的title标签
    title_tag = tree.xpath('//title')
    #属性定位#定位到所有的div标签
    div_tags = tree.xpath('//div')#定位到class属性值为song的div标签 //tagName[@attrName='value']
    div_tag = tree.xpath('//div[@class="song"]')
    #索引定位://tag[index]#注意:索引是从1开始的
    div_tag = tree.xpath('//div[1]')
    #层级定位# /表示一个层级  //表示多个层级
    a_list = tree.xpath('//div[@class="tang"]/ul/li/a')
    a_list = tree.xpath('//div[@class="tang"]//a')#数据提取#1.提取标签中的文本内容:/text()取直系文本  //text()取所有文本
    a_content = tree.xpath('//a[@id="feng"]/text()')[0]
    div_content = tree.xpath('//div[@class="song"]//text()')#2.提取标签的属性值://tag/@attrName
    img_src = tree.xpath('//img/@src')[0]
    print(img_src)
    

案例应用:碧血剑文本爬取

  • url:https://bixuejian.5000yan.com/

  • 需求:将每一个章节的标题和内容进行爬取然后存储到文件中

    #首页:章节名称,章节详情页的连接
    #详情页:章节内容import requestsfrom lxml import etree
    #存储小说文件的文件夹名称
    dir_name = 'xiaoshuoLib'headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
    }main_url = 'https://bixuejian.5000yan.com/'
    response = requests.get(url=main_url,headers=headers)
    response.encoding = 'utf-8'
    page_text = response.text#解析首页
    tree = etree.HTML(page_text)
    a_alist = tree.xpath('/html/body/div[2]/div/div[1]/div[3]/ul/li/a')for a in a_alist:#局部解析title = a.xpath('./text()')[0]detail_url = a.xpath('./@href')[0]detail_response = requests.get(url=detail_url,headers=headers)detail_response.encoding = 'utf-8'detail_page_text = detail_response.texttree = etree.HTML(detail_page_text)content_list = tree.xpath('/html/body/div[2]/div/div[1]/div[3]/div[4]//text()')content = ''.join(content_list)with open('./xiaoshuoLib/'+title+'.txt','w',encoding='utf-8') as fp:fp.write(title+'\n'+content)print(title,":章节内容爬取保存成功!")

简历模版下载:https://sc.chinaz.com/jianli/free.html

  • 下载当前页所有的建立模板

    • 简历名称+简历的下载链接

    • 根据简历的下载链接 下载简历文件

    • 根据下载地址下载的压缩包,压缩包是二进制的数据

      
      import requests
      from time import sleep
      from lxml import etree
      dir_name = 'jianliLib'headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
      }
      for page in range(1,3):if page == 1:main_url = 'https://sc.chinaz.com/jianli/free.html'else:main_url = 'https://sc.chinaz.com/jianli/free_%d.html'%pageresponse = requests.get(url=main_url,headers=headers)response.encoding = 'utf-8'page_text = response.texttree = etree.HTML(page_text)div_list = tree.xpath('//*[@id="container"]/div')for div in div_list:sleep(0.5)detail_url = div.xpath('./p/a/@href')[0]title =  div.xpath('./p/a/text()')[0]detail_page_text = requests.get(detail_url,headers=headers).texttree = etree.HTML(detail_page_text)#解析到了简历的下载链接down_load_url = tree.xpath('//*[@id="down"]/div[2]/ul/li[1]/a/@href')[0]data = requests.get(down_load_url,headers=headers).contentwith open('jianliLib/'+title+'.rar','wb') as fp:fp.write(data)print(title,'保存下载成功!')
  • 图片懒加载:

    • url:https://sc.chinaz.com/tupian/meinvtupian.html

      • 爬取上述链接中所有的图片数据
    • 主要是应用在展示图片的网页中的一种技术,该技术是指当网页刷新后,先加载局部的几张图片数据即可,随着用户滑动滚轮,当图片被显示在浏览器的可视化区域范围的话,在动态将其图片请求加载出来即可。(图片数据是动态加载出来)。

    • 如何实现图片懒加载/动态加载?

      • 使用img标签的伪属性(指的是自定义的一种属性)。在网页中,为了防止图片马上加载出来,则在img标签中可以使用一种伪属性来存储图片的链接,而不是使用真正的src属性值来存储图片链接。(图片链接一旦给了src属性,则图片会被立即加载出来)。只有当图片被滑动到浏览器可视化区域范围的时候,在通过js将img的伪属性修改为真正的src属性,则图片就会被加载出来。
    • 如何爬取图片懒加载的图片数据?

      • 只需要在解析图片的时候,定位伪属性的属性值即可
      import requests
      from time import sleep
      from lxml import etree
      dir_name = 'imgLib'headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
      }
      for page in range(1,3):if page == 1:url = 'https://sc.chinaz.com/tupian/meinvtupian.html'else:url = 'https://sc.chinaz.com/tupian/meinvtupian_%d.html'%pageresponse = requests.get(url=url,headers=headers)response.encoding = 'utf-8'page_text = response.texttree = etree.HTML(page_text)#解析图片地址div_list = tree.xpath('/html/body/div[3]/div[2]/div')for div in div_list:img_src = "https:"+div.xpath('./img/@data-original')[0]title = div.xpath('./div/a/text()')[0]+'.jpg'#对图片链接请求img_data = requests.get(img_src,headers=headers).contentwith open('imgLibs/'+title,'wb') as fp:fp.write(img_data)print(title,'保存下载成功!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

装修公司营销网站模板查询注册公司

正整数 A 的“D​A​​&#xff08;为 1 位整数&#xff09;部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​。例如&#xff1a;给定 A3862767&#xff0c;D​A​​6&#xff0c;则 A 的“6 部分”P​A​​ 是 66&#xff0c;因为 A 中有 2 个 6。 现给定 A、D​A​​…

ttkefu2026迎来永久免费的客服系统分享

ttkefu2026迎来永久免费的客服系统分享在数字化浪潮席卷全球的当下,客户服务已成为企业核心竞争力的重要组成部分。然而,传统客服系统高昂的部署成本、复杂的功能配置以及多渠道整合的痛点,始终制约着中小企业服务效…

002- 学习环境搭建

学习环境搭建1、开发工具下载 Visualstudio 2022  https://visualstugio.microsoft.com/zh-hans/vs/ 【产品链接,失效自己找和谐版本】  https://docs.microsoft.com/zh-cn/visualstudio/releases/2022/system…

网页建站点seo实战密码在线阅读

最近看到一道面试题&#xff1a;内部类可以引用它的包含类的成员吗&#xff1f;有没有什么限制&#xff1f; 答案大部分都是这样子的&#xff1a; 完全可以。如果不是静态内部类&#xff0c;那没有什么限制&#xff01; 一个内部类对象可以访问创建它的外部类对象的成员包括私有…

第10章 day10 DrissionPage详细教程

DrissionPage详细教程 1. 基本概述 DrissionPage 是一个基于 python 的网页自动化工具。它既能控制浏览器,也能像requests一样收发数据包,更重要的是还能把两者合二为一。因此,简单来说DrissionPage可兼顾浏览器自动…

求局部最小值

求局部最小值局部最小值 题目:给定一个数组,每两个相邻的数组不等,找到该数组上任意一个局部最小值。 定义:nums[1] > nums[0] nums[len(nums) - 2] > nums[len(nums) - 1] nums[n-1] > nums[n] &&am…

Element-UI的transfer穿梭框组件数据量大解决方案

一、面临问题 数据量大,渲染慢,搜索、勾选、关闭、右移卡顿 二、解决方案 1. 总体思路 改写 Element-UI 的 transfer 穿梭框组件,形成自己的自定义组件 2. 具体步骤 2.1 复制 Element-UI 的 transfer 穿梭框组件出来…

第9章 day09 hook插件

二. hook插件 1.概念 在JavaScript中,hook是一种能够拦截和修改函数或方法行为的技术。通过使用hook,开发者可以在现有的函数执行前、执行后或者替换函数的实现逻辑。hook目的是找到函数入口以及一些参数变化,便于分…

nginx 一致性hash和流量检查模块

nginx-module-vts:这是一个Nginx的监控模块,能够收集Nginx自身详细的虚拟主机流量状态信息,如请求次数、响应字节、响应时间等,并以JSON、HTML或Prometheus格式输出。nginx-vts-exporter依赖于这个模块。nginx-vts…

网站开发的试用期条款疏肝益阳胶囊有哪些功效与作用

阿里妹导读&#xff1a;日常工作中&#xff0c;我们多少都会遇到应用的性能问题。在阿里面试中&#xff0c;性能优化也是常被问到的题目&#xff0c;用来考察是否有实际的线上问题处理经验。面对这类问题&#xff0c;阿里工程师齐光给出了详细流程。来阿里面试前&#xff0c;先…

深入解析:10月底实习准备-Mysql(按面试频率准备)

深入解析:10月底实习准备-Mysql(按面试频率准备)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

CEXE的%你赛5-题解

T1 简单 dfs,记录数组 \(vis\) 表示一个点有没有被搜索过,从小到大遍历 \(vis\),如果 \(vis_i=0\) 则从 \(i\) 开始遍历图,遍历时记录答案即可。 #include<bits/stdc++.h> using namespace std; int n,m; lo…

C++语言(1)

.数制的前缀 二进制:0b或0B。 八进制:0。注意代码中012的十进制数值是10。 十六进制:0x(字母小写)或0X(字母小写)。 .输入和输出 .1.scanf和printf 格式符 常见类型的格式符:类型 格式符int %dlong long %llds…

Windows多人共享文件夹全流程,附2025新共享文件快90%

针对传统Windows共享文件夹设置繁琐、不安全、仅限局域网的痛点,本文提出用坚果云创建多人共享文件夹。其操作简便,支持跨地域协作、精细权限管理与文件版本回溯,无缝替代传统方式,是实现团队安全、高效协同办公的…

第11章 day11-day12关于json请求体/逆向爬虫实战

第1知识点:关于json请求体 第2知识点:关于精准请求(如何排除干扰请求) 第3知识点:入口定位 一、关键字方法 (1) 方法关键字 encrypt decrypt (2) key关键字 第4知识点:断点与断点调试 普通断点 XHR断点 条件断点…

容斥与二项式反演

先挖坑,后填坑。容斥 容斥,实际上就是用总的方案数减去不合法的方案数。 我们考虑以下组合恒等式: \[\sum_{i = 0}^{n} (-1) ^ {i} C_{n}^{i} = [n = 0] \]为什么这个式子跟容斥有关呢? 我们考虑不合法的数量为 \(…

网上怎样做电缆网站建设网站公司怎么建站

centos7 mysql 基本测试&#xff08;7&#xff09;主从并行简单测试 重启MySQL服务使配置生效。 注意&#xff1a;并行复制需要slave的硬件资源充足&#xff0c;并且确保网络通信和IO性能不是瓶颈。不是所有的应用场景都适合并行复制&#xff0c;比如写密集型应用或者slave负…

react useCallback Hook详解

什么是 useCallback Hook? useCallback 是一个 React Hook,用于缓存函数,防止函数在每次组件渲染时被重新创建。它的主要目的是优化性能,特别是在将函数作为 props 传递给子组件或在依赖数组中使用时。 简单来说,…

从Docker构建失败到CRA被淘汰:一个React项目的ES模块探索记录

开头 最近给一个React项目配Docker构建,碰到了一个看起来简单实际很麻烦的错误: Failed to compile. The target environment doesnt support dynamic import() syntax so its not possible to use external type mo…

充气泵PCBA方案中数字传感器和模拟传感器的差异

充气泵的核心需求是实时、准确检测气罐/充气对象(如轮胎、泳圈)的压力,并根据压力值控制电机启停(如达到目标压力后停机),二者的应用差异直接影响产品体验:1.模拟传感器的应用场景低成本入门级充气泵(如家用小…