PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台 - yunfanfan/Notes GitHub Wiki
1
前言
本系列文章只做自用,具体功能实现未考虑所有情况,只做抛砖引玉之用。如有无法正常使用,请依据源码配合文章讲解自行修改。
涉及技术 python爬虫实战 python爬虫最佳实践 Android爬虫 Android自动化
需求
做一个光速捡垃圾的响应平台,后期可以做出自动下单等功能。
- 1.无需盯住自动提示
- 2.设置价格品类 智能推送
- 3.响应时间不超过30s
二手平台选择调研
平台选择
集中来看 二手市场中品类多 用户多的只有闲鱼 转转 还有 爱回收 算是比较大的。其他的要么用户量太少 要么平台太单一没有收集价值。
平台选择 闲鱼 转转
数据来源就是 闲鱼爬虫数据采集 转转爬虫数据采集了
数据来源
数据来源 主要来自两大平台的 网页/app/微信小程序
其中闲鱼网页和小程序都没有 只有app 其中转转 有小程序 也有app
- 爬取闲鱼数据来源:闲鱼app
- 爬取转转数据来源:转转app 转转小程序
有了爬取闲鱼 爬取转转的数据后,后面的事情就简单了。无论我们是直接推送还是保存浏览,甚至做出一个闲鱼网页版入口,转转网页版入口,闲鱼pc版入口,转转pc版入口都行。
技术架构与选型
流程图
先来张粗略的流程图
技术选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R1XP8jol-1609855299627)(https://cdn.huruwo.top/shuju.png?sign=c0064093e164f2069ca4fb215db9c799&t=5ff57562)]
编程语言python 做爬虫部分 编程语言python 做逻辑判断部分 数据储存 初期使用sqlite即可 编程语言python 做消息推送
最终实现效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADH2l5Uc-1609855299630)(https://cdn.huruwo.top/122316342511_0IMG_20201223_155958.png?sign=3d9aba3c3238c3c49c48ebf02c4c785e&t=5ff57650)]
总结
整个架构算是搭起来了,后面就是进入实战部分。 关于这部分我要把代码整理了,如果有需要的可以先点赞关注我。 我会把整个代码流程放出来一起探讨接下来的可能性,如果没人感兴趣那就算了。 起来了,后面就是进入实战部分。 关于这部分我要把代码整理了,如果有需要的可以先点赞关注我。 我会把整个代码流程放出来一起探讨接下来的可能性,如果没人感兴趣那就算了。
本项目源码已经上传:https://github.com/HuRuWo/PickUpTrash
2
3
本章内容
本章讲解关于fidder数据包转发的问题,也就是拦截了数据之后如何将想要的数据推到指定的数据库做处理。
FidderScript的说明和使用
FidderScript是什么
FidderScript是Fidder针对数据包的请求 回复 修改的脚本语言。通过使用FidderScript编写脚本插入可以完成自动化的 请求修改 转发 回复 修改操作。可以说功能非常强大,喜欢数据采集的人必学。
FidderScript的语法
官方文档: http://fiddler2.com/r/?fiddlerscriptcookbook
其实不用去看官方文档 左边的classview 已经包含了所有的api文档 看看就行
下面说几个常用的类方法:
-
Session 所有请求信息/回复信息的保存处 包括request response都可以做修改。比较核心的一个类方法对象。
-
HTTPRequestHeaders 和 HTTPResponseHeaders headers 的映射类 在Session 提取出来可以做修改变化。
-
关于Fidder 软件本身的一些FidderApplication类方法 比如修改UI的 按钮等 ,甚至可以定制化出来一个自动化工具。这个就不细说了,看看就知道了。
个人感觉这个语言非常类似于java,有对象有类。学习起来并不要多少成本。但是他的功能确实非常强大。
FidderScript一个简单的例子
体验一下一个脚本的完整开发过程。
进入脚本编辑器
两种办法:
方法1.
点击进入FidderScript
展开类图:点击ClassView
如果做了修改点击:Save Script 保存脚本
应用脚本
方法2.
Click Rules > Customize Rules
Rules…Enter FiddlerScript code inside the appropriate function.
Save the file.
推荐第二种方式进入脚本编辑器
修改一下request url
跳转到指定的代码 块和方法体 点击goto 下拉框里选择点击
进入OnBeforeRequest
static function OnBeforeRequest(oSession: Session) {
......
......
......
}
所有的 request信息包含在oSession里面
比如我们做一个 知乎转到百度的重定向
if(oSession.fullUrl.Equals("https://www.zhihu.com/"))
{
oSession.fullUrl = "https://www.baidu.com/";
}
保存运行一下:
神奇的从知乎跳转到了百度了
整个过程非常轻松。
FidderScript 转存闲鱼数据
数据转存的数据存储问题
1.存在本地还是存在云端
2.是否需要搭建一个后端系统处理数据
3.数据如何显示到页面
解决方案
存在云端本地都行,但是搭建一个后台系统非常有必要。
提供一个数据提交的接口做数据提供和数据处理的分离方案。
显示和处理在后台系统(web系统里即可) 处理出来的数据。关于后台系统的搭建后面的文章会介绍,这里假设已经搭建成功。
后台数据接收系统
数据提交接口假设为: http://127.0.0.1:8000/xianyu/ 数据提交方式为 POST 数据直接提交原始数据即可,尽量把逻辑处理放在后台
先开启服务:
编写转发脚本
因为闲鱼的测试机子不在身边 暂时先用转发抖音的数据为例子
打开抖音 抓取一下橱窗的商品列表链接
https://api5-normal-c-lf.amemv.com/aweme/v1/promotion/user/promotion/list/?user_id=54512396382&sec_user_id=MS4wLjABAAAAa54-WneSWxYZ24J_00iS-9SwMQkrM3fOYK_sXDYG-lg&cursor=0&count=20&column_id=0&goods_type=0&shop_version=1&storage_type=0&manifest_version_code=110601&_rticket=1611199065509&app_type=normal&iid=17186708527928&channel=meizu&device_type=M1852&language=zh&cpu_support64=true&host_abi=armeabi-v7a&uuid=86908603665928&resolution=1080*2124&openudid=9c8e3e9910b351a8&update_version_code=11609900&cdid=a5182ee3-c5b7-44b9-830f-71ca10dd4b60&os_api=27&mac_address=D8%3A6C%3A02%3AC9%3AB5%3A58&dpi=480&ac=wifi&device_id=70532699303&mcc_mnc=46001&os_version=8.1.0&version_code=110600&app_name=aweme&version_name=11.6.0&device_brand=Meizu&ssmix=a&device_platform=android&aid=1128&ts=1611199065
脚本转发数据包 核心代码:
static function OnBeforeResponse(oSession: Session) {
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
}
if (oSession.fullUrl.Contains("/promotion/user/promotion/list/"))
{
oSession.utilDecodeResponse();//消除保存的请求可能存在乱码的情况
//把内容通过ajax http发送其它地方
var _xhr = new ActiveXObject('Microsoft.XMLHTTP');
var url = 'http://127.0.0.1:8000/xianyu';
//发送的数据参数
var param = oSession.GetResponseBodyAsString()
//不需要返回值所以写啦个空回调
_xhr.onreadystatechange = function() {}
_xhr.open('POST', url, true);
_xhr.setRequestHeader("Content-Type", "application/json");
_xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
_xhr.send(param);
}
}
测试数据接收
点击手机 打开橱窗
api服务器成功获得数据
总结
最后说明一下
autoResponder仅仅只是替换返回包功能 没有修改和保存数据包的功能,以开始我跑偏了。
FidderScript则是一个强大的工具 只有掌握了FidderScript 才能算是真正的掌握了整个Fidder这个软件。
4
本章内容
之前已经做完了闲鱼数据采集的提交和转发,但是整个闲鱼爬虫系统才刚刚开始。
这一章节介绍核心的服务器部分,作为处理和任务分发中心。服务器的任务主要有以下几大任务。
数据存储
首先编写一个接收传输过来数据的接口
@app.route('/goods', methods=['POST'])
async def index(request):
"""
商品数据提交接口
:param request:
:return:
"""
print(request.json)
return text('提交成功')
12345678910
直接传输到数据库保存
关于数据库的选型我这里不强调 为了让大家看清数据的存储。我直接使用sqlite,非常的轻便。
1.设计sql表字段 我只关心价格 内容 产品名字 2.编写保存 查询等语句
新增文件 data_save.py
创建表语句
self.c.execute('''CREATE TABLE XIANYU_GOODS (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, NAME TEXT NOT NULL, PRICE FLOAT NOT NULL, ADDRESS CHAR(50), DESCRIBE CHAR(150), OTHER CHAR(100));''')
print("Table created successfully")
self.conn.commit()
123
插入 查询等
太多就不一一例举了
def insert_data(self,name,price,address,describe,other):
sql_ = f"INSERT INTO XIANYU_GOODS (NAME,PRICE,ADDRESS,DESCRIBE,OTHER) VALUES ({name}, {price}, {address}, {describe},{other})"
self.c.execute(sql_)
self.conn.commit()
print("Insert data successfully")
12345
推荐使用SQLiteStudio 推荐使用它来管理sqlite3文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y9ppdzdU-1611630169048)(https://www.huruwo.top/wp-content/uploads/2021/01/Image2-300x168.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rUx7BnsO-1611630169055)(https://www.huruwo.top/wp-content/uploads/2021/01/Image-300x136.png)]
接口处理数据接收 保存
数据处理
数据保存
@app.route('/goods', methods=['POST'])
async def index(request):
"""
商品数据提交接口
:param request:
:return:
"""
data = request.json
# name,price,address,describe,other
name = data.get('name')
price = data.get('price')
address = data.get('address')
describe = data.get('describe')
other = data.get('other')
sql_util.insert_data(name, price, address, describe, other)
return text('提交成功')
12345678910111213141516
其他的数据处理就不再赘述
包括数据的排序 二次清洗 一些统计 等等功能。我就不再赘述了。说起来也繁琐,但是每个人的要求都不一样。
只要按步骤添加接口对外开放就行。
任务录入和任务分发 可选项
关于任务录入和任务分发和分发这一点,我认为是一个可选项。如果你观察的商品分类非常明确,可以不必做这个功能,但是如果你需要非常高的实时性去更换任务类型,那就可以做个任务录入分发。
录入系统
需要做个后台的界面 也就是前端的输入页面 关于这点我后面在界面编写这一块探讨。
录入的数据 简单设置为 搜索关键字 也就是要搜索哪种数据
task_queue = queue.Queue(maxsize=400000)
@app.route('/task', methods=['POST'])
async def index(request):
"""
提交任务
:param request:
:return:
"""
data = request.json
task_queue.put(data.get('task'))
return text('提交成功')
12345678910111213
分发系统
分发系统可以做个轮询 手机方面轮询请求任务的分发,后台对于录入的关键字做分发。
如果手机真的很多的话,需要做手机编号处理。
@app.route('/task', methods=['GET'])
async def index(request):
"""
提取任务
:param request:
:return:
"""
return task_queue.get()
123456789
消息提醒功能
假设我们在不断的处理数据过程中,发现了一个中意的商品需要光速去购买。
我们可能需要直接提示自己去跳转:
以企业微信为例子:
企业微信拉群,创建提醒机器人,获取token:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U6Y8XGZG-1611630169058)(https://www.huruwo.top/wp-content/uploads/2021/01/Image3-300x291.png)]
def __send(api, msg, ats):
"""
发送消息到企业微信机器人
"""
body = {
'msgtype': 'text',
'text': {
'content': msg + ' ['+time_util.get_now_str() + ' ' + threading.current_thread().getName() + ']',
'mentioned_list': ats
}
}
r = requests.post(api, data=json.dumps(body, ensure_ascii=False).encode(), headers={'Content-Type': 'application/json;charset=utf-8'})
return r.text
12345678910111213
比如发送消息给自己:
_send(API_HOOK_L, '你有新的垃圾可以 复制链接打开闲鱼即可前往'
, ['l])
12
收到消息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jcgpqOdB-1611630169061)(https://www.huruwo.top/wp-content/uploads/2021/01/Image4-300x26.png)]
总结
本次的服务器部分到这里了,其实不算完事。因为还有一些界面的东西 包括对于闲鱼数据收集之后 闲鱼数据爬虫等部分的内容都要深入分析。