用scrpay实现列表页详情页的抽取

中国的技术人员对爬虫很感兴趣,一来这东西确实有点技术含量;二来搞垃圾站作网赚要用到爬虫:本身整个小站,用爬虫抄袭别人的内容,挂挂外链,弄弄长尾seo,而后挂广告赚钱。html

但其实咱们作的工做不全是爬虫,更多的是内容的抽取,即web scraping。通常搜索引擎用到的爬虫,是存取整个html页面,而后创建索引,供用户搜索,这叫crawling。中国通常用一个爬虫就指代了二者,不作区分。python

作内容抽取,一般用xpath、正则表达式来定义须要抽取的内容规则,不一样的页面规则不相同,爬取不一样的页面就要建立和维护不一样的规则,比较麻烦,除此以外还要考虑批量爬取和增量爬取的配合。web

通常作一次定向爬取,采用列表页+详情页的模式比较常见,之前用过一个工具叫作webharvest,demo的例子里直接有如何作列表页+详情页的抽取,可是webharvest近四年来都没有更新,最近一次使用发现,GUI控制界面竟然没法打开配置文件和正常关闭,果断放弃之。最后回到scrapy。正则表达式

scrapy是python的一个爬虫框架,所谓框架,在于帮助你将注意力焦点放在业务逻辑上,而不是种种繁琐的、重复的、已经有经过解决方案的技术细节,在爬虫这块则是:任务调度、dns缓存、网络访问等等。使用scrapy,你只须要指定你要爬什么网站、爬什么页面、内容在页面的什么部位、最后的结果如何存储,便可。api

列表页+详情页的内容抽取,关键在于待爬取的url只是页面页面,如第一页,第二页,。。。,和详情页,其余的页面都无需考虑。而通常爬虫的逻辑是:给定起始页面,发起访问,分析页面包含的全部其余连接,而后将这些连接放入队列,再逐次访问这些队列,直至边界条件结束。为了针对列表页+详情页这种模式,须要对连接抽取(link extractor)的逻辑进行限定。好在scrapy已经提供,关键是你知道这个接口,并灵活运用。缓存

rules = (Rule(SgmlLinkExtractor(allow=('category/20/index_\d+\.html'), restrict_xpaths=("//div[@class='left']"))),
		Rule(SgmlLinkExtractor(allow=('a/\d+/\d+\.html'), restrict_xpaths=("//div[@class='left']")), callback='parse_item'),
	)

Rule是在定义抽取连接的规则,上面的两条规则分别对应列表页的各个分页页面和详情页,关键点在于经过restrict_xpath来限定只从页面特定的部分来抽取接下来将要爬取的连接。网络

相关文章
相关标签/搜索