爬虫爬取了500条豆瓣网站的影评网页,25部电影,每部20条。每个网页中提取了影评的电影名称、影评作者、评论时间、影评标题、网页的url和影评的具体内容。爬虫的实现使用了Scrapy框架。Scrapy框架是一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化数据。
爬虫的项目文件目录如下图所示。(movie被不小心敲成了moview 捂脸。。)
其中scrapy.cfg是项目的配置文件,MovieReviewSpider文件夹是项目的Python模块,代码会从这个文件夹中导入。这个文件夹中的spiders文件夹是放置Spider的目录,items.py是项目的Items文件,pipeline.py是项目的管道文件,settings.py是项目的配置文件。
爬虫的实现步骤如下:
1、定义Item类,Item是将要抓取的数据的容器,工作方式像Python中的字典。在本项目中,需要定义MoviewreviewspiderItem类继承自scrapy.Item类,类中包含movie、writer、time、title、url、content六个属性,用来存储网页上要爬取的电影名称、影评作者、评论时间、影评标题、网页的url和影评的具体内容
2、定义Spider类,Spider包含三部分内容:下载的URL的初步列表、如何跟踪链接和如何解析这些网页的内容用于提取items。在本项目中定义了name属性、allowed_domains属性、start_urls属性、headers属性、start_requests方法、parse_link方法和parse_review方法。
- 设置name属性为moviereview。name是爬虫的识别名,必须是唯一的,不同的爬虫中必须定义不同的名字。
- 设置start_urls属性,在里面放起始的25个电影的网址。start_urls是爬虫开始爬的一个URL列表,爬虫从这里开始抓取数据。
- 设置headers属性,设置本机浏览器访问豆瓣网站时给我们添加的头信息。在浏览器中手动访问豆瓣网站时,浏览器会自动为我们添加很多信息,而现在在程序访问网站,如果不加上头信息,豆瓣网站就会拒绝程序对它的访问。
- 定义start_request方法,在这个方法中实现循环访问每一个start_urls中的URL,并设置访问URL后的回调函数为parse_link方法。
- 定义parde_link方法,在这个方法中用xpath选择器提取访问的URL页面中的影评链接,这些影评链接是要进一步爬取的网页。设置回调函数为parse_review方法,进一步访问该网页中影评链接所指向的网页。
- 定义parse_review方法,在这个方法中用xpath提取网页中的电影名称、影评作者、评论时间、影评标题、网页的url和影评的具体内容信息,并用这些信息来实例化MoviewreviewspiderItem对象。
- 在提取具体内容信息时,需要用re模块中的sub方法来清洗影评的内容。因为这些内容中可能含有单引号和双引号,本程序最后要把这些信息以json形式存储。如果不清洗,引号会破坏json数据的格式。
- 最后yield item对象,scrapy框架会在pipeline中处理这些item对象。
3、定义Itme Pipeline类,将爬下来的数据存储成utf-8编码的json文件。当Item在Spider中收集之后,它会被传递到Item Pipeline,这个类中必须定义process_item()方法。
- 定义__init()__方法,在这个里面写一个global型的全局变量,用记录item对象的个数,并用它来作为json的文件。
- 定义process_item()方法,在这个方法中调用codecs模块的open方法以utf-8编码打开reviews文件夹中的文件,文件名用global变量做为文件名,然后将item中的内容写到文件中,再将global变量的值加1。
- 定义spider_close方法,在这个方法中关闭打开的文件。
4、在settings.py文件中配置Item Pipeline。
最后在终端中进入项目的根目录,运行命令scrapy crawl moviereview即可执行爬虫,在reviews文件夹中可以得到json文件。