整个爬虫分为以下部分:
对于任意一个搜索系统类型的爬虫,统一划分为三个步骤:
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:本地路径
"""













网友评论