scrapy爬取豆瓣电影

时间:2021-03-31 17:00:31

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

只想看代码,here that is

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

items.py

import scrapy

class 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, Spider
from 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
命令执行程序,并将爬到的数据存在指定的文件里,可以发现,出了问题
scrapy爬取豆瓣电影

爬虫被豆瓣给屏了,主要原因是豆瓣的设了一个路障,打开开发者工具,我们可以看到,正常的通过浏览器访问一个页面的请求头的User-Agent是如下设置:
scrapy爬取豆瓣电影
所以现在只需要修改下文件夹下的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了,查看下图:
scrapy爬取豆瓣电影

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 结果如下:
scrapy爬取豆瓣电影

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