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
- scrapy爬取豆瓣电影
- Scrapy 爬取 豆瓣电影的短评
- scrapy爬取豆瓣TOP250电影
- scrapy ------ 爬取豆瓣电影TOP250
- scrapy爬取豆瓣top250电影
- 【scrapy】scrapy按分类爬取豆瓣电影基础信息
- scrapy爬豆瓣电影
- Python 采用Scrapy爬虫框架爬取豆瓣电影top250
- 爬虫框架scrapy,爬取豆瓣电影top250
- Python爬虫实战:Scrapy豆瓣电影爬取
- 使用scrapy+mongodb爬取豆瓣电影TOP250
- Scrapy教程(一)爬取豆瓣top250电影
- 使用scrapy框架爬取豆瓣电影top250信息
- 用scrapy框架爬取豆瓣Top250电影
- 爬虫实践---Scrapy-豆瓣电影影评&深度爬取
- python-scrapy 实现对豆瓣电影的爬取
- 用Scrapy对豆瓣top250进行电影详细信息爬取
- scrapy爬取豆瓣电影top250并存储到mysql
- 五、Canvas控件
- ①写给后端工程师的JavaScript教程——从这里开始
- 【Effection C++】读书笔记 条款20~条款23
- 输出PATest
- 在二叉查找树中插入节点
- scrapy爬取豆瓣电影
- 组件之间的通信
- d3为饼图初始化添加动画
- Springmvc的拦截器配置过程小例子
- Dubbo之——服务接口的设计原则
- 理解CSS3 transform中的Matrix(矩阵)
- 0518
- module_init解析
- 算法练习