龙之谷吧 关注:2,660,732贴子:93,540,902
  • 10回复贴,共1

夕阳试炼榜 爬虫源码

取消只看楼主收藏回复

非专业出身,欢迎大手子交流指正
PS:Python真的容易上手,用来做一些自动化的小脚本真的非常不绰,建议各位学一点,对工(zhuang)作(bi)有大用


1楼2020-10-11 12:37回复

    一切的开始,都源于这个网站,相信大家都不陌生,这是龙之谷官方夕阳试炼榜活动的时候网站,虽然活动结束了但是网站每天都会更新数据
    当时我就想,可不可把数据下载下来呢,一页一页点就太费劲了,我是知道有爬虫这个东西的,于是就去搜了下爬虫
    然后我就发现,这不是挺简单的吗?于是开始鼓捣这个爬虫
    对于新新手来说,【1】安装python,【2】学一下requests库


    2楼2020-10-11 12:43
    回复

      request简单到什么程度?如上图,(图片来自csdn),第一步import requests,第二步用个request.get或者post加网址,就把你要的网页爬回来了,后续处理这个结果就行了,就两句代码。。


      4楼2020-10-11 12:48
      回复
        然后我就去试了下,发现并不行。。
        我开始以为,这个试炼榜每一页都对应一个网址,我只要把网址变成参数就可以了,但是打开才发现,我点排行榜下一页的时候,网址特喵的一点变化没有,如下图

        懵逼地我开始搜索,“爬虫 网址不变”,“动态网页”,一连换了好几个搜索关键词,终于让我搜到了,这个叫ajax动态网页,指的是网址不变(网页不刷新)的情况下,更新部分网页内容


        5楼2020-10-11 12:55
        回复
          对于我们这些外行来说,最大的问题就是你不知道这个是什么,搜索都不知道搜什么
          有了ajax关键词,网上有大量的ajax爬虫实例,我开始学(zhao)习(chao)
          首先要找到我点下一页的时候,到底向服务器发送了什么
          具体就是,打开网页的时候,按F12打开开发者页面(谷歌浏览器),找到网络network,里面有个xhr(我也不知道这是什么),当我点击下一页的时候,这里刷新了一个东西,ok,就是你了


          6楼2020-10-11 13:02
          回复
            点击这个不知道叫什么的东西,看一下详细信息,这不就是我requests大法里面的几个参数吗?
            RequestUrl这个明显是网址,也就是url
            requestmethod说明用request.post方法

            到这里我又疑惑了,这个怎么区分不同排行榜的页数呢?
            然后我就发现,post方法有个参数,叫data,是一发送到服务器的,下面这个form data不就是吗
            pageindex这明显是页码,pagesize也好理解,这排行榜不正好一页五条数据吗,jobecode更好理解了,职业代码
            seaareaID和passnum应该是区服和夕阳层数,这些只要简单多点几下都能试出来,如下图


            7楼2020-10-11 13:14
            回复
              到这里,爬取网页的代码基本完了,我又发现了一个问题,这个url后面的一串数字是啥?

              又是漫长的试验和搜索,最后得出结论,就是个随机数,没有规律,好像仅仅是为了缓存相关的用途
              至此,我们的代码也就出来了
              #requests库的几个参数
              base_url = 'http://act2.dn.sdo.com/Project/202004ranking/handler/GetStageRank.ashx?'
              #给url加随机数
              url = base_url + str(random.random())
              headers = { 'Host': 'act2.dn.sdo.com', 'Referer': 'http://act2.dn.sdo.com/Project/202004ranking/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36', 'X-Requested-With': 'XMLHttpRequest', 'Content-Length': '57', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }
              #职业代码
              jobcode = { '23':'剑皇','24':'月之领主','25':'狂战士','26':'毁灭者','76':'黑暗复仇者', '29':'狙翎','30':'魔羽','31':'影舞者','32':'风行者','81':'银色猎人', '35':'火舞','36':'冰灵','37':'时空领主','38':'黑暗女王','85':'黑暗死神', '41':'圣骑士','42':'十字军','43':'圣徒','44':'雷神','83':'黑暗教主', '47':'重炮手','48':'机械大师','50':'炼金圣士','51':'药剂师', '87':'银色机甲师', '55':'黑暗萨满','56':'噬魂者','59':'灵魂舞者','58':'刀锋舞者','89':'银色舞灵', '63':'烈','64':'影','68':'曜','69':'暗','91':'黑暗修罗', '73':'皇家骑士','74':'魔枪骑士','93':'冰魂术士','94':'火灵术士','99':'黑暗破魔师', '78':'御灵','79':'破风','96':'碎夜','97':'驭光', '102':'斩魄','103':'逐月'}
              #区服代码
              seacode = { '华东电信一区':'1','华南电信一区':'2','华中电信一区':'4','华东电信二区':'5', '全国网通一区':'7','南方电信大区':'18','WEGAME一区1服':'401','WEGAME一区234服':'402','WEGAME二区':'41', 'WEGAME三区':'42'}
              #传递的参数data = { 'PageIndex':'1', 'Pagesize':'5', 'JobCode':'0', 'SeaAreaId':'0', 'PassNum':'0'}
              #爬回的结果
              r = requests.post(url, data = data, headers = headers)


              9楼2020-10-11 13:22
              回复
                下面就是对爬回的结果r进行处理,得到我们想要的数据了
                r的返回值是个response对象,处理方法很多,之前本吧另外一位大神直接存为网页,非常的聪明
                我当时不知道啊,经过一段时间搜索学习,抄了段beautifulsoup的,结果不是少了就是多出一些符号,换行符等等无用的数据
                我又改了半天,最终成了这个样子
                #爬的结果r
                r = requests.post(url, data = data, headers = headers)
                # 先把r里面的text空格都替换掉,然后变成一个json
                c =json.loads(r.text.replace(' ',''))
                #用beautifulsoup库解析这个json
                soup = BeautifulSoup(c['ReturnObject'],'html.paerser')
                #把解析后的结果里面的所有<td>标签提取出来,存成数组,存成数组是为了方便排序
                tdlist = soup.find_all('td')
                <td>标签这个也是搜索了好久,因为服务器的返回值其实是个表格,每条数据,比如ID,公会名字,夕阳层数都是用<td>包围起来的
                至于存成数组,是因为我们爬的过程中为了区分职业和区服,是要把data{}里面的seaareaid,jobecode进行遍历的,这样爬下来的结果就不是总的排行榜,存成数组是因为数组有个排序功能,我们只需按夕阳层数和时间对数组里面的元素进行一下排序就行了


                11楼2020-10-11 13:35
                收起回复
                  最后,我又在网上抄了一段python处理excel的代码,把爬回的数据直接存成excel
                  很简单,一个xlwt库


                  13楼2020-10-11 13:48
                  回复
                    然后我又陆陆续续搞了
                    一堆不同功能的,又抄了pyinstaller把代码打包成一个独立运行的小程序,发布在工会群,可惜没人理我


                    15楼2020-10-11 13:51
                    回复
                      说几句关于爬虫的法律问题
                      有些网站是不允许爬虫的,原因大概有两个,一是爬虫多的话会给服务器很大的负担,浪费服务器资源,二是有些信息是有价值的,可以商用的,你从人家那里偷数据可能造成违法
                      我学request库的时候,那视频老师说过,很多网站会在跟目录那里发布一个robot协议,里面会有说明,什么可以爬,什么不可以
                      至于龙之谷,本来游戏人数也不多,又是游戏排行榜,且我也没有商用,我个人认为是没问题的, 如果有不合规的,请联系我


                      16楼2020-10-11 13:56
                      收起回复