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
下方下载:
bmlord 发表于 2020-5-20 17:17
楼主你好,我想爬三国志的,但是不会用,可以帮我弄一个吗,有偿也行
不用啊,很简单的,去交易猫上可以先搜索一遍,然后把链接的关键数据复制到文件中去,像帖子的动图那样,就可以了 很好的东西收藏了~! 感谢,楼主辛苦了{:1_913:} 感谢分享 感谢分享,学习了 那个行的话点下最佳。谢谢~ vrvree 发表于 2020-5-1 17:05
很好的东西收藏了~!
哪里有新帖 哪里就有水贴大王 楼主666,感谢楼主分享 不错不错。 厉害!很好用
页:
[1]
2