一、综述
开始这篇博文之前,调研了相关的爬虫方法,简单罗列冰山一角。
综述:
手动编写爬虫,httpclient是常用工具。常见的请求方式有httpget和httppost
http://blog.csdn.net/mr_tank_/article/details/17454315
http://blog.csdn.net/chszs/article/details/16854747
http://www.yeetrack.com/?p=779
这个教程很全面。供参考和备查
htmlunit
httpclient 对js 的支持比较差,有时候需要使用htmlunit 或者selenium。
http://www.360doc.com/content/13/1229/14/14875906_340995211.shtml
http://blog.csdn.net/strawbingo/article/details/5768421
http://www.cnblogs.com/microsoftmvp/p/3716750.html
抽取相关
当爬取了html 后,需要去除噪声广告,抽取有用的信息。jsoup 和tika 是非常强大的工具
http://summerbell.iteye.com/blog/565922
github开源爬虫库
https://github.com/CrawlScript/WebCollector
https://github.com/zhuoran/crawler4j
开源爬虫框架nutch
http://www.cnblogs.com/xuekyo/archive/2013/04/18/3028559.html
http://ahei.info/nutch-tutorial.htm
http://lc87624.iteye.com/blog/1625677
由于要学习python语言,就关注了python爬虫的方法,scrapy框架是个成熟的开源爬虫框架,因此选择其作为学习内容。
Scrapy是一个基于Twisted,纯Python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容、图片、视频等,非常方便。
二、scrapy框架
1、整体架构如下:
绿线是数据流向,首先从初始URL 开始,Scheduler 会将其交给 Downloader 进行下载,下载之后会交给 Spider 进行分析,Spider分析出来的结果有两种:一种是需要进一步抓取的链接,
例如之前分析的“下一页”的链接,这些东西会被传回 Scheduler ;另一种是需要保存的数据,它们则被送到Item Pipeline 那里,那是对数据进行后期处理(详细分析、过滤、存储等)的
地方。另外,在数据流动的通道里还可以安装各种中间件,进行必要的处理。参考
博客
2、工程文件介绍
假设你已经配置好环境了,进入某个文件夹pythonproject,在命令行中输入
scrapy startproject mypro
即可在pythonporoject文件夹下找到mypro的工程文件夹,结构如下:
├── mypro
│ ├── mypro
│ │ ├── init.py
│ │ ├── items.py
│ │ ├── pipelines.py
│ │ ├── settings.py
│ │ └── spiders
│ │ └── init.py
│ └── scrapy.cfg
scrapy.cfg: 项目配置文件
items.py: 需要提取的数据结构定义文件
pipelines.py:管道定义,用来对items里面提取的数据做进一步处理,如保存等
settings.py: 爬虫配置文件
Items是将要装载抓取的数据的容器,它工作方式像python里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。它通过创建一个scrapy.item.Item类来声明
,定义它的属性为scrpiy.item.Field对象,就像是一个对象关系映射(ORM),我们通过将需要的item模型化,来控制从dmoz.org获得的站点数据。虽然这次的实现并没有用到items.py和
pipelines.py,但大规模的爬虫还是需要注意一下解耦。
举个例子:
|
|
在修改初始化代码时,首先需要在pythonproject//mypro//mypro//spiders下新建一个python文件,原则上所有的实现可以在这个文件里完成,当然耦合度就高了。在这个文件中,你需要新
建一个类,这个类需要添加以下属性:
1、该类继承于某个spider类,根据自己的需求,有很多可以选,如crawSpider,BaseSpider,Spider,XMLFeedSpider,CSVFeedSpider,SitemapSpider等等
2、name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字,例如下文的”yourname”
3、start_urls:爬虫开始爬的一个URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些URLS开始。其他子URL将会从这些起始URL中继承性生成。
4、parse():爬虫的方法,调用时候传入从每一个URL传回的Response对象作为参数,response将会是parse方法的唯一的一个参数,这个方法负责解析返回的数据、匹配抓取的数据(解析为
item)并跟踪更多的URL。返回前可以巧妙地运用yield方法递归调用网址,此关键词的作用是返回某个对象后继续执行。如果不用该关键字,则直接会在函数中返回。
一般而言,运用scrapy的步骤是这样的:
1、在pythonproject//mypro//mypro//spiders下新建一个python文件
2、导入该导入的库文件,新建一个类满足以上要求。
3、根据继承的类的要求和功能,定义爬取规则。
4、在def parse(self, response)函数中对response对象解析,将需要的内容存入item对象并返回,在这里对数据不返回而是进行进一步处理也是可以的,耦合度高。
5、PipeLine用来对Spider返回的Item列表进行保存操作,可以写入到文件、或者数据库等。PipeLine只有一个需要实现的方法:process_item。
万事具备之后,通过命令行进入pythonproject//mypro文件夹中,敲下命令行开始爬虫
scrapy crawl “yourname”
scrapy命令罗列几个,要更多请参看doc
scrapy startproject xxx
新建一个xxx的projectscrapy crawl xxx
开始爬取,必须在project中scrapy shell url
在scrapy的shell中打开url,非常实用scrapy runspider <spider_file.py>
可以在没有project的情况下运行爬虫
三、新浪新闻爬虫
众所周知,评论一般是隐藏起来的,或者显示部分,需要手动点击加载去获取更多评论。有两种方法可以解决这种方法,一种是利用js动态解析,工作量大,也比较难实现,二是直接定位到其查询数据库的url,直接抽取。下文就是讲第二种方法。
新浪页面导航为我们简单分好类了http://news.sina.com.cn/guide/,而且每个类别中都可以找到相应的滚动新闻(url冠以roll),因而没必要用到crawSpider这个类,这个类功能很强大,不仅可以自动去重,还可以定义更多的爬取规则。例如这个链接http://roll.finance.sina.com.cn/finance/zq1/index_1.shtml,通过修改数字可以实现不断爬取对于新闻的url,当然没有这么“好”的url也是可以找到新闻的url。例如:http://sports.sina.com.cn/nba/
可以调用的浏览器的开发工具查找对应的js代码,查看数据库的url,之后在查看评论的时候也是这样的方法(点击刷新即可)
访问这个链接可以查看url
因此,访问这个链接的内容,爬取新闻url,访问新闻并爬取标题、内容、评论。
|
|
爬取结果:
在爬取的过程中要注意三点:
1.爬取不要过于频繁,不然可能会被封ip,可以减小爬取的速度,sleep一下,或者更改设置文件,我的在F:\Python27\python\Lib\site-packages\Scrapy-0.24.4-py2.7.egg\scrapy\settings\default_settings.py
2.文件夹的文件上限为21845,超过后注意再新建一个文件夹爬取
3.线程不能开得太多,不然也可能达到上限,可以考虑用代码现在所开线程的多少或者利用分布式系统