flask服务器 + 协程 + 爬虫 + ui自动化
公司有个爬取的需求,要求持续性爬取,需要永久性地挂载到目标网站上,每天爬一次里面的数据。数据有下载表格的,我通过ui自动化点击拿到数据;还有一部分数据是几乎所有的图片信息,信息量近百万,这部分用scrapy。最后,决定什么时候爬取,爬取哪一天的,要通过请求来处理,所以需要搭建一个服务器,这个我用的flask。开始服务器监听,同时启动ui自动化挂载,这个用到协程。
一.flask + 协程
总的逻辑在这里。
from gevent import monkey
monkey.patch_all()
from spy_oo.spiders.oo_ui import UI
import queue
from flask import Flask, request
import gevent
from scrapy import cmdline que = queue.Queue() def ui():
op = UI()
while True:
if not que.empty():
k_v = que.get().split("=")
if len(k_v) == 2:
type_, date_ = k_v
else:
type_, date_ = '', ''
print("爬取类型为:%s,日期为:%s" % (type_, date_))
if "spy" in type_:
print("爬取中...")
cmdline.execute('scrapy crawl oppo'.split())
elif "dow" in type_:
print("下载中...")
op.download()
else:
op.hang_out() def server():
app = Flask(__name__) @app.route("/***")
def logic1():
arg = str(request.query_string, encoding="utf-8")
if arg:
que.put(arg)
else:
arg = 'query string missing, exp:dow=12'
return str(arg) app.run(debug=True, use_reloader=False) if __name__ == '__main__':
g1 = gevent.spawn(ui)
g2 = gevent.spawn(server)
g1.join()
g2.join() # server = pywsgi.WSGIServer(('127.0.0.1', 5000), app.run(debug=True))
# server.serve_forever()
二. 分-爬虫
scrapy爬取。这是spider的部分,也是爬取的核心代码。
import scrapy
import json
from jsonpath import jsonpath
from . import url, data, oppo_cookies, service_id
from ..items import SpyOoItem class Spider(scrapy.Spider):
"""
default data
"""
name = '***'
allowed_domains = ['***']
start_urls = ['***', ] def start_requests(self):
"""
get response
"""
for s_id in service_id.values():
data["service_id"] = str(s_id)
yield scrapy.FormRequest(
url=url,
formdata=data,
cookies=oppo_cookies,
callback=self.parse
) def parse(self, response):
"""
parse the message from response
""" # extract message from response
s = json.loads(response.text)
name_ = jsonpath(s, '$..list[0].service_name')[0]
pics_id = jsonpath(s, '$..list[*].pic_info[0].magazine_id')
pics_name = jsonpath(s, '$..list[*].magazine_name')
play_start_time = jsonpath(s, '$..list[*].play_start_time')
create_time = jsonpath(s, '$..list[*].pic_info[0].create_time') # mapping the value and yield it
for a, b, c, d in zip(pics_id, pics_name, play_start_time, create_time):
item = SpyOppoItem()
item["service_name"] = name_
item["id"] = a
item["name"] = b
item["play_time"] = c
item["upload_time"] = d
yield item
三. 分-ui自动化
界面的爬取用ui自动化,全用seliky库完成,由于标签元素属于目标网站的信息,不便于展示,这部分较简单,相信大家都会。可以在我的自动化的专栏里学seliky的操作。
flask服务器 + 协程 + 爬虫 + ui自动化的更多相关文章
- 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)
1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...
- Web服务器-并发服务器-协程 (3.4.2)
@ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...
- Python用yield form 实现异步协程爬虫
很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习. 争取用看得懂的字来描述问题. 1.什么是yield 如果还没有怎么用过的话,直接把yield看做成一种特殊 ...
- python爬虫--多任务异步协程, 快点,在快点......
多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 ...
- 用python实现自己的http服务器——多进程、多线程、协程、单进程非堵塞版、epoll版
了解http协议 http请求头 GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Pragma: no-cache Cache-Co ...
- Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端
TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...
- python 并发专题(六):协程相关函数以及实现(gevent)
文档资源 http://sdiehl.github.io/gevent-tutorial/ 一.协程实现 线程和协程 既然我们上面也说了,协程也被称为微线程,下面对比一下协程和线程: 线程之间需要上下 ...
- 什么是协程?与线程和进程对比优劣在哪?gevent协程示例代码
协程 协程,又称微线程,纤程.英文名Coroutine..一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在 ...
- concurrent.futures进线程池和协程
concurrent.futures 异步执行进程线程池的模块,一个抽象类,定义submit,map,shutdown方法 from concurrent.futures import Process ...
- Python学习---协程 1226
协程[是一个单线程],又称微线程,纤程.英文名Coroutine. 一句话说明什么是协程:协程是一种用户态的轻量级线程[程序员自己去切换线程] 协程条件: 必须在只有一个单线程里实现并发 修改共享数据 ...
随机推荐
- 第2-4-4章 规则引擎Drools规则属性-业务规则管理系统-组件化-中台
目录 5. 规则属性 5.1 enabled属性 5.2 dialect属性 5.3 salience属性 5.4 no-loop属性 5.5 activation-group属性 5.6 agend ...
- PGL图学习之图神经网络ERNIESage、UniMP进阶模型[系列八]
PGL图学习之图神经网络ERNIESage.UniMP进阶模型[系列八] 原项目链接:fork一下即可:https://aistudio.baidu.com/aistudio/projectdetai ...
- 痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制. 痞子衡之前写过一篇文章 <MCUXpresso I ...
- mybatis sql批量插入
insert into jrqf_officialcard (id, budget_unit, money_purpose, economic_type, money, func_subject_na ...
- 【Java SE进阶】Day10 缓冲流、转换流、序列化流 、打印流
一.缓冲流 1.概述 比普通流更强大的IO流,可以增加读写的效率 组成 缓冲输入流:BufferedInputStream.BufferedReader 缓冲输出流:BufferedOutputStr ...
- TinyShell(CSAPP实验)
简介 CSAPP实验介绍 学生实现他们自己的带有作业控制的Unix Shell程序,包括Ctrl + C和Ctrl + Z按键,fg,bg,和 jobs命令.这是学生第一次接触并发,并且让他们对Uni ...
- TypeScript 之 Class
class private 和 # 的区别 前缀 private 只是TS语法,在运行时不起作用,外部能够访问,但是类型检查器会报错 class Bag { private item: any } 修 ...
- NeurIPS 2022:基于语义聚合的对比式自监督学习方法
摘要:该论文将同一图像不同视角图像块内的语义一致的图像区域视为正样本对,语义不同的图像区域视为负样本对. 本文分享自华为云社区<[NeurIPS 2022]基于语义聚合的对比式自监督学习方法&g ...
- Hadoop详解(05) – MapReduce
Hadoop详解(05) – MapReduce MapReduce概述 定义 MapReduce是一个分布式运算程序的编程框架,是用户 "基于Hadoop的数据分析应用" 开发的 ...
- [cocos2d-x]捕鱼达人炮台射击角度的旋转实现
话不多说,先上图,下面是实现代码(在后面会具体讲解实现过程): //第一步:将炮台的坐标转换为世界坐标下的坐标点 CCPoint location = this->getParent()-> ...