美文网首页
通用爬虫设计方案

通用爬虫设计方案

作者: sidyph | 来源:发表于2018-08-30 17:05 被阅读0次

整个爬虫分为以下部分:
对于任意一个搜索系统类型的爬虫,统一划分为三个步骤:
1.根据config里的初始url、data、headers、charset基本配置结合用户输入的begin_date、end_date、其他关键字来获取待爬取的url、data、headers、charset、status的frm,。所有天数分割成单个的天数。
此时page默认为空{},需要在2中用format进行填充,status为100。
这个类也是变化较大,不同渠道不同的写法。

2.对frm的每一行执行requests,获取结果。
如果frm中没有data、headers,默认为None;
如果没有charset,默认为utf-8;
如果frm中没有status,默认创建这一列,默认值100;
如果存在多页的,page初始为1,然后遍历page,然后把遍历的所有页面的结果合并。
利用try except进行断点重连,并且每成功requests一次就把frm的status状态调整为200保存到本地(利用下载行为类),防止突发情况造成的中断。
这一步的结果可以是任意类型的,str,list,frm,dict等。比如str组成的list。
req可以单独做成行为类,把retry封装进去。
如果有下载的需求,则需要把下载到本地作为一个行为类传过去,下载的行为类里面定义了下载文件的路径(含命名)。

3.对结果进行解析,获取解析后的frm,这一步就差异比较大了,对有些来源的可能需要继承后重写。
如果结果需要下载保存,则用下载行为类处理。

Demo:
对上交所公告而言,整个脚本流程为:
1→2→3→2→3

class GetUrlFrmStep:
    """根据客户从接口输入的参数,获取包含url、data、headers、status字段的frm"""
    def __init__(self):
        """ """
    def get_url_frm(self,begin_date, end_date, trade_code, keyword):
        """
        [秘方]获取url_frm
        :param begin_date:爬取起始日
        :param end_date:爬取终止日
        :param trade_code:根据code搜索,默认None
        :param keyword:根据关键字搜索,默认None
        """
        -> return url_frm
        
class GetContentStep:
    """根据url_frm按行进行requests,获取返回的content"""
    def __init__(self,req_bhv = None, dl_bhv = None):
        self.req_bhv = ensure_class(req_bhv,ReqBhv)
        self.dl_bhv = ensure_class(dl_bhv,DlBhv)
        """
        :param req_bhv:req行为
        :param dl_bhv:下载行为
        """
    def get_content(self,to_req_frm):
        """
        [秘方]获取frm_content
        :param to_req_frm:待requests的对象frm
        """
        -> return frm_content
        
        
class ParseStep:
    """对content进行解析"""
    def __init__(self,dl_bhv = None):
        self.dl_bhv = ensure_class(dl_bhv,DlBhv)
        """
        :param dl_bhv:下载行为
        """
    def parse_content(self,frm_content):
        """
        [秘方]获取parse_frm
        :param frm_content:待parse的内容
        """
        -> return parsed_frm
        
class ReqBhv:
    """requests行为"""
    def __init__(self):
        """ """
    def get(self,url, headers):
        """
        [秘方]get方法
        :param url
        :param headers
        """
        -> return content
    def post(self,url, data, headers):
        """
        [秘方]post方法
        :param url
        :param data
        :param headers
        """
        -> return content
        
class DlBhv:
    """下载行为"""
    def __init__(self):
        """ """
    def get_full_path(self,main_dir, announce_date, file_name):
        """
        [秘方]获取待下载文件的路径,如文件夹不存在需创建
        :param main_dir:下载文件的公用目录
        :param announce_date:待下载文件的日期
        :param file_name:待下载文件名
        """
        -> return full_path
        
    def save(self,content, path):
        """
        [秘方]利用with open将待下载文件的二进制内容保存到本地,如文件夹不存在需创建
        :param content:待下载文件的二进制内容
        :param path:本地路径
        """
        
        

    

相关文章

网友评论

      本文标题:通用爬虫设计方案

      本文链接:https://www.haomeiwen.com/subject/hobrwftx.html