requests高级

防盗链

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

    • 从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": "http://blog.sina.com.cn/",
        
        }
        url = 'http://blog.sina.com.cn/s/blog_01ebcb8a0102zi2o.html?tj=1'
        page_text = requests.get(url,headers=headers).text
        tree = etree.HTML(page_text)
        img_src = tree.xpath('//*[@id="sina_keyword_ad_area2"]/div/a/img/@real_src')
        for src in img_src:
            data = requests.get(src,headers=headers).content
            with open('./123.jpg','wb') as fp:
                fp.write(data)
            # break
        

视频数据爬取

  • url:https://www.51miz.com/shipin/

    • 爬取当前url页面中营销日期下的几个视频数据。
  • 找寻每个视频的播放地址:

    • 在video标签下面有一个source标签,其内部的src属性值正好就是视频的播放地址 (补充上https:即可) 。
    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/115.0.0.0 Safari/537.36',
        'Referer':'https://www.51miz.com/'
    }
    url = 'https://www.51miz.com/shipin/'
    response = requests.get(url=url,headers=headers)
    page_text = response.text
    
    #数据解析
    tree = etree.HTML(page_text)
    div_list = tree.xpath('/html/body/div[2]/div[2]/div[1]/div[2]/div[2]/div')
    for div in div_list:
        src_list = div.xpath('./a/div/div/div/video/source/@src')
        #要给视频地址进行补全
        for src in src_list:
            video_data = requests.get(url=src,headers=headers).content
            video_title = src.split('/')[-1]
            with open(video_title,'wb') as fp:
                fp.write(video_data)
            print(video_title,'爬取保存成功!')
    
        break
    

Cookie(重点)

  • 什么是cookie?

    • cookie的本质就是一组数据(键值对的形式存在)
    • 是由服务器创建,返回给客户端,最终会保存在客户端浏览器中。
    • 如果客户端保存了cookie,则下次再次访问该服务器,就会携带cookie进行网络访问。
      • 典型的案例:网站的免密登录
  • 爬取雪球网中的咨询数据

    • url:https://xueqiu.com/,需求就是爬取热帖内容

    • 经过分析发现帖子的内容是通过ajax动态加载出来的,因此通过抓包工具,定位到ajax请求的数据包,从数据包中提取:

      • url:https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id=311519&size=15
      • 请求方式:get
      • 请求参数:拼接在了url后面
    • import requests
      import os
      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 = 'https://xueqiu.com/statuses/hot/listV2.json'
      param = {
          "since_id": "-1",
          "max_id": "311519",
          "size": "15",
      }
      response = requests.get(url=url,headers=headers,params=param)
      data = response.json()
      print(data)
      #发现没有拿到我们想要的数据
      
    • 分析why?

      • 切记:只要爬虫拿不到你想要的数据,唯一的原因是爬虫程序模拟浏览器的力度不够!一般来讲,模拟的力度重点放置在请求头中!
      • 上述案例,只需要在请求头headers中添加cookie即可!
    • 爬虫中cookie的处理方式(两种方式):

      • 手动处理:将抓包工具中的cookie赋值到headers中即可

        • 缺点:
          • 编写麻烦
          • cookie通常都会存在有效时长
          • cookie中可能会存在实时变化的局部数据
      • 自动处理 (重点)

        • 爬虫的session会话对象:

          • 在爬虫里,session对象是一个非常常用的对象,这个对象代表一次用户会话(从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开)。session对象能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。
        • 基于session对象实现自动处理cookie。

          • 1.创建一个空白的session对象。
          • 2.需要使用session对象发起请求,请求的目的是为了捕获cookie
            • 注意:如果session对象在发请求的过程中,服务器端产生了cookie,则cookie会自动存储在session对象中。
          • 3.使用携带cookie的session对象,对目的网址发起请求,就可以实现携带cookie的请求发送,从而获取想要的数据。
        • 注意:session对象至少需要发起两次请求

          • 第一次请求的目的是为了捕获存储cookie到session对象
          • 后次的请求,就是携带cookie发起的请求了
        • import requests
          
          headers = {
              'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
          }
          param = {
              #如果遇到了动态变化的请求参数?必须经过测试才知道需不需要处理
              "since_id": "-1",
              "max_id": "553059", #动态变化的请求参数
              "size": "25"
          }
          
          url = 'https://xueqiu.com/statuses/hot/listV3.json?page=1&last_id='
          
          #session对象会实时保存跟踪服务器端给客户端创建的cookie
              #创建一个session对象
          session = requests.Session() #空白的session对象
          
          first_url = 'https://xueqiu.com/'
          #使用session对象进行请求发送:如果该次请求时,服务器端给客户端创建cookie的话,则该cookie就会被保存seesion对象中
          session.get(url=first_url,headers=headers)
          #使用保存了cookie的session对象进行后续请求发送
          ret = session.get(url=url,headers=headers).json()
          print(ret)
          

模拟登录

  • http://download.java1234.com/直接访问个人中心和登录后访问其个人中心
import requests
headers = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
}
session = requests.Session()
data = {
    "userName": "bb328410948",
    "password": "bb328410948"
}
session.post('http://download.java1234.com/user/login',data=data,headers=headers)

page_text = session.get('http://download.java1234.com/toUserCenterPage',headers=headers).text

with open('1.html','w') as fp:
    fp.write(page_text)

代理(重要)

  • 什么是代理
    • 代理服务器
  • 代理服务器的作用
    • 就是用来转发请求和响应

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 在爬虫中为何需要使用代理?

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

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

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

    • 芝麻代理:https://jahttp.zhimaruanjian.com/(推荐,有新人福利)
  • 如何使用代理?

    • 测试:访问如下网址,返回自己本机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])
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值