当前位置: 首页 > news >正文

第4章 day04 防盗链

需求:https://ks.wangxiao.cn/,所有类别下的题目进行爬取

分析思路:

#1.可以在首页将所有的一级标题、二级标题和二级标题对应的详情页链接进行爬取和解析
#2.发现上一步中,获取的二级标题的详情页链接,对应的是【模拟考试】的内容,并不是我们想要的【每日一练】的内容
#3.观察【每日一练】和【模拟考试】的链接,找出相同和不同之处,然后将【模拟考试】的链接修改成【每日一练】的链接
#4.获取了每一个二级标题对应【每日一练】的详情页链接
#5.可以在当前页面中,点击【开始做题】,进行题目的练习,发现,需要经过登录后,才可以点击【开始做题】
#6.可以在页面中,手动进行账号密码登录,登录成功后,打开抓包工具,刷新页面,获取登录后的cookie
#7.抓取点击【开始做题】后对应的数据包,发现该数据包是一个post请求,发现该请求的请求参数中有3个动态变化的值(day,sign和subsign)
#8.批量获取不同二级标题对应试题数据对应post数据包中动态变化的请求参数(day,sign和subsign)
#9.经过分析发现,每一个二级标题对应【每日一练】页面中的每一个试题名称对应的详情页url中就包含了,这三个动态变化的请求参数
#10.携带cookie和这三个动态变化的请求参数,进行试题内容对应的post请求
#11.请求到json数据后,进行数据解析:题目类型、题目内容、四个选项和正确答案
#12.将数据进行持久化存储

防盗链

  • 现在很多网站启用了防盗链反爬,防止服务器上的资源被人恶意盗取。什么是防盗链呢?

    • 从HTTP协议说起,在HTTP协议中,有一个表头字段:referer,采用URL的格式来表示从哪一个链接跳转到当前网页的。通俗理解就是:客户端的请求具体从哪里来,服务器可以通过referer进行溯源。一旦检测来源不是网页所规定的,立即进行阻止或者返回指定的页面。
  • 案例:抓取微博图片,url:http://blog.sina.com.cn/lm/pic/,将页面中某一组系列详情页的图片进行抓取保存,比如三里屯时尚女郎:http://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1

    • 注意:

      • 1.在解析图片地址的时候,定位src的属性值,返回的内容和开发工具Element中看到的不一样,通过network查看网页源码发现需要解析real_src的值。

      • 2.直接请求real_src请求到的图片不显示,加上Refere请求头即可

        • 哪里找Refere:抓包工具定位到某一张图片数据包,在其requests headers中获取
      • import requests
        from lxml import etree
        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','Referer':'https://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1'
        }
        url = 'https://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1'
        page_text = requests.get(url,headers=headers).texttree = etree.HTML(page_text)
        a_list = tree.xpath('//*[@id="sina_keyword_ad_area2"]/div/a')
        for a in a_list:img_src = a.xpath('./img/@real_src')[0]img_data = requests.get(img_src,headers=headers).contentwith open('123.jpg','wb') as fp:fp.write(img_data)break
        

代理(重要)

  • 什么是代理

    • 代理服务器
  • 代理服务器的作用

    • 就是用来转发请求和响应
  • 在爬虫中为何需要使用代理?

    • 有些时候,需要对网站服务器发起高频的请求,网站的服务器会检测到这样的异常现象,则会讲请求对应机器的ip地址加入黑名单,则该ip再次发起的请求,网站服务器就不在受理,则我们就无法再次爬取该网站的数据。
    • 使用代理后,网站服务器接收到的请求,最终是由代理服务器发起,网站服务器通过请求获取的ip就是代理服务器的ip,并不是我们客户端本身的ip。
  • 代理的匿名度

    • 透明:网站的服务器知道你使用了代理,也知道你的真实ip
    • 匿名:网站服务器知道你使用了代理,但是无法获知你真实的ip
    • 高匿:网站服务器不知道你使用了代理,也不知道你的真实ip(推荐)
  • 代理的类型(重要)

    • http:该类型的代理服务器只可以转发http协议的请求
    • https:可以转发https协议的请求
  • 如何获取代理?

    • 携趣代理:https://www.xiequ.cn/index.html?f301de7f
  • 如何使用代理?

    • 测试:访问如下网址,返回自己本机ip

    • import requests
      from lxml import etree
      headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
      }
      url = 'http://www.cip.cc/'page_text = requests.get(url,headers=headers).text
      tree = etree.HTML(page_text)
      text = tree.xpath('/html/body/div/div/div[3]/pre/text()')[0]
      print(text.split('\n')[0])
      
    • 使用代理发起请求,查看是否可以返回代理服务器的ip

    • import requests
      from lxml import etree
      headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
      }
      url = 'http://www.cip.cc/'page_text = requests.get(url,headers=headers,proxies={'http':'121.234.12.62:4246'}).text
      tree = etree.HTML(page_text)
      text = tree.xpath('/html/body/div/div/div[3]/pre/text()')[0]
      print(text.split('\n')[0])
      

      代理池

      https://wz.sun0769.com/political/index/politicsNewest?id=1

      import requests
      from lxml import etree
      import random
      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',
      }
      def get_proxy_pool():p_url = '代理提取的url'page_text = requests.get(p_url).textproxy_list = page_text.split('\r\n')return proxy_list
      proxy_list = get_proxy_pool() #获取了代理池(列表)for page in range(1,100):url = 'https://wz.sun0769.com/political/index/politicsNewest?id=1&page=%d'%pagepage_text = requests.get(url,headers=headers,proxies={'https':random.choice(proxy_list)}).texttree = etree.HTML(page_text)ret = tree.xpath('/html/body/div[2]/div[3]/ul[2]/li[1]/span[3]/a/text()')[0]print(ret)
http://www.hskmm.com/?act=detail&tid=20960

相关文章:

  • 第3章 day03 xpath+反爬虫
  • 002- 学习环境搭建
  • 第10章 day10 DrissionPage详细教程
  • 求局部最小值
  • Element-UI的transfer穿梭框组件数据量大解决方案
  • 第9章 day09 hook插件
  • nginx 一致性hash和流量检查模块
  • 深入解析:10月底实习准备-Mysql(按面试频率准备)
  • 机器学习概述 - -一叶知秋
  • CEXE的%你赛5-题解
  • C++语言(1)
  • Windows多人共享文件夹全流程,附2025新共享文件快90%
  • 第11章 day11-day12关于json请求体/逆向爬虫实战
  • 容斥与二项式反演
  • react useCallback Hook详解
  • 从Docker构建失败到CRA被淘汰:一个React项目的ES模块探索记录
  • 充气泵PCBA方案中数字传感器和模拟传感器的差异
  • 实用指南:小米17手机的上市公司供应商
  • CDN + WAF + CLB + Higress 架构下的 TLS 加解密详细解析(适用阿里云)
  • react useMemo Hook详解
  • react useContext 详解
  • Python技能大赛-备赛建议
  • 【软件系统架构】系列七:系统性能——操作系统性能深入解析 - 实践
  • 你的下一款定位神器,何必是GPS?Nordic带你解锁Wi-Fi SSID的隐藏潜能
  • CF407E k-d-sequence 题目分析(0929模拟赛最后一题)
  • Linux 生成随机端口
  • MATLAB 中 dsp.FFT 系统对象:从原理到实践的完整指南
  • 并发编程可见性
  • C# Devexpress GridControl实现全选功能(转载,记录)
  • github Connection reset by 20.205.243.160 port 443 fatal: Could not read from remote repository.