实现较高程度的自动化爬虫工作,除了较灵活巧妙的逻辑算法外,关键的还是要依赖适应自动化条件的模式配置。没有错,确实是需要把自动爬取任务当作一项“服务“看待。(此处省略两三百百字,因Markdown bug被吞)
现在来看如何通过优化配置而简化代码提高可维护性和健壮性的。使用过Selenium的应该知道,定位元素Element的方法只有几种,如定位id、class、tagname、css等。这种固定的规律,使得配置自动化成为可能。为了简化案例的描述,使之更容易理解。这里只选取其中id和class两种常用的定位方法来加以说明。
案例:自动爬取配置的新闻网站特定栏目焦点内容
通常新闻资讯网站的栏目焦点内容出现的方式是比较规律的。因此,可以较为容易的通过定位特定HTML标签获得目标集。那么,如何实现自动化配置?
设计模式中,有个比较流行的MVC模式。类似地,为何不将解析任务和目标体系结构的描述工作进行分离?按照一定的协议,将多个可变目标体系结构封装成规律有序的数据结构。如此,因特网多变因素而引起的问题,就被单独分离出来处理变得可控。一旦目标体系结构发生变动,只需修改对应配置,而无需反复“推翻式”修改代码。原本严重依赖目标体系结构的解析处理代码变得“健壮”。
假设,将目标访问网址、定位方法和解析规则编撰为字典。爬取目标时,仅需从配置的字典读取对应规则,即可对目标开展访问和解析处理工作。目标的HTML结构发生变动,也是修改配置即可。就相当与MVC里的M模型(Model)和C控制器(Control)的相对独立、互不干扰的关系。真正实现优化配置实现自动化的目标。
实现代码:
class MyModule:
def __init__(self):
self.bys={'id':0, 'class':1}
self.urls={'guancha.cn':{'url':'https://www.guancha.cn', 'by':'class', 'target':'index-content'},
'thepaper.cn':{'url':'https://www.thepaper.cn', 'by':'id', 'target':'masonryContent'},
'news.qq.com':{'url':'https://news.qq.com', 'by':'id', 'target':'List', 'rule':'//ul:class=list//li//a'},
'youth.cn':{'url':'http://www.youth.cn', 'by':'class', 'target':'youth-left'},
'news.cnblogs.com':{'url':'https://news.cnblogs.com', 'by':'id', 'target':'news_list', 'rule':'//div:class=news_block//div:class=content//h2//a'},
'ycwb.com':{'url':'http://www.ycwb.com', 'by':'class', 'target':'ywnews'}
}
def __delete__(self):
self.urls=None
def getmodules(self):
return self.urls
def getbys(self):
return self.bys
modules=MyModule()