自定义worker的方法,及一例
自定义的worker用于处理各种特殊需求。
有网友想用html_json提取雪球网(https://xueqiu.com/)的数据,可是雪球网用了反爬虫技术,网站要求有cookies才能访问到json文件,否则不让访问。在普通的浏览器上,先访问一下首页就有cookies了。
于是写一个雪球网专用的worker,基本复用html_json。它先访问雪球的首页获取cookies,再用这个cookies访问json文件,然后再把json文件交给html_json的代码处理数据。
写一个worker,只要准备两个函数就可以了:
1、用@worker('xueqiu')装饰的函数是xueqiu的worker,它有两个参数:
- 参数data_dict是保存信息源data内容的字典,也就是驱动worker工作的数据,是由下面那个函数生成的。
- 参数worker_dict也是字典,可以存放一些动态数据,供下次运行此worker时使用。这里没有用到它。
如果在运行worker时出现异常,可以用c_worker_exception(title, url='', summary='')生成一条异常信息,以便更清晰地向用户描述出现的问题,具体方法可参考html_re、html_json。
2、用@dataparser('xueqiu')装饰的函数是xueqiu的xml解析器,它的作用是把信息源xml里的data翻译成一个字典,也就是worker的参数data_dict。有一个参数:
- 参数xml_string是信息源xml文件的完整内容,一个字符串。
把程序以utf-8编码保存为xueqiu.py,放到src/workers目录下,重启程序就可以用了。
实际用法和html_json完全一样,只不过xml里的worker要换成xueqiu。
# coding=utf-8
import urllib.request
from http.cookiejar import CookieJar from worker_manage import worker, dataparser
from . import html_json ua = ('Mozilla/5.0 (Windows NT 6.1; rv:38.0)'
' Gecko/20100101 Firefox/38.0') # 从首页得到cookies
def get_cookies():
# build opener
proxy = urllib.request.ProxyHandler({})
cj = urllib.request.HTTPCookieProcessor(CookieJar())
opener = urllib.request.build_opener(proxy, cj) # request
req = urllib.request.Request('https://xueqiu.com/')
req.add_header('User-Agent', ua) # open
r = opener.open(req) return cj # 下载指定网址
def get_url(cj, url):
# build opener
proxy = urllib.request.ProxyHandler({})
opener = urllib.request.build_opener(proxy, cj) # request
req = urllib.request.Request(url)
req.add_header('User-Agent', ua) # open
r = opener.open(req) ret_data = r.read().decode('utf-8')
return ret_data @worker('xueqiu')
def xueqiu_worker(data_dict, worker_dict):
# 得到cookies
cj = get_cookies() # 用cookies下载指定网址
url = data_dict['url']
string = get_url(cj, url) # 用html_json解析数据
return html_json.parse_html(data_dict, url, string) @dataparser('xueqiu')
def xueqiu_parser(xml_string):
return html_json.html_json_parser(xml_string)
这个worker很简陋,没有考虑网络超时、自动重试,也没有用c_worker_exception生成更清晰的异常信息。
如果用它抓取的是国内金融交易数据,还可以精益求精,加上时间判断,在非交易时段直接返回一个空列表。
自定义worker的方法,及一例的更多相关文章
- (转) ThinkPHP模板自定义标签使用方法
这篇文章主要介绍了ThinkPHP模板自定义标签使用方法,需要的朋友可以参考下 转之--http://www.jb51.net/article/51584.htm 使用模板标签可以让网站前台开发 ...
- [AOP] 6. 一些自定义的Aspect - 方法的重试(Retry)
前面的一系列文章介绍了AOP的方方面面: AOP的由来以及快速上手 AOP的两种实现-Spring AOP以及AspectJ Spring AOP中提供的种种Aspects - Tracing相关 S ...
- jQuery Validate 表单验证插件----自定义一个验证方法
一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW 访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...
- Asp.net MVC4.0自定义Html辅助方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- SharePoint2010 自定义代码登录方法
转:http://yysyb123.blog.163.com/blog/static/192050472011382421717/ SharePoint2010 自定义代码登录方法 (自定义Form验 ...
- Swift中自定义Log打印方法
系统如何调用super方法 系统默认只会在构造函数中,自动调用super.init()方法,而且是在所写方法的尾部进行调用. 在其他函数中,如何需要调用父类的默认实现,都需要手动去实现. 如果在构造函 ...
- 让LINQ中的查询语法使用自定义的查询方法
使用LINQ时有两种查询语法:查询语法和方法语法 查询语法:一种类似 SQL 语法的查询方式 方法语法:通过扩展方法和Lambda表达式来创建查询 例如: List<, , , }; //查询语 ...
- Javascript 中创建自定义对象的方法(设计模式)
Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. var ...
- struts 中自定义action访问方法
struts中action类继承了ActionSupport 默认实现了execute()方法 struts.xml配置文件中 然后可以配置如下映射: <package name =" ...
随机推荐
- Java 接口 interface implements
接口定义了一系列的抽象方法和常量,形成一个属性集合. 接口定义完成后任何类都可以实现接口,而且一个类可以实现多个接口. 实现接口的类必须实现接口中定义的抽象方法,具体实现细节由类自己定义.可以说接口定 ...
- JZ2440 裸机驱动 第13章 LCD控制器(1)
本章目标 了解LCD显示器的接口及时序: 掌握S3C2410/S3C2440 LCD控制器的使用方法: 了解帧缓冲区的概念,掌握如何设置帧缓冲区来显示图像: 13.1 LCD和LCD控制器 13.1 ...
- c#数据类型 与sql的对应关系 以及 取值范围
Short Name .NET Class Type Width Range (bits) SQL Datatype (Closest Match) Constraint to use (if nee ...
- sersync基于rsync+inotify实现数据实时同步
一.环境描述 需求:服务器A与服务器B为主备服务模式,需要保持文件一致性,现采用sersync基于rsync+inotify实现数据实时同步 主服务器A:192.168.1.23 从服务器B:192. ...
- MySQL concat用法举例
concat配合information_schema的应用 1 concat的一般用法主要是用于拼接 示例: 执行语句 SELECT CONCAT('M','y','S','Q','L') 可以 ...
- 第14章 UDP编程(2)_端口绑定和域名解析
2. 端口绑定和域名解析 2.1 端口绑定:SO_REUSEADDR选项 ;//1表示启用该选项 //设置为可重新使用端口,每次启动该端口时,会重新绑定端口.相当于端口被复位并被重新. //绑定.因此 ...
- 提示ORA-01144: File size (13107200 blocks) exceeds maximum of 4194303 blocks 最大4194303 block(转)
并不是100g的表空间,是100g的数据文件.一般情况下,单个数据文件的最大为32g.解决方法:1.创建多个数据文件,都不能超过32g2.创建大表空间.create bigfile tablespac ...
- CSS源码之纯css3制作的哆啦a梦图片
本文章向大家介绍一个纯css3制作的哆啦a梦图像,主要巧妙的使用了css3的border-radius属性,需要的朋友介意参考一下本文章的源码. 效果图: 源码 <!doctype html&g ...
- sencha touch 小米3无法点击问题 修复
修改源码文件夹下event/publisher/Dom.js中的attachListener方法,代码如下 attachListener: function(eventName, doc) { if ...
- for /f命令之—Delims和Tokens用法&总结
在For命令语踞饽参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总拮.“For /f”常用来解析文本,读取字符串.分工上,delims负责切分字符串,而tokens ...