第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).text
        
        tree = 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).content
            with open('123.jpg','wb') as fp:
                fp.write(img_data)
            break
        

代理(重要)

  • 什么是代理

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

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

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

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

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

  • 如何使用代理?

    • 测试:访问如下网址,返回自己本机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).text
          proxy_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'%page
          page_text = requests.get(url,headers=headers,proxies={'https':random.choice(proxy_list)}).text
          tree = etree.HTML(page_text)
          ret = tree.xpath('/html/body/div[2]/div[3]/ul[2]/li[1]/span[3]/a/text()')[0]
          print(ret)
      
      
posted @ 2025-09-29 17:11  凫弥  阅读(36)  评论(0)    收藏  举报