用Scrapy对豆瓣top250进行电影详细信息爬取
简述
为了练习简单的Pandas操作,我用Scrapy爬取了豆瓣Top250的电影信息。Top250页面展现的电影信息和具体电影页面所呈现的内容有些不同(比如演员信息),所以爬取总共用了两部分代码。此外为了防止被ban,还进行了一些简单的配置。
第一部分代码:
# -*- coding:utf-8 -*-
# 爬虫类需要继承scrapy下的Spider类。
import scrapyclass douban_movie_spider(scrapy.Spider):# 项目的启动名name = "douban_movie"# 如果网站设置有防爬措施,需要添加上请求头信息,不然会爬取不到任何数据headler = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 ''Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}# 开始链接start_urls = ['https://movie.douban.com/top250']# start_requests方法为scrapy的方法,我们对它进行重写。def start_requests(self):# 将start_url中的链接通过for循环进行遍历。for url in self.start_urls:# 通过yield发送Request请求。# 这里的Reques注意是scrapy下的Request类。注意不到导错类了。# 这里的有3个参数:# 1、url为遍历后的链接# 2、callback为发送完请求后通过什么方法进行处理,这里通过parse方法进行处理。# 3、如果网站设置了防爬措施,需要加上headers伪装浏览器发送请求。yield scrapy.Request(url=url, callback=self.parse, headers=self.headler)# 重写parse对start_request()请求到的数据进行处理def parse(self, response):# 这里使用scrapy的css选择器,既然数据在class为item的div下,那么把选取范围定位div.itemfor quote in response.css('div.item'):# 通过yield对网页数据进行循环抓取yield {# 我们抓取排名、电影名、导演、主演、上映日期、制片国家 / 地区、类型,评分、评论数量、一句话评价以及电影链接"排名": quote.css('div.pic em::text').extract(),"电影名": quote.css('div.info div.hd a span.title::text')[0].extract(),"上映年份": quote.css('div.info div.bd p::text')[1].extract().split('/')[0].strip(),"制片国家": quote.css('div.info div.bd p::text')[1].extract().split('/')[1].strip(),"类型": quote.css('div.info div.bd p::text')[1].extract().split('/')[2].strip(),"评分": quote.css('div.info div.bd div.star span.rating_num::text').extract(),"评论数量": quote.css('div.info div.bd div.star span::text')[1].re(r'\d+'),"引言": quote.css('div.info div.bd p.quote span.inq::text').extract(),"电影链接": quote.css('div.info div.hd a::attr(href)').extract_first()}next_url = response.css('div.paginator span.next a::attr(href)').extract()if next_url:next_url = "https://movie.douban.com/top250" + next_url[0]print(next_url)yield scrapy.Request(next_url, headers=self.headler)
爬取结果展示:
第二部分代码:
# -*- coding:utf-8 -*-
import scrapyclass AuthorSpider(scrapy.Spider):name = 'douban2'start_urls = ['https://movie.douban.com/top250']headler = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 ''Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'}def start_requests(self):for url in self.start_urls:yield scrapy.Request(url=url, callback=self.parse, headers=self.headler)def parse(self, response):# follow links to author pagesfor href in response.css('div.item div.info div.hd a::attr(href)').extract():yield scrapy.Request(href,headers=self.headler,callback=self.parse_author)# follow pagination linksnext_url = response.css('div.paginator span.next a::attr(href)').extract()if next_url:next_url = "https://movie.douban.com/top250" + next_url[0]print(next_url)yield scrapy.Request(next_url, headers=self.headler, callback=self.parse)def parse_author(self, response):# 通过yield对网页数据进行循环抓取yield {'排名' : response.css('.top250-no::text').extract(),'电影名': response.xpath('//span[contains(@property,"v:itemreviewed")]/text()').extract(),'导演': response.xpath('//div[contains(@id,"info")]/span[1]/span[contains(@class,"attrs")]/a/text()').extract(),'编剧': response.xpath('//div[contains(@id,"info")]/span[2]/span[contains(@class,"attrs")]/a/text()').extract(),'主演': response.xpath('//div[contains(@id,"info")]/span[3]/span[contains(@class,"attrs")]/a/text()').extract(),'语言': response.xpath('//div[contains(@id,"info")]/span[contains(@class,"pl")][3]/following::text()[1]').extract(),'上映日期': response.xpath('//div[contains(@id,"info")]/span[contains(@property,"v:initialReleaseDate")]/text()').extract(),'片长' : response.xpath('//div[contains(@id,"info")]/span[contains(@property,"v:runtime")]/text()').extract()}
爬取结果展示:
- 此外为了便于在PyCharm上查看程序运行时的情况而不是在控制台,我们加了一个run.py,如下:
from scrapy import cmdline# name='douban_movie -o douban.csv'
# cmd = 'scrapy crawl {0}'.format(name)
# cmdline.execute(cmd.split())name='douban2 -o demo.csv'
cmd = 'scrapy crawl {0}'.format(name)
cmdline.execute(cmd.split())
- 为了防止被ban,我们在前面代码中设置了请求头,除此之外,我还在settings.py中调整参数如下:
DOWNLOAD_DELAY = 1 # 下载的等待时间间隔一秒
# COOKIES_ENABLED = False 不向web server发送cookies
# ROBOTSTXT_OBEY = False 无视robot.txt
当我在查看信息时发现第二个爬取结果并不是250行:
于是查看程序返回信息,发现具体电影链接存在404:
经过查证发现Top250确实确实有4部电影链接失效了,比如:《搏击俱乐部》、《熔炉》等
为了便于数据分析,我们通过Pandas将两个CSV文件做merge操作
pd.merge(data_origin_1,data_origin_2,how='outer',on=u'排名')
- 这样我们就完成了电影详细信息的爬取。
用Scrapy对豆瓣top250进行电影详细信息爬取相关推荐
- Python之财富自由——天天基金数据爬取并导入excel(详细信息爬取)
一位泉州小哥近日喜提热搜"一万多买了1314只基金每只10块,买了好几天,第一次花钱花到手抽筋" 投资界有句名言,不要把鸡蛋全部放在一个篮子里,但你见过,有人装鸡蛋的篮子,比鸡蛋还 ...
- 基于scrapy+mongodb的智联招聘网站信息爬取
本篇内容主要记录博主本人爬取智联招聘网站信息的过程!! 环境:python 3.6.5 pycharm JetBrains PyCharm Community Edition 2018.1 x64 M ...
- python爬豆瓣top250书籍_python爬虫练习-爬取豆瓣图书top250
个人自学,完整学习请访问以下链接 学习链接:https://study.163.com/course/courseMain.htm?courseId=1004714034 代码 # -*-coding ...
- 电影资源详细信息爬取
获取永久资源网电影分类下每页的URL from selenium import webdriverdef reseach_list():driver=webdriver.Chrome() #调用chr ...
- 哔哩哔哩分区视频详细信息爬取(三连、播放量、标签)等
因为上手练习一个自己的数据分析项目,因此需要爬取数据.经历过两个版本的更新后,终于写出了第三版.期间也学会了selenium库的运用,API接口的调用,IP池等. 确定目标 因为想要一个量大的数据集, ...
- 基于R语言revest包的网络爬虫对豆瓣网TOP250的电影特征的抓取
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 本文我们会用R来爬取豆瓣网上2017年最热门电影的一些 ...
- 【爬虫】案例(爬取豆瓣top250)[完整+详细]
文章目录 1.需求 2.流程 3.实现 导包 主函数 数据获取 数据解析 存储到excel 简易数据库 存储到数据库 5.完整代码 6.小注 1.需求 爬取豆瓣top250的电影的播放链接,封面链接, ...
- Python豆瓣电影评论的爬取及词云显示
Python豆瓣电影评论的爬取及词云显示 课程设计论文链接 前言 开发工具.核心库 系统相关技术介绍 系统分析与设计 系统功能模块组成 实现功能和目标 爬取模块设计 爬取过程中下一页的处理 窗口界面设 ...
- python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...
def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...
最新文章
- python显示无效语法怎么处理-python – 无效语法(对于循环括号/括号)
- Linux中查看信息的命令
- Gitlab创建第一个项目
- K. Easy Sigma(类欧几里得)
- 【转】OneDrive开发入门
- C++ 关于“堆对象和栈对象”
- java 与 php 区别或异同(整理、整合)
- 获取HG526超级密码
- Resharper插件使用教程汇总
- nexus-3.0.0-03-win64搭建Maven nexus私服
- 龙芯pmon快速启动方法
- android录音工具,推荐四款十分好用的安卓录音应用
- 测试三星手机性能软件,一加三星小米华硕4部手机性能测试:一加手机6T仍是机皇...
- 双硬盘主机安装Ubuntu 18.04
- OpenGL ES 与原生窗口之间的接口——EGL
- 设置笔记本电脑插入USB鼠标时,自动禁用触摸板
- java 图文验证码
- 江西理工大学校园网开机自动连接,断网自动重连
- 2018年年度总结-工作成长
- 第一章	计算机系统基础知识(1)