龙之谷吧 关注:2,660,706贴子:93,540,463

夕阳试炼榜 爬虫源码

只看楼主收藏回复

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


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

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


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


      IP属地:上海来自Android客户端3楼2020-10-11 12:46
      回复

        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
              回复
                import numpy as np
                import pandas as pd
                from sklearn .ensemble import randomforestregressor
                剩下的不会了


                IP属地:上海来自Android客户端8楼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
                  回复
                    看不懂看不懂


                    IP属地:广西来自Android客户端10楼2020-10-11 13:25
                    回复
                      下面就是对爬回的结果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
                      收起回复
                        收藏了回头来看


                        IP属地:福建来自Android客户端12楼2020-10-11 13:38
                        回复
                          最后,我又在网上抄了一段python处理excel的代码,把爬回的数据直接存成excel
                          很简单,一个xlwt库


                          13楼2020-10-11 13:48
                          回复
                            还好DN没设置反爬


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


                              15楼2020-10-11 13:51
                              回复