好友
阅读权限10
听众
最后登录1970-1-1
|
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()
代码结构,如下面图所示
示例:
爬取关键字 "迦摩"
链接 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 文件,添加下面这两条语句,因为是在本地访问的,会有跨域问题
[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 的强大搜索了
这里我写了个简易页面模版和功能,也是我目前用到一些功能,如下图所示
示例:搜索 "五宝迦摩",并且等级大于110小于140级的,看有没有符合的
如果页面上的功能比较简单,如果你需要复杂搜索或者其他方式搜索,你可以直接使用 elasticsearch api 来检索,elasticsearch 是一款很强大的开源搜索引擎
终于写完了,我觉得这样爬取在筛选比官网搜索更快找到符合自己的商品,希望这个 python 爬取对你有帮助,让我们愉快的爬取吧,不知官网什么失效的说...
下方下载:
fgo_scrapy.rar
(124.86 KB, 下载次数: 86)
|
免费评分
-
参与人数 4 | 吾爱币 +9 |
热心值 +4 |
收起
理由
|
853679185
| + 2 |
+ 1 |
我很赞同! |
苏紫方璇
| + 5 |
+ 1 |
欢迎分析讨论交流,吾爱破解论坛有你更精彩! |
涛之雨
| + 1 |
+ 1 |
elasticsearch学到了,自用很香啊23333 |
PLANET
| + 1 |
+ 1 |
谢谢@Thanks! |
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|