cnff 发表于 2020-5-1 17:03

Python 爬取交易猫上的 Fate/Grand Order 手游账号搜索

本帖最后由 cnff 于 2020-5-1 20:58 编辑

前言:
      最近想在交易猫上搜索 fgo 手游账号,发现他的搜索不是很好找出我想要的,就想通过 python 爬取,然后进行二次搜索出看有没有符合的
      例如,我想筛选标题为 "迦摩",并且等级大于110小于140级的,就比较难直接找出来,得要一个一个去看,然后还要翻页去找,看有没有符合条件的
      于是就通过 python 对原数据进行爬取,在这个基础上进行二次搜索筛选,花了点时间写了下

代码:
      使用了python scrapy 框架爬取,基于 elasticsearch的检索
      这里贴上部分代码

# -*- coding: utf-8 -*-
import re
from urllib import parse

import scrapy
import requests
from scrapy import Selector
from scrapy.loader import ItemLoader

from fgo_scrapy.items import FgoScrapyItem

'''
    # 示例链接
    https://www.jiaoyimao.com/g4514-c1476177217117636/s安卓服务器-r8.html?keyword=迦摩
   
'''

# 生成请求参数
kwargs = {
    'gameId': '4514',
    'categoryId': '1476177217117636',
    'server': '安卓服务器',
    'sortingType': 'r8',
    'keyword': '迦摩'
}


class FgoSpider(scrapy.Spider):
    name = 'fgo'
    allowed_domains = ['jiaoyimao.com']
    start_urls = ['https://www.jiaoyimao.com/']

    def start_requests(self):
      # 获取请求参数
      global kwargs
      gameId = kwargs.get('gameId')
      categoryId = kwargs.get('categoryId')
      server = parse.quote(kwargs.get('server'))
      sortingType = kwargs.get('sortingType')
      keyword = parse.quote(kwargs.get('keyword'))

      # 解析请求网址
      try:
            sel = Selector(text=requests.get('https://www.jiaoyimao.com/g' + gameId + '-c' + categoryId + '/s' + server + '-' + sortingType + '.html?keyword=' + keyword).text)
            res = sel.xpath('//div[@class="breadcrumb"]/a/text()').extract()
            if res == '卖家店铺':
                raise Exception('请换个关键词,这个关键词暂不支持!')
            res = sel.xpath('//div[@class="mod-page"]/text()').extract().strip()
            if res != '':
                num = int(re.search(r'共(\d+)页', res).group(1))
            else:
                num = 1
      except Exception as e:
            raise Exception('发生错误,需要检查 fgo.py 文件相关代码,错误如下 : {}'.format(e.args))

      # 返回请求网址
      for i in range(1, num + 1):
            url = 'https://www.jiaoyimao.com/g' + gameId + '-c' + categoryId + '/s' + server + '-' + sortingType + '-n' + str(
                i) + '.html?keyword=' + keyword
            yield scrapy.Request(url)

    def parse(self, response):
      # 装填内容
      itemLoader = ItemLoader(item=FgoScrapyItem(), response=response)
      itemLoader.add_xpath('limitGoodsId', '//input[@id="limitGoodsId"]/@value')
      itemLoader.add_xpath('name', '//span[@class="is-account"]/a/text()')
      itemLoader.add_xpath('link', '//span[@class="is-account"]/a/@href')
      itemLoader.add_xpath('price', '//span[@class="price"]/text()')
      itemLoader.add_xpath('bargain', '//span[@class="link"]/text()')

      # 返回装填
      return itemLoader.load_item()


      代码结构,如下面图所示




示例:
      爬取关键字 "迦摩"
      链接https://www.jiaoyimao.com/g4514-c1476177217117636/s安卓服务器-r8.html?keyword=迦摩



      搜索到了 346 个数据






分析:
      关于链接分析,有几个地方的数据可以填写,这样就可以组成一个关键词搜索链接,如下图所示



      关于链接中的 "r8" 排序含义,也几个选项,可以去对照一下他们的链接,我直接把选项列出来吧

{
"r8": "按综合排序",
"r1": "按时间倒序",
"r2": "按单价高到低排序",
"r3": "按价格高到低排序",
"r4": "按价格低到高排序"
}

      其他的就比较简单,就不一 一说了
      
      我尝试了一下,其实也不是只能搜索 fgo 手游账号,其他的也可以搜索,我试了一下 碧蓝航线 手游,也可以搜索成功,因为他们的链接组成差不多,你可以尝试一下
      示例:碧蓝航线,搜索关键字 "双彩"





使用:
      1. 安装依赖包(PS: 这里 scrapy 如果安装失败的话,网上搜索一下解决方案吧,因为错误不一样,可能没法提供一个统一的)
            pip scrapy requests elasticsearch

      2. elasticsearch 和 ik 分词插件下载和配置(我用的是 windows 版的)
            es 下载地址https://www.elastic.co/cn/downloads/elasticsearch

            ik 下载地址https://github.com/medcl/elasticsearch-analysis-ik/releases ,下载后新建文件夹名 ik,解压放到里面,然后将文件夹移到 elasticsearch plugins 文件夹里即可

            配置允许跨域访问,找到 elasticsearch.yml 文件,添加下面这两条语句,因为是在本地访问的,会有跨域问题


http.cors.enabled: true
http.cors.allow-origin: "*"

            然后启动 elasticsearch,启动文件在 bin\elasticsearch.bat


      3. 下载附件的源代码,编写要搜索的关键字,准备爬取
            编辑的文件在:fgo_scrapy\fgo_scrapy\spiders\fgo.py
            像上面的动图那样


      4. 运行,进入 fgo_scrapy\fgo_scrapy 文件夹里,打开 cmd 控制台执行 python main.py语句即可

      5. 搜索,找到位于fgo_scrapy\search\search.html 的文件


搜索:
      重点来了,当完成爬取数据后,接下来就是基于 elasticsearch 的强大搜索了
      
      这里我写了个简易页面模版和功能,也是我目前用到一些功能,如下图所示




      示例:搜索 "五宝迦摩",并且等级大于110小于140级的,看有没有符合的




      如果页面上的功能比较简单,如果你需要复杂搜索或者其他方式搜索,你可以直接使用 elasticsearch api 来检索,elasticsearch 是一款很强大的开源搜索引擎

      终于写完了,我觉得这样爬取在筛选比官网搜索更快找到符合自己的商品,希望这个 python 爬取对你有帮助,让我们愉快的爬取吧,不知官网什么失效的说... :lol



下方下载:
      


cnff 发表于 2020-5-20 21:12

bmlord 发表于 2020-5-20 17:17
楼主你好,我想爬三国志的,但是不会用,可以帮我弄一个吗,有偿也行

不用啊,很简单的,去交易猫上可以先搜索一遍,然后把链接的关键数据复制到文件中去,像帖子的动图那样,就可以了

vrvree 发表于 2020-5-1 17:05

很好的东西收藏了~!

zxzww 发表于 2020-5-1 17:07

感谢,楼主辛苦了{:1_913:}

vethenc 发表于 2020-5-1 17:09

感谢分享

hmily65 发表于 2020-5-1 17:09

感谢分享,学习了

vrvree 发表于 2020-5-2 09:16

那个行的话点下最佳。谢谢~

棕熊哒哒 发表于 2020-5-2 09:28

vrvree 发表于 2020-5-1 17:05
很好的东西收藏了~!

哪里有新帖 哪里就有水贴大王

weilaikeji007 发表于 2020-5-3 19:55

楼主666,感谢楼主分享

飘浮 发表于 2020-5-4 08:42

不错不错。

853679185 发表于 2020-5-18 10:33

厉害!很好用
页: [1] 2
查看完整版本: Python 爬取交易猫上的 Fate/Grand Order 手游账号搜索