最近新项目准备启动,在开始前内容、词库这些都需要提前做好准备,所以就有了这篇文章。
在开始动手,看了下行业核心词排在首页的站,发现内容都多得不要不要的,各种乱七八糟的频道、页面模板,心想,如果每个网站、每套页面都写一套采集模板的话,那简直要累死。

所以,这次,玩点不一样的。

首先,根据需求,采集一个行业的文章内容,可以拆分为两个模块:

  1. 爬虫系统:主要负责在浩瀚的互联网上,找到有内容价值的页面并且把页面抓取回来。涉及到URL去重、爬虫策略深度、广度一些杂事。
  2. 内容处理系统:主要负责处理爬虫抓回来的内容,并从里面提取出内容。

正文提取

以前在用印象笔记的时候,自带的一些小插件就很好用,只需要在浏览器上点一个按钮,就会自动提取出当前网页的正方,并且保存到笔记库里面。
在网上找了下,发现已经有很多现成的解决方案了,而且解决的方案/算法也很有意思。就是基于DOM树来处理的。
凡是DOM节点 name 或ID带有article、content、body的,加权重值。
DOM节点name或ID带有foot、comment、menu……的,降权。
经过一轮遍历后,把得分最高的节点提取出来,作为页面正文所在的节点。
算法参考:python-readability
测试了下,识别率还是挺高的,80%以上的成功率应该有。

 
提取正文效果

抓取系统

爬虫制作上面,选择了一直以来,用的比较顺手的scrapy做框架,代码如下:

 1 # -- coding: utf-8 --
2 import scrapy
3 from scrapy import Request
4 from scrapy.linkextractors import LinkExtractor
5 from scrapy.spiders import CrawlSpider, Rule
6
7 class LinkSpider(CrawlSpider):
8 name = 'link'
9 alloweddomains =
10 starturls =
11 rules = (
12 Rule(LinkExtractor(allow=r'\.htm', deny='baidu\.com'), callback='parseitem', follow=True),
13 )
14
15 def startrequests(self):
16 keywords = open('keywords.txt').readlines()
17 baseurlbaidu = 'https://www.baidu.com/s?rn=50&tn=baidulocal&wd=0&pn=1'
18 for kw in keywords:
19 # 构造百度搜索结果页URL
20 for pn in range(0,700,50):
21 yield Request(baseurlbaidu.format(kw,pn))
22
23 def parsestarturl(self, response):
24 """从种子页面提取URL作为初始链接"""
25 links = response.css('td.f a:first-childattr(href)').extract()
26 for link in links:
27 yield Request(url=link)
28
29 def parseitem(self, response):
30 """提取符合要求的网站内页"""
31 return response.url

代码有木有非常简单(滑稽),种子页面是从百度搜索结果页开始的,为了减少网络请求次数,把百度结果页的网站数量从默认的10个,改成了50,同时使用了无广告版的百度,URL是没有经过加密的。

到这里,基本上一个简单的行业内容采集爬虫就完成了,随意测试了下scrapy的速度,发现在我的 I5机器上,每分钟可以抓3356个页面,这还只是单机单进程,鹅妹子嘤~~

参考资料:
如何实现有道云笔记的网页正文抓取功能?

最新文章

  1. jQuery学习之路(5)- 简单的表单应用
  2. C#命名规则和编码规范
  3. Linux 性能监测:介绍
  4. jmeter笔记8
  5. 翻译:Universal Image Loader
  6. MyEclipse 6.5 破解文件代码
  7. P1026 犁田机器人
  8. iBeacon 开发笔记
  9. MySQL查询优化:连接查询排序limit
  10. 【带权并查集】【HDU3038】【How Many Answers Are Wrong】d s
  11. Web层后端权限模块
  12. 【模板--完全背包】HDU--2602 Bone Collector
  13. 命令行登陆mysql提示'mysql' 不是内部或外部命令
  14. Vue.js学习笔记(代码)
  15. Dynamics Customer Engagement V9版本配置面向Internet的部署时候下一步按钮不可点击的解决办法
  16. 使用vue实现tab栏的点击切换样式
  17. centos 6.5 安装 tomcat8 及性能优化_虚拟主机
  18. /bin/bash^M: bad interpreter: No such file or directory 解决办法
  19. 【C++】C++中的数组
  20. oracle监控资源管理器

热门文章

  1. NUC980 运行 RT-Thread 时使用 GPIO
  2. Java中对象调用方法的顺序
  3. 铂金07:整齐划一-CountDownLatch如何协调多线程的开始和结束
  4. Pycharm破解版_安装从失败到成功
  5. 10、ssh中scp、sftp程序详解
  6. bcprov-jdk15-145.rar
  7. hdu 2092 整数解(一元二次方程解)
  8. android实现计时器(转)
  9. IP数据包格式与ARP转发原理
  10. C语言:类型转换