def get_gzh_artilce_by_history(self, keyword=None, url=None, deblocking_callback=None, identify_image_callback=None): if url is None: gzh_list = self.search_gzh( keyword, deblocking_callback=deblocking_callback, identify_image_callback=identify_image_callback) if gzh_list: url = gzh_list[0]['url'] else: raise Exception() # todo use ws exception req = requests.session() resp = WechatSogouRequest.get(url, req=req) # headers=self.__set_cookie() if not resp.ok: raise WechatSogouRequestsException( 'WechatSogouAPI get_gzh_artilce_by_history', resp) if '请输入验证码' in resp.text: self.__deblocking_history(url, resp, req, deblocking_callback, identify_image_callback) resp = WechatSogouRequest.get( url, req=req) # req=req headers=self.__set_cookie() return WechatSogouStructuring.get_gzh_info_and_article_by_history( resp.text)
def test_gen_search_article_url_page(self, page): if page > 0: url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, page) assert_in('page={}'.format(page), url) else: with assert_raises(AssertionError): WechatSogouRequest.gen_search_article_url(gaokao_keyword, page)
def test_gen_search_gzh_url_page(self, page): if page > 0: url = WechatSogouRequest.gen_search_gzh_url(gaokao_keyword, page) assert_in('page={}'.format(page), url) else: with assert_raises(AssertionError): WechatSogouRequest.gen_search_gzh_url(gaokao_keyword, page)
def test_gen_search_article_url_article_type(self): url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_ALL) assert_equal('interation=', url[-11:]) url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_IMAGE) assert_in('interation=458754', url) url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_VIDEO) assert_in('interation=458756', url) url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_RICH) assert_in('interation=458754%2C458756', url)
def test_gen_hot_url(self): for hot_index in filter(lambda x: not x.startswith('__'), dir(WechatSogouConst.hot_index)): url = WechatSogouRequest.gen_hot_url(hot_index) assert_in('http://weixin.sogou.com/wapindex/wap/0612/wap_', url) assert_in('0.html', url) with assert_raises(AssertionError): WechatSogouRequest.gen_hot_url(hot_index, 0) for page in range(1, 5): url = WechatSogouRequest.gen_hot_url(hot_index, page) assert_in('http://weixin.sogou.com/wapindex/wap/0612/wap_', url) assert_in('{}.html'.format(page - 1), url)
def test_gen_search_article_url_article_type(self): url = WechatSogouRequest.gen_search_article_url( gaokao_keyword, article_type=WechatSogouConst.search_article_type.all) assert_equal('interation=', url[-11:]) url = WechatSogouRequest.gen_search_article_url( gaokao_keyword, article_type=WechatSogouConst.search_article_type.image) assert_in('interation=458754', url) url = WechatSogouRequest.gen_search_article_url( gaokao_keyword, article_type=WechatSogouConst.search_article_type.video) assert_in('interation=458756', url) url = WechatSogouRequest.gen_search_article_url( gaokao_keyword, article_type=WechatSogouConst.search_article_type.rich) assert_in('interation=458754%2C458756', url)
def search_gzh(self, keyword, page=1, unlock_callback=None, identify_image_callback=None, decode_url=True): """搜索 公众号 对于出现验证码的情况,可以由使用者自己提供: 1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 搜索文字 page : int, optional 页数 the default is 1 unlock_callback : callable 处理出现验证码页面的函数,参见 unlock_callback_example identify_image_callback : callable 处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example decode_url : bool 是否解析 url Returns ------- list[dict] { 'open_id': '', # 微信号唯一ID 'profile_url': '', # 最近10条群发页链接 'headimage': '', # 头像 'wechat_name': '', # 名称 'wechat_id': '', # 微信id 'post_perm': '', # 最近一月群发数 'qrcode': '', # 二维码 'introduction': '', # 介绍 'authentication': '' # 认证 } Raises ------ WechatSogouRequestsException requests error """ url = WechatSogouRequest.gen_search_gzh_url(keyword, page) session = requests.session() resp = self.__get_by_unlock(url, unlock_platform=self.__unlock_sogou, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session) gzh_list = WechatSogouStructuring.get_gzh_by_search(resp.text) for i in gzh_list: if decode_url: i['profile_url'] = self.__format_url(i['profile_url'], url, resp.text, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session) yield i
def test_search_gzh(self): url = WechatSogouRequest.gen_search_gzh_url(gaokao_keyword) file_name = '{}/{}/{}'.format(os.getcwd(), fake_data_path, 'search-gaokao-gzh.html') with io.open(file_name, encoding='utf-8') as f: search_gaokao_gzh_error = f.read() httpretty.register_uri(httpretty.GET, url, body=search_gaokao_gzh_error) gzh_list = ws_api.search_gzh(gaokao_keyword) assert_equal(10, len(gzh_list)) assert_equal([ '山东高考指南', '高考家长圈', '河南高考指南', '高考360', '云天高考', '腾讯高考', '高考快讯', '专业中高考教育', '晟嘉高考', '新东方在线高考辅导' ], [i['wechat_name'] for i in gzh_list])
def get_gzh_artilce_by_hot(self, hot_index, page=1, unlock_callback=None, identify_image_callback=None): """获取 首页热门文章 Parameters ---------- hot_index : WechatSogouConst.hot_index 首页热门文章的分类(常量):WechatSogouConst.hot_index.xxx page : int 页数 Returns ------- list[dict] { 'gzh': { 'headimage': str, # 公众号头像 'wechat_name': str, # 公众号名称 }, 'article': { 'url': str, # 文章临时链接 'title': str, # 文章标题 'abstract': str, # 文章摘要 'time': int, # 推送时间,10位时间戳 'open_id': str, # open id 'main_img': str # 封面图片 } } """ assert hasattr(WechatSogouConst.hot_index, hot_index) assert isinstance(page, int) and page > 0 url = WechatSogouRequest.gen_hot_url(hot_index, page) resp = self.__get_by_unlock( url, is_need_unlock=lambda x: 'antispider' in x.url, unlock_platform=self.__unlock_sogou, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback) resp.encoding = 'utf-8' return WechatSogouStructuring.get_gzh_artilce_by_hot(resp.text)
def get_gzh_artilce_by_hot(self, hot_index, page=1, unlock_callback=None, identify_image_callback=None): """获取 首页热门文章 Parameters ---------- hot_index : WechatSogouConst.hot_index 首页热门文章的分类(常量):WechatSogouConst.hot_index.xxx page : int 页数 Returns ------- list[dict] { 'gzh': { 'headimage': str, # 公众号头像 'wechat_name': str, # 公众号名称 }, 'article': { 'url': str, # 文章临时链接 'title': str, # 文章标题 'abstract': str, # 文章摘要 'time': int, # 推送时间,10位时间戳 'open_id': str, # open id 'main_img': str # 封面图片 } } """ assert hasattr(WechatSogouConst.hot_index, hot_index) assert isinstance(page, int) and page > 0 url = WechatSogouRequest.gen_hot_url(hot_index, page) resp = self.__get_by_unlock(url, is_need_unlock=lambda x: 'antispider' in x.url, unlock_platform=self.__unlock_sogou, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback) resp.encoding = 'utf-8' return WechatSogouStructuring.get_gzh_artilce_by_hot(resp.text)
def get_gzh_artilce_by_history(self, keyword=None, url=None, unlock_callback_sogou=None, identify_image_callback_sogou=None, unlock_callback_weixin=None, identify_image_callback_weixin=None): """从 公众号的最近10条群发页面 提取公众号信息 和 文章列表信息 对于出现验证码的情况,可以由使用者自己提供: 1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 公众号的id 或者name url : str or unicode 群发页url,如果不提供url,就先去搜索一遍拿到url unlock_callback_sogou : callable 处理出现 搜索 的时候出现验证码的函数,参见 unlock_callback_example identify_image_callback_sogou : callable 处理 搜索 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example unlock_callback_weixin : callable 处理出现 历史页 的时候出现验证码的函数,参见 unlock_callback_example identify_image_callback_weixin : callable 处理 历史页 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example Returns ------- dict { 'gzh': { 'wechat_name': '', # 名称 'wechat_id': '', # 微信id 'introduction': '', # 描述 'authentication': '', # 认证 'headimage': '' # 头像 }, 'article': [ { 'send_id': '', # 群发id,注意不唯一,因为同一次群发多个消息,而群发id一致 'datetime': '', # 群发datatime 'type': '', # 消息类型,均是49,表示图文 'main': 0, # 是否是一次群发的第一次消息 'title': '', # 文章标题 'abstract': '', # 摘要 'fileid': '', # 'content_url': '', # 文章链接 'source_url': '', # 阅读原文的链接 'cover': '', # 封面图 'author': '', # 作者 'copyright_stat': '', # 文章类型,例如:原创啊 }, ... ] } Raises ------ WechatSogouRequestsException requests error """ if url is None: gzh_list = self.get_gzh_info(keyword, unlock_callback_sogou, identify_image_callback_sogou) if 'profile_url' not in gzh_list: raise Exception() # todo use ws exception url = gzh_list['profile_url'] resp = self.__get_by_unlock( url, WechatSogouRequest.gen_search_article_url(keyword), is_need_unlock=lambda x: '请输入验证码' in x.text, unlock_platform=self.__unlock_wechat, unlock_callback=unlock_callback_weixin, identify_image_callback=identify_image_callback_weixin) return WechatSogouStructuring.get_gzh_info_and_article_by_history( resp.text)
def search_article(self, keyword, page=1, timesn=WechatSogouConst.search_article_time.anytime, article_type=WechatSogouConst.search_article_type.all, ft=None, et=None, unlock_callback=None, identify_image_callback=None): """搜索 文章 对于出现验证码的情况,可以由使用者自己提供: 1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 搜索文字 page : int, optional 页数 the default is 1 timesn : WechatSogouConst.search_article_time 时间 anytime 没有限制 / day 一天 / week 一周 / month 一月 / year 一年 / specific 自定 the default is anytime article_type : WechatSogouConst.search_article_type 含有内容的类型 image 有图 / video 有视频 / rich 有图和视频 / all 啥都有 ft, et : datetime.date or None 当 tsn 是 specific 时,ft 代表开始时间,如: 2017-07-01 当 tsn 是 specific 时,et 代表结束时间,如: 2017-07-15 unlock_callback : callable 处理出现验证码页面的函数,参见 unlock_callback_example identify_image_callback : callable 处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example Returns ------- list[dict] { 'article': { 'title': '', # 文章标题 'url': '', # 文章链接 'imgs': '', # 文章图片list 'abstract': '', # 文章摘要 'time': '' # 文章推送时间 }, 'gzh': { 'profile_url': '', # 公众号最近10条群发页链接 'headimage': '', # 头像 'wechat_name': '', # 名称 'isv': '', # 是否加v } } Raises ------ WechatSogouRequestsException requests error """ url = WechatSogouRequest.gen_search_article_url( keyword, page, timesn, article_type, ft, et) resp = self.__get_by_unlock( url, WechatSogouRequest.gen_search_article_url(keyword), is_need_unlock=lambda x: 'antispider' in x.url, unlock_platform=self.__unlock_sogou, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback) return WechatSogouStructuring.get_article_by_search(resp.text)
def search_gzh(self, keyword, page=1, deblocking_callback=None, identify_image_callback=None): """搜索 公众号 对于出现验证码的情况,可以由使用者自己提供: 1、函数 deblocking_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 deblocking_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 搜索文字 page : int, optional 页数 the default is 1 deblocking_callback : callable 处理出现验证码页面的函数,参见 deblocking_callback_example identify_image_callback : callable 处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example Returns ------- list[dict] { 'url': '', 'img': '', 'name': '', 'wechat_id': '', 'post_perm': '', 'qrcode': '', 'introduction': '', 'authentication': '' } Raises ------ WechatSogouRequestsException requests error """ req = requests.session() url = WechatSogouRequest.gen_search_gzh_url(keyword, page) resp = WechatSogouRequest.get(url, req=req, headers=self.__set_cookie()) if not resp.ok: raise WechatSogouRequestsException('WechatSogouAPI search_gzh', resp) if 'antispider' in resp.url: self.__deblocking_search(url, resp, req, deblocking_callback, identify_image_callback) resp = WechatSogouRequest.get( url, req=req, headers=self.__set_cookie()) # req=req return WechatSogouStructuring.get_gzh_by_search(resp.text)
def get_gzh_artilce_by_history(self, keyword=None, url=None, unlock_callback_sogou=None, identify_image_callback_sogou=None, unlock_callback_weixin=None, identify_image_callback_weixin=None): """从 公众号的最近10条群发页面 提取公众号信息 和 文章列表信息 对于出现验证码的情况,可以由使用者自己提供: 1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 公众号的id 或者name url : str or unicode 群发页url,如果不提供url,就先去搜索一遍拿到url unlock_callback_sogou : callable 处理出现 搜索 的时候出现验证码的函数,参见 unlock_callback_example identify_image_callback_sogou : callable 处理 搜索 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example unlock_callback_weixin : callable 处理出现 历史页 的时候出现验证码的函数,参见 unlock_callback_example identify_image_callback_weixin : callable 处理 历史页 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example Returns ------- dict { 'gzh': { 'wechat_name': '', # 名称 'wechat_id': '', # 微信id 'introduction': '', # 描述 'authentication': '', # 认证 'headimage': '' # 头像 }, 'article': [ { 'send_id': '', # 群发id,注意不唯一,因为同一次群发多个消息,而群发id一致 'datetime': '', # 群发datatime 'type': '', # 消息类型,均是49,表示图文 'main': 0, # 是否是一次群发的第一次消息 'title': '', # 文章标题 'abstract': '', # 摘要 'fileid': '', # 'content_url': '', # 文章链接 'source_url': '', # 阅读原文的链接 'cover': '', # 封面图 'author': '', # 作者 'copyright_stat': '', # 文章类型,例如:原创啊 }, ... ] } Raises ------ WechatSogouRequestsException requests error """ if url is None: gzh_list = self.get_gzh_info(keyword, unlock_callback_sogou, identify_image_callback_sogou) if 'profile_url' not in gzh_list: raise Exception() # todo use ws exception url = gzh_list['profile_url'] resp = self.__get_by_unlock(url, WechatSogouRequest.gen_search_article_url(keyword), is_need_unlock=lambda x: '请输入验证码' in x.text, unlock_platform=self.__unlock_wechat, unlock_callback=unlock_callback_weixin, identify_image_callback=identify_image_callback_weixin) return WechatSogouStructuring.get_gzh_info_and_article_by_history(resp.text)
# -*- coding: utf-8 -*- from __future__ import absolute_import, unicode_literals, print_function import os from wechatsogou.request import WechatSogouRequest from wechatsogou.structuring import WechatSogouStructuring ws = WechatSogouRequest() ws_structuring = WechatSogouStructuring() empty_search_result_keyword = 'gggggggggggggggggg' gaokao_keyword = '高考' fake_data_path = '{}/file'.format( os.getcwd() if 'test' in os.getcwd() else '{}/test'.format(os.getcwd()))
def search_article(self, keyword, page=1, timesn=WechatSogouConst.search_article_time.anytime, article_type=WechatSogouConst.search_article_type.all, ft=None, et=None, unlock_callback=None, identify_image_callback=None): """搜索 文章 对于出现验证码的情况,可以由使用者自己提供: 1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 搜索文字 page : int, optional 页数 the default is 1 timesn : WechatSogouConst.search_article_time 时间 anytime 没有限制 / day 一天 / week 一周 / month 一月 / year 一年 / specific 自定 the default is anytime article_type : WechatSogouConst.search_article_type 含有内容的类型 image 有图 / video 有视频 / rich 有图和视频 / all 啥都有 ft, et : datetime.date or None 当 tsn 是 specific 时,ft 代表开始时间,如: 2017-07-01 当 tsn 是 specific 时,et 代表结束时间,如: 2017-07-15 unlock_callback : callable 处理出现验证码页面的函数,参见 unlock_callback_example identify_image_callback : callable 处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example Returns ------- list[dict] { 'article': { 'title': '', # 文章标题 'url': '', # 文章链接 'imgs': '', # 文章图片list 'abstract': '', # 文章摘要 'time': '' # 文章推送时间 }, 'gzh': { 'profile_url': '', # 公众号最近10条群发页链接 'headimage': '', # 头像 'wechat_name': '', # 名称 'isv': '', # 是否加v } } Raises ------ WechatSogouRequestsException requests error """ url = WechatSogouRequest.gen_search_article_url(keyword, page, timesn, article_type, ft, et) resp = self.__get_by_unlock(url, WechatSogouRequest.gen_search_article_url(keyword), is_need_unlock=lambda x: 'antispider' in x.url, unlock_platform=self.__unlock_sogou, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback) return WechatSogouStructuring.get_article_by_search(resp.text)
def search_article(self, keyword, page=1, timesn=0, article_type=WechatSogouRequest.TYPE_ALL, ft=None, et=None, deblocking_callback=None, identify_image_callback=None): """搜索 文章 对于出现验证码的情况,可以由使用者自己提供: 1、函数 deblocking_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 deblocking_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 搜索文字 page : int, optional 页数 the default is 1 timesn : {0, 1, 2, 3, 4, 5} 时间 0 没有限制 / 1一天 / 2一周 / 3一月 / 4一年 / 5自定 the default is 0 article_type : {'image', 'video', 'rich', 'all'} 含有内容的类型 TYPE_IMAGE 有图 / TYPE_VIDEO 有视频 / TYPE_RICH 有图和视频 / TYPE_ALL 啥都有 ft, et : datetime.date or None 当 tsn 是 5 时,ft 代表开始时间,如: 2017-07-01 当 tsn 是 5 时,et 代表结束时间,如: 2017-07-15 deblocking_callback : callable 处理出现验证码页面的函数,参见 deblocking_callback_example identify_image_callback : callable 处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example Returns ------- list[dict] { 'url': '', 'img': '', 'name': '', 'wechat_id': '', 'post_perm': '', 'qrcode': '', 'introduction': '', 'authentication': '' } Raises ------ WechatSogouRequestsException requests error """ req = requests.session() url = WechatSogouRequest.gen_search_article_url( keyword, page, timesn=timesn, article_type=article_type, ft=ft, et=et) url_referer = WechatSogouRequest.gen_search_article_url(keyword) resp = WechatSogouRequest.get( url, req=req, headers=self.__set_cookie(referer=url_referer)) if not resp.ok: raise WechatSogouRequestsException('WechatSogouAPI search_article', resp) if 'antispider' in resp.url: self.__deblocking_search(url, resp, req, deblocking_callback, identify_image_callback) resp = WechatSogouRequest.get( url, req=req, headers=self.__set_cookie(referer=url_referer)) # req=req return WechatSogouStructuring.get_article_by_search(resp.text)
def test_gen_search_article_url_keyword(self): url = WechatSogouRequest.gen_search_gzh_url(gaokao_keyword) assert_equal('http://weixin.sogou.com/weixin?type=1&page=1&ie=utf8&query=%E9%AB%98%E8%80%83', url)
def search_article(self, keyword, page=1, timesn=WechatSogouConst.search_article_time.anytime, article_type=WechatSogouConst.search_article_type.all, ft=None, et=None, unlock_callback=None, identify_image_callback=None, decode_url=True): """搜索 文章 对于出现验证码的情况,可以由使用者自己提供: 1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程 2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决 注意: 函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用 Parameters ---------- keyword : str or unicode 搜索文字 page : int, optional 页数 the default is 1 timesn : WechatSogouConst.search_article_time 时间 anytime 没有限制 / day 一天 / week 一周 / month 一月 / year 一年 / specific 自定 the default is anytime article_type : WechatSogouConst.search_article_type 含有内容的类型 image 有图 / video 有视频 / rich 有图和视频 / all 啥都有 ft, et : datetime.date or None 当 tsn 是 specific 时,ft 代表开始时间,如: 2017-07-01 当 tsn 是 specific 时,et 代表结束时间,如: 2017-07-15 unlock_callback : callable 处理出现验证码页面的函数,参见 unlock_callback_example identify_image_callback : callable 处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example decode_url : bool 是否解析 url Returns ------- list[dict] { 'article': { 'title': '', # 文章标题 'url': '', # 文章链接 'imgs': '', # 文章图片list 'abstract': '', # 文章摘要 'time': '' # 文章推送时间 }, 'gzh': { 'profile_url': '', # 公众号最近10条群发页链接 'headimage': '', # 头像 'wechat_name': '', # 名称 'isv': '', # 是否加v } } Raises ------ WechatSogouRequestsException requests error """ def limit_sleep(): """ 根据limit_seconds参数延迟一段时间 """ seconds = self.limit_seconds if seconds: time.sleep(seconds) url = WechatSogouRequest.gen_search_article_url(keyword, page, timesn, article_type, ft, et) session = requests.session() try: resp = self.__get_by_unlock(url, WechatSogouRequest.gen_search_article_url(keyword), unlock_platform=self.__unlock_sogou, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session) article_list = WechatSogouStructuring.get_article_by_search(resp.text) limit_sleep() for i in article_list: if decode_url: i['article']['url'] = self.__format_url(i['article']['url'], url, resp.text, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session) limit_sleep() i['gzh']['profile_url'] = self.__format_url(i['gzh']['profile_url'], url, resp.text, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session) yield i except WechatSogouRequestsException as e: raise e
def test_gen_search_article_url_keyword(self): url = WechatSogouRequest.gen_search_article_url(gaokao_keyword) assert_equal('http://weixin.sogou.com/weixin?type=2&page=1&ie=utf8&query=%E9%AB%98%E8%80%83&interation=', url)
def test_gen_search_article_url_timesn(self, timesn, ft, et): if timesn == 0: url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn) assert_in('type=2&page=1&ie=utf8&query=', url) assert_not_in('ft=&et=', url) url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft) assert_in('type=2&page=1&ie=utf8&query=', url) assert_not_in('ft=&et=', url) elif timesn in [1, 2, 3, 4]: url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn) assert_in('tsn={}&ft=&et='.format(timesn), url) url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft) assert_in('tsn={}&ft=&et='.format(timesn), url) elif timesn == 5: if ft <= et: url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft, et=et) assert_in('tsn=5&ft={}&et={}'.format(ft, et), url) else: with assert_raises(AssertionError): WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn) WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft, et=et) else: with assert_raises(AssertionError): WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn)