吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4563|回复: 13
收起左侧

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

[复制链接]
cnff 发表于 2020-5-1 17:03
本帖最后由 cnff 于 2020-5-1 20:58 编辑

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

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

[Python] 纯文本查看 复制代码
# -*- 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()[1]
            if res == '卖家店铺':
                raise Exception('请换个关键词,这个关键词暂不支持!')
            res = sel.xpath('//div[@class="mod-page"]/text()').extract()[2].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()


        代码结构,如下面图所示

代码结构.png


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

示例1.gif

        搜索到了 346 个数据

示例1.png




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

链接分析.png

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

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

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

示例2.gif



使用:
        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 文件,添加下面这两条语句,因为是在本地访问的,会有跨域问题


[Plain Text] 纯文本查看 复制代码
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 的强大搜索了
        
        这里我写了个简易页面模版和功能,也是我目前用到一些功能,如下图所示

页面.png


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

搜索.gif


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

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



下方下载:
       fgo_scrapy.rar (124.86 KB, 下载次数: 80)


免费评分

参与人数 4吾爱币 +9 热心值 +4 收起 理由
853679185 + 2 + 1 我很赞同!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
涛之雨 + 1 + 1 elasticsearch学到了,自用很香啊23333
PLANET + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

不用啊,很简单的,去交易猫上可以先搜索一遍,然后把链接的关键数据复制到文件中去,像帖子的动图那样,就可以了
vrvree 发表于 2020-5-1 17:05
zxzww 发表于 2020-5-1 17:07
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
厉害!很好用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-3 04:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表