本次小实验目标就是爬取豆瓣所有的电影,我们以豆瓣的分类页(https://movie.douban.com/tag/#/)作为start_urls,首要任务就是分析当前页面是否为动态加载,何为js动态加载页面可以百度一下~这里推荐一个小chrome插件—Toggle JavaScript插件,这个插件的功能就是方便地开启和关闭chrome的javascript功能。使用也很方便,点一下关闭,再点一下开启,对我们的起始豆瓣分类页关闭JavaScript功能后,分类及电影等都没有加载,可知本页为动态加载,那么问题来了,如何进行JS动态加载页面的抓取呢?

首先,动态加载的页面,一般数据会在Network的JS或者 XHR 类目里。如下图:

此时这个类目是空的,点击加载更多,看此时给我们返回什么信息,                                                                                                                               

将链接在新窗口打开,返回的是一个json页面,                                                                                                                                                                

如果你的页面是杂乱无章的,同样给你推荐一个好用的chrome插件--JSONView,安装后你会打开新世界的大门。

同样的方式多打开几个页面,观察链接规律:

https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1&start=0

https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1&start=20

https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1&start=40

这时你发现规律了吗?没加载一页url变化的只有最后的start数值,因此如果我们抓取电影分类,翻页循环链接就可以这样写:

for a in range(25): # range(a)当中a为向下翻页的数量
url = 'https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=电影&start={}'.format(a*20)

确定了待抓取的页面链接,下面就开始正式的scrapy抓取工作啦,scrapy是一个python实现的网络爬虫框架,使用异步的方式来实现并发。具体的架构大家可以自行百度一下,本文只介绍详细操作。命令行下进入创建项目的文件夹,输入:

scrapy startproject  EPG_proj

新建scrapy项目之后主要进行操作的几个文件是:

①item.py:这个文件主要用来定义网络爬虫需要采集的字段。本次实验我们尽可能采集更多的字段,部分代码如下:

import scrapyclass EpgprojItem(scrapy.Item):# define the fields for your item here like:# movie_name = scrapy.Field()# 电影名称movie_name = scrapy.Field()# 节目形式program_form = scrapy.Field()# 短评链接shortComment_link = scrapy.Field()# 影评链接filmReview_link = scrapy.Field()# 图片链接image_link = scrapy.Field()# 电影人员链接movieStaff_link = scrapy.Field()# 豆瓣评分movie_rating = scrapy.Field()# 评分人数movie_NumRatingPeople = scrapy.Field()# 链接地址movie_linkAddress = scrapy.Field()# 电影导演movie_director = scrapy.Field()# 电影编剧movie_screenwriter = scrapy.Field()# 电影主演movie_starring = scrapy.Field()# 电影类型movie_type = scrapy.Field()# 制片国家/地区movie_productionCountry = scrapy.Field()

②EPGSpider.py:此文件是整个爬虫的主体部分,页面的url获取和解析获取数据都在此文件当中。

首先先介绍一下豆瓣的在之前是反爬虫,豆瓣之前很少有反爬虫措施,不过现在也开始在逐步的进行反爬虫的操作。针对豆瓣的反爬虫,我们主要进行了如下的一些处理:

a、单位时间内的点击次数,这个是很多网站都会有的反爬虫措施,豆瓣网站的每分钟点击次数具体数值不太清楚,但实际操作应该是每台机器每分钟不超过40次,我们选择每点击一次页面,就暂停3秒来防止被封。在settings.py文件中设置访问延时。

DOWNLOAD_DELAY = 1.5

b、UA设置,即用户代理user_agent,关于这个的设置网上有很多,但本实验采用的是如下这种方式:

from faker import Factory
f = Factory.create()
USER_AGENT = f.user_agent()

c、cookie的设置,有些网站会根据访问的cookie判断是否为机器人,除非特殊要求,我们都禁用cookie,在settings.py做如下设置:

COOKIES_ENABLED = False

d、IP代理,这是应对反爬虫的大招,可是免费的代理速度太慢,优质的代理收费又太高,所以个人推荐最好的方式就是ADSL重拨,关于这个内容会在之后的博客详细介绍,目的就是通过ADSL的重拨使IP发生变化,穷人的IP池。

e、设置随机请求头。

    headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Connection': 'keep-alive','Referer': 'https://accounts.douban.com/','Host': 'movie.douban.com','User-Agent': f.user_agent()}

以上是关于反爬虫的一些措施,对于一些页面,比如影评信息等需要登陆之后才可以大批量抓取,本着完善程序的想法,我们也做了豆瓣的模拟登陆。详细代码如下:

    def parse_before_login(self, response):print("登录前表单填充")captcha_id = response.xpath('//input[@name="captcha-id"]/@value').extract_first()captcha_image_url = response.xpath('//img[@id="captcha_image"]/@src').extract_first()if captcha_image_url is None:print(u"登录时无验证码")formdata = {"redir": "https://movie.douban.com/","source": "movie","form_email": "你的账号",# 请填写你的密码"form_password": "你的密码",}print(u"登录中")# 提交表单return scrapy.FormRequest.from_response(response, meta={"cookiejar": response.meta["cookiejar"]}, headers=self.headers, formdata=formdata, callback=self.parse_after_login)else:print("登录时有验证码")save_image_path = "D:/image/captcha.jpeg"# 将图片验证码下载到本地urllib.urlretrieve(captcha_image_url, save_image_path)# 打开图片,以便我们识别图中验证码try:im = Image.open('captcha.jpeg')im.show()except:pass# 手动输入验证码captcha_solution = raw_input('根据打开的图片输入验证码:')formdata = {"source": "None","redir": "https://www.douban.com","form_email": "你的账号",# 此处请填写密码"form_password": "你的密码","captcha-solution": captcha_solution,"captcha-id": captcha_id,"login": "登录",}print("登录中")# 提交表单return scrapy.FormRequest.from_response(response, meta={"cookiejar": response.meta["cookiejar"]},headers=self.headers, formdata=formdata,callback=self.parse_after_login)

此处的难点在于登陆时有时会有验证码,我们的方案时将验证码存到本地,然后进行加载,手工输入验证码。再之后的内容就是XPATH的获取了,这里也推荐一个极好用的浏览器插件叫XPath Helper,具体用法可自行百度。详细代码存在百度云盘,大家可下载参考,也欢迎提出宝贵建议。

百度网盘链接:https://pan.baidu.com/s/1xXCC-s3KpC3jxJ8a2qd0pQ 密码:o4up

3、pipelines.py:这个文件主要是用来对爬取的数据进行进一步的处理,本次实验我们将爬取的数据存储到mongoDB数据库当中,具体代码如下:

class EpgprojPipeline(object):def __init__(self):host = settings['MONGODB_HOST']port = settings['MONGODB_PORT']dbName = settings['MONGODB_DBNAME']client = pymongo.MongoClient()tdb = client[dbName]self.post = tdb[settings['MONGODB_DOCNAME']]def process_item(self, item, spider):movieInfo = dict(item)self.post.insert(movieInfo)return item

后记:以上就是整个小实验的执行过程,中间难免还有一些有待优化的内容,有一些细节问题也不太清晰,后续的博客会详细探讨,也欢迎大家好的建议。

scrapy爬取豆瓣所有电影信息(新手入门超详细版)相关推荐

  1. [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

    这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对 ...

  2. scrapy爬取豆瓣top250电影数据

    scrapy爬取豆瓣top250电影数据 scrapy框架 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. sc ...

  3. 爬虫实战(一)利用scrapy爬取豆瓣华语电影

    爬虫第一个项目是爬取豆瓣华语电影,后面将对这部分数据进行分析. 本文也是发表于『运筹OR帷幄』微信公众号的<用数据带你了解电影行业-华语篇>的爬虫介绍篇. 1. 爬取思路 在观察了豆瓣每个 ...

  4. python采用requests+bs4爬取豆瓣top250电影信息

    爬取豆瓣top250电影说明 (链接:https://movie.douban.com/top250,可爬取一页或者多页(输出电影的正标题(肖申克的救赎),副标题( The Shawshank Red ...

  5. python爬取豆瓣电影信息_Python|简单爬取豆瓣网电影信息

    前言: 在掌握一些基础的爬虫知识后,就可以尝试做一些简单的爬虫来练一练手.今天要做的是利用xpath库来进行简单的数据的爬取.我们爬取的目标是电影的名字.导演和演员的信息.评分和url地址. 准备环境 ...

  6. Python|简单爬取豆瓣网电影信息

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 欢迎加入团队圈子!与作者面对面!直接点击! 前言: 在掌握一些 ...

  7. Scrapy爬取豆瓣分类电影

    由于毕业设计推荐系统需要大量电影信息数据,从豆瓣电影爬取了一万多条电影数据,记录一下第一次爬数据,同时感谢豆瓣电影平台提供的数据. 爬取思想:豆瓣选电影页面用的是JS动态渲染,用谷歌浏览器查看点击加载 ...

  8. scrapy爬取豆瓣top250详情信息

    ​ 1.项目简介 本次项目利用scrapy爬虫框架实现抓取豆瓣top250的详情页信息,主要字段如下: 主要字段: Num-->电影排名 DetailLink-->详情页链接 Title- ...

  9. python爬取豆瓣电影top250_【Python3爬虫教程】Scrapy爬取豆瓣电影TOP250

    今天要实现的就是使用是scrapy爬取豆瓣电影TOP250榜单上的电影信息. 步骤如下: 一.爬取单页信息 首先是建立一个scrapy项目,在文件夹中按住shift然后点击鼠标右键,选择在此处打开命令 ...

最新文章

  1. linux===Ubuntu 上安装 Node.js
  2. 挪动以太坊:比特币现金的新功能使其成为智能合约竞争者
  3. Fastify 2.0.1 和 1.14.3 发布,极速 Node.js Web 框架
  4. Nginx快速搭建和基本使用
  5. SQL Server2014 SP2新增的数据库克隆功能
  6. linux管理员清理主目录,在Linux上如何清理垃圾系统管理员
  7. 问题记录 | 配置ubuntu18.04+cuda9.0+cudnn服务器tensorflow-gpu深度学习环境
  8. 寒心!一个开发者就这样离开了!
  9. vofuria的开发(3)将vuforia引入新建立的工程
  10. 查询字符串中子字符串所有出现位置
  11. native2ascii命令详解
  12. SMP多核启动(二):PSCI
  13. c语言vs2013下载官方下载,Microsoft Visual C++2013运行库下载
  14. 黑暗传说单机自动挂机_黑暗传说单机RPG
  15. storm风暴英雄 tempo_Tempostorm战队攻略:新版本下的终结者天赋
  16. 使用O2OA二次开发搭建企业办公平台(十三)流程开发篇:报销审批流程表单开发...
  17. eclipse中文版 中英文切换 + 全语言转换
  18. C++关键段、原子锁、互斥量及信号量的实现和区别
  19. 1-VIV-Android控件之TextView
  20. SQL Server2016入门使用

热门文章

  1. 软考系统分析师倒计时第10天
  2. NKOJ 3762 守夜人 (并查集)
  3. 宏华Atsl ver 2000 Build 20020225 65 零售版
  4. 利用java解一元二次方程
  5. js弹出页面窗口和关闭
  6. 北航软件工程硕士_炸了!软件工程超高报录比31:1,北京航空航天大学,连非全都有近千人报考!...
  7. vue中keepAlive缓存清除的问题
  8. 这八道经典指针笔试题你都会做嘛?
  9. JS中用一个button按钮实现开关灯效果
  10. Java 类的初始化