自定义的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的方法,及一例的更多相关文章

  1. (转) ThinkPHP模板自定义标签使用方法

    这篇文章主要介绍了ThinkPHP模板自定义标签使用方法,需要的朋友可以参考下  转之--http://www.jb51.net/article/51584.htm   使用模板标签可以让网站前台开发 ...

  2. [AOP] 6. 一些自定义的Aspect - 方法的重试(Retry)

    前面的一系列文章介绍了AOP的方方面面: AOP的由来以及快速上手 AOP的两种实现-Spring AOP以及AspectJ Spring AOP中提供的种种Aspects - Tracing相关 S ...

  3. jQuery Validate 表单验证插件----自定义一个验证方法

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...

  4. Asp.net MVC4.0自定义Html辅助方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...

  5. SharePoint2010 自定义代码登录方法

    转:http://yysyb123.blog.163.com/blog/static/192050472011382421717/ SharePoint2010 自定义代码登录方法 (自定义Form验 ...

  6. Swift中自定义Log打印方法

    系统如何调用super方法 系统默认只会在构造函数中,自动调用super.init()方法,而且是在所写方法的尾部进行调用. 在其他函数中,如何需要调用父类的默认实现,都需要手动去实现. 如果在构造函 ...

  7. 让LINQ中的查询语法使用自定义的查询方法

    使用LINQ时有两种查询语法:查询语法和方法语法 查询语法:一种类似 SQL 语法的查询方式 方法语法:通过扩展方法和Lambda表达式来创建查询 例如: List<, , , }; //查询语 ...

  8. Javascript 中创建自定义对象的方法(设计模式)

    Javascript 中创建对象,可以有很多种方法. Object构造函数/对象字面量: 抛开设计模式不谈,使用最基本的方法,就是先调用Object构造函数创建一个对象,然后给对象添加属性. var ...

  9. struts 中自定义action访问方法

    struts中action类继承了ActionSupport  默认实现了execute()方法 struts.xml配置文件中 然后可以配置如下映射: <package name =" ...

随机推荐

  1. bzoj 3611(洛谷 4103) [Heoi2014]大工程——虚树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3611 https://www.luogu.org/problemnew/show/P4103 ...

  2. 【jmeter】jmeter之“参数化”

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  3. session 、cookie、token的区别

    session session的中文翻译是“会话”,当用户打开某个web应用时,便与web服务器产生一次session.服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后sess ...

  4. Git 查询某次历史提交的修改内容

    在工作时,有时候想查看某次的提交修改了哪些的内容. 我们首先可以git log显示历史的提交列表: 之后我们用git show <commit-hashId> 便可以显示某次提交的修改内容 ...

  5. 第14章 UDP编程(1)_UDP客户端服务器模型

    1. UDP编程模型 (1)UDP客户端服务器模型 ①客户端可以不调用bind()而直接与服务器通讯. ②UDP是无连接的,因此服务端不需要调用accept和listen,客户端也无需调用connec ...

  6. java开发-问题清单

    本人是做Java开发的,这是我参加58,搜狐,搜狗,新浪微博,百度,腾讯文学,网易以及其他一些小的创业型公司的面试常被问的问题,当然有重复,弄清楚这些 1. junit用法,before,before ...

  7. 折腾了几个小时,分享下zendstudio10的git使用

    今天打开zend10,发现新建项目的地方有 from git,from github,就试了试,发现可以导出,也可以commit,但是没办法push. 就百度百度,发现zendstudio10的git ...

  8. 15.python操作mysql

    导入包 from pymysql import* 1. 创建 Connection 连接 conn=conne(host='192.168.13.130',port=3306 ,database='' ...

  9. OpenCL + OpenCV 图像旋转

    ▶ 使用 OpenCV 从文件读取彩色的 png 图像,旋转一定角度以后写回文件 ● 代码,核函数 // rotate.cl //__constant sampler_t sampler = CLK_ ...

  10. 手动控制IIS Express的两个常用方法

    由于VS在开发WEB应用程序时,每次都需要重新启动IIS Express,速度太慢了,如果改为手动控制IIS Express启动,那么可以直接编译应用程序后,直接刷新页面,那么速度会更快. 因此需要常 ...