自定义worker的方法,及一例

news/2024/7/19 9:28:15 标签: json, python, 爬虫

自定义的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生成更清晰的异常信息。

如果用它抓取的是国内金融交易数据,还可以精益求精,加上时间判断,在非交易时段直接返回一个空列表。

转载于:https://www.cnblogs.com/infopi/p/6269445.html


http://www.niftyadmin.cn/n/1045235.html

相关文章

IOS实现视频直播-RTMP协议的一些参考资料

转自:http://m.blog.csdn.net/blog/kyo7552/16996735 [转]IOS实现视频直播-RTMP协议的一些参考资料 2013-11-28阅读2809 评论6 近来在搞iOS下视频播放,研究了ffmpeg,现将看到比较好的资料汇总一下,方便自己或者有需要…

iOS 中KVC、KVO、NSNotification、delegate 总结及区别

转自:http://www.mamicode.com/info-detail-515516.html iOS 中KVC、KVO、NSNotification、delegate 总结及区别 KVC/KVO原理详解及编程指南 时间 2013-08-04 18:28:55 CSDN博客 原文 http://blog.csdn.net/wzzvictory/article/details/9674431 主题 Objective-C…

OpenShift 自定义 OPENSHIFT_DOCUMENT_ROOT 变量,替换网站根目录路径!

OpenShift 自定义 OPENSHIFT_DOCUMENT_ROOT 变量,替换网站根目录路径!预先定义的子目录 :)DIY: DocumentRoot${OPENSHIFT_REPO_DIR}diyPERL: DocumentRoot${OPENSHIFT_REPO_DIR}PHP: DocumentRoot${OPENSHIFT_REPO_DIR}Python: DocumentRoot{OPENSHIFT_R…

FFmpeg深入分析之零-基础

转自:http://blog.chinaunix.net/uid-26611383-id-3976154.html FFmpeg深入分析之零-基础 2013-11-04 21:22:37分类: C/C FFmpeg是相当强大的多媒体编解码框架,在深入分析其源代码之前必须要有基本的多媒体基础知识,否则其源代码会…

如何让iOS 保持界面流畅

转自:http://www.cocoachina.com/ios/20151130/14477.html 如何让iOS 保持界面流畅?这些技巧你知道吗 2015-11-30 06:15 编辑: suiling 分类:iOS开发 来源:ibireme 的博客 23 8067iOS 界面构建异步绘制异步图片加载 招…

深入理解RunLoop

转自:http://blog.ibireme.com/2015/05/18/runloop/ 深入理解RunLoop 由 ibireme | 2015-05-18 | iOS, 技术 RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后…

Redis在游戏服务器中的应用

一直对于redis在游戏服务器中的应用,有哪些好处很模糊,今天看了AgentK的这篇文章,对我启发很大,很感激。下面就转载下他的原文 : (扫盲:Redis是内存型、键值对型数据库,独立运行&…

2-3-4树的java实现

一、什么是2-3-4树 2-3-4树和红黑树一样,也是平衡树。只不过不是二叉树,它的子节点数目可以达到4个。 每个节点存储的数据项可以达到3个。名字中的2,3,4是指节点可能包含的子节点数目。具体而言: 1、若父节点中存有1个数据项,则必…