scrapy爬取豆瓣电影

来源:互联网 发布:数据防泄密方案 编辑:程序博客网 时间:2024/04/30 07:33

这两天学习了下scrapy,并试着用它爬取了大家都扎堆爬的豆瓣排名前250的电影,中间提升了自己对scrapy的认识,并踩了一些坑总结一下。(以下内容基于Python3.5;scrapy1.3.3下)

只想看代码,here that is!

1.定义所需爬取元素的model

items.py

import scrapyclass DoubanscrapyItem(scrapy.Item):    url = scrapy.Field()    rank = scrapy.Field()    movie_name = scrapy.Field()    comment = scrapy.Field()    price = scrapy.Field()

爬取元素并不是必须声明一个model,也可以直接在爬虫代码中,将爬取的元素直接通过这种方式来展现

yield {    url: .....,    movie_name: .....}省略部分是爬取对应元素的规则

根据官方文档介绍,Item是保存结构数据的地方,Scrapy可以将解析结果以字典形式返回,但是Python中字典缺少结构,在大型爬虫系统中很不方便,Item提供了类字典的API,并且可以很方便的声明字段,很多Scrapy组件可以利用Item的其他信息。后面也可以方便pipelines对爬到的数据进行处理

2.爬虫实现代码

douban_spider.py

from scrapy import Request, Spiderfrom doubanScrapy.items import DoubanscrapyItem class DoubanScrapy(Spider):    """docstring for DoubanScrapy"""    name = 'douban'    # 爬虫起始url    start_urls = ["https://movie.douban.com/top250"]    def start_request(self):        yield Request(self.start_urls, callback = self.parse)    def parse(self, response):        for msg in response.xpath('//div[@class="item"]'):            item = DoubanscrapyItem()            item['url'] = msg.xpath('div[@class="pic"]/a/@href').extract()[0]            item['rank'] = msg.xpath('div[@class="pic"]/em/text()').extract()[0]            item['movie_name'] = msg.xpath('div[@class="pic"]/a/img/@alt').extract()[0]            item['price'] = msg.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract()[0]            comment = msg.xpath('div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span/text()').extract()            # 爬取过程中,有些没有直接的评论,做些处理            if comment:                item['comment'] = comment[0]            yield item        #获取当前url的下一页链接          next_page = response.xpath('//span[@class="next"]/a/@href').extract_first()        if next_page:            request_url = response.urljoin(next_page)            print (request_url)            yield Request(request_url, callback = self.parse)

这一块主要是爬取页面,并将对应元素传到定义好的数据字典中。
我这块页面元素的获取是用的xpath,也可以使用css selector获取,官方介绍


好了,现在通过scrapy crawl douban -o douban_movie.json
命令执行程序,并将爬到的数据存在指定的文件里,可以发现,出了问题
这里写图片描述

爬虫被豆瓣给屏了,主要原因是豆瓣的设了一个路障,打开开发者工具,我们可以看到,正常的通过浏览器访问一个页面的请求头的User-Agent是如下设置:
这里写图片描述
所以现在只需要修改下文件夹下的settings.py文件中的USER_AGENT 重新赋值为Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 就ok了,查看下图:
这里写图片描述

3.数据的处理

pipelines.py

这个文件主要是对抓取数据进行进一步的处理,如存数据库等等,下面是简单的将电影链接写入一个文件,当然通过上面说的命令行方式也是可以的。

首先需要在settings.py 修改一处地方

ITEM_PIPELINES = {   'doubanScrapy.pipelines.DoubanscrapyPipeline': 300,}

这几句在配置文件中默认是注释掉的,现在去掉注释就行啦。

class DoubanscrapyPipeline(object):    def process_item(self, item, spider):        with open('D:/workspace4/doubanScrapy/douban_movie.json', 'at') as f:            f.write('url:' + item['url'] + '\n')

将url写入指定文件中,执行scrapy crawl douban 结果如下:
这里写图片描述

以上代码在这:豆瓣爬虫github