公司有个爬取的需求,要求持续性爬取,需要永久性地挂载到目标网站上,每天爬一次里面的数据。数据有下载表格的,我通过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自动化的更多相关文章

  1. 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)

    1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...

  2. Web服务器-并发服务器-协程 (3.4.2)

    @ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...

  3. Python用yield form 实现异步协程爬虫

    很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习. 争取用看得懂的字来描述问题. 1.什么是yield 如果还没有怎么用过的话,直接把yield看做成一种特殊 ...

  4. python爬虫--多任务异步协程, 快点,在快点......

    多任务异步协程asyncio 特殊函数: - 就是async关键字修饰的一个函数的定义 - 特殊之处: - 特殊函数被调用后会返回一个协程对象 - 特殊函数调用后内部的程序语句没有被立即执行 - 协程 ...

  5. 用python实现自己的http服务器——多进程、多线程、协程、单进程非堵塞版、epoll版

    了解http协议 http请求头 GET / HTTP/1.1 Host: www.baidu.com Connection: keep-alive Pragma: no-cache Cache-Co ...

  6. Swoole 中使用 TCP 异步服务器、TCP 协程服务器、TCP 同步客户端、TCP 协程客户端

    TCP 异步风格服务器 异步风格服务器通过监听事件的方式来编写程序.当对应的事件发生时底层会主动回调指定的函数. 由于默认开启协程化,在回调函数内部会自动创建协程,遇到 IO 会产生协程调度,异步风格 ...

  7. python 并发专题(六):协程相关函数以及实现(gevent)

    文档资源 http://sdiehl.github.io/gevent-tutorial/ 一.协程实现 线程和协程 既然我们上面也说了,协程也被称为微线程,下面对比一下协程和线程: 线程之间需要上下 ...

  8. 什么是协程?与线程和进程对比优劣在哪?gevent协程示例代码

      协程 协程,又称微线程,纤程.英文名Coroutine..一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在 ...

  9. concurrent.futures进线程池和协程

    concurrent.futures 异步执行进程线程池的模块,一个抽象类,定义submit,map,shutdown方法 from concurrent.futures import Process ...

  10. Python学习---协程 1226

    协程[是一个单线程],又称微线程,纤程.英文名Coroutine. 一句话说明什么是协程:协程是一种用户态的轻量级线程[程序员自己去切换线程] 协程条件: 必须在只有一个单线程里实现并发 修改共享数据 ...

随机推荐

  1. Java Web中requset,session,application 的作用域及区别

    三者概述 requset概述: request是表示一个请求,只要发出一个请求就会创建一个request 用处:常用于服务器间同一请求不同页面之间的参数传递,常应用于表单的控件值传递. session ...

  2. x=x+=x-=x-x;

    int x=10; x=x+=x-=x-x; // x=x+(x-(x-x)) System.out.println(x); 输出结果20

  3. 【Shell案例】【awk匹配、grep查找文件内的字符串】6、去掉空行(删除空行)

    描述写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行示例:假设 nowcoder.txt 内容如下:abc 567 aaabbb ccc 你的脚本应当输出:abc567aaab ...

  4. 5V升压12.6V

    产品概述 PW4053 是一款 5V 输入,最大 1.2A 充电电流,支持三节锂离子电池的升压充电管理 IC.PW4053 集成功率 MOS,采用异步开关架构,使其在应用时仅需极少的外围器件,可有效减 ...

  5. 深入浅出OSI七层参考

    本篇博客是笔者阅读<图解TCP/IP>所记录下的笔记,有兴趣的朋友可以去看一看这本书. OSI七层参考模型 ​ 本小节以电子邮件通信为例,分别来阐述OSI七层模型的每一层是如果进行通信处理 ...

  6. SQL语句使用

    目录 一:sql语句 1.什么是SQL语句? 二:基本SQL语句之库操作 三:基本SQL语句之表操作 1.查看当前所在库名称 2.切换数据库 四:基本SQL语句之记录操作 五:创建表的完整语法 六:操 ...

  7. 如何5分钟上手使用PaddleSeg人像抠图

    随便打开一个Microsoft Visual Studio,新建一个WinForms项目,从下面列表中随便选择一个NET框架. net35;net40;net45;net451;net452;net4 ...

  8. Mybatis-9.28

    Mybatis-9.28 环境: JDK1.8 Mysql 5.7 maven 3.6.1 IDEA 回顾: JDBC Mysql Java基础 Maven Junit SSM框架:配置文件的. 最好 ...

  9. Python从0到1丨细说图像增强及运算

    摘要:本文主要讲解常见的图像锐化和边缘检测方法,即Roberts算子和Prewitt算子. 本文分享自华为云社区<[Python从零到壹] 五十七.图像增强及运算篇之图像锐化Roberts.Pr ...

  10. 旋转卡壳(求凸包直径)学习笔记 | 题解 P1452 [USACO03FALL]Beauty Contest G /【模板】旋转卡壳

    前言 旋转卡壳(Rotating Calipers)可以在凸包上维护许多有用的信息,最常见的就是凸包直径(平面最远点对). 注意:本文不介绍所谓的 "人类智慧" 乱搞做法. 算法流 ...