由于毕业设计推荐系统需要大量电影信息数据,从豆瓣电影爬取了一万多条电影数据,记录一下第一次爬数据,同时感谢豆瓣电影平台提供的数据。

爬取思想:豆瓣选电影页面用的是JS动态渲染,用谷歌浏览器查看点击加载时发送的URL,解析拼接为新的URL,在Scrapy框架中以该URL为入口,每次获取到20个电影数据,再分别访问20个电影的URL地址获取到详细的电影数据,用Xpath解析html页面。

具体步骤如下:

1.解析拼接url

访问豆瓣页面点击加载更多,谷歌查看此时后台发现它发送了一个请求:

https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start=20

通过这个URL请求可以获取到20条JSON格式的电影数据,每次通过对start参数自增20获取到数据。

2.获取数据

请求url获取到如下的JSON格式数据:

解析获取JSON格式数据:

dicts=json.loads(response.body)['data']

循环20个电影列表访问每个电影详情页的url获取HTML页面

movie_url=dict['url']
movie_html=requests.get(movie_url)
root = etree.HTML(movie_html.content)
movies=root.xpath('//div[@id="content"]')

用Xpath解析HTML页面元素获取到数据,并且给item

                   movie_id=movie_url[33:-1]movie_title=each.xpath('.//h1/span[1]/text()')movie_title = ",".join(movie_title)release_year=each.xpath('.//h1/span[2]/text()')release_year = ",".join(release_year).split(')')[0].split('(')[1]movie_img=each.xpath('.//div[@id="mainpic"]/a/img/@src')movie_img = ",".join(movie_img)director=each.xpath('.//div[@id="info"]/span[1]/span[2]/a/text()')director=",".join(director)screenwriter=each.xpath('.//div[@id="info"]/span[2]/span[2]/a/text()')screenwriter = ",".join(screenwriter)starring=each.xpath('.//div[@id="info"]//a[@rel="v:starring"]/text()')starring = ",".join(starring)type=each.xpath('.//div[@id="info"]/span[@property="v:genre"]/text()')type = ",".join(type)production_country=each.xpath('.//div[@id="info"]/text()[preceding-sibling::span[text()="制片国家/地区:"]][following-sibling::br]')[0]language=each.xpath('.//div[@id="info"]/text()[preceding-sibling::span[text()="语言:"]][following-sibling::br]')[0]release_time=each.xpath('.//div[@id="info"]/span[@property="v:initialReleaseDate"]/text()')release_time = ",".join(release_time)length=each.xpath('.//div[@id="info"]/span[@property="v:runtime"]/text()')length = ",".join(length)url=movie_urlimdb_link=each.xpath('.//div[@id="info"]/a/@href')imdb_link = ",".join(imdb_link)alias=each.xpath('.//div[@id="info"]/text()[preceding-sibling::span[text()="又名:"]][following-sibling::br]')if alias:alias=alias[0]score=each.xpath('.//div[@id="interest_sectl"]/div[1]/div[2]/strong/text()')score = ",".join(score)synopsis=each.xpath('.//div[@id="link-report"]/span/text()')synopsis = ",".join(synopsis).replace(" ","").replace("\u3000","")

重构URL地址,再进行获取电影数据

        url = response.urlurl = url.split('=')url[-1] = str(int(url[-1])+20)next_url = '='.join(url)yield scrapy.Request(next_url,callback=self.parse,dont_filter=True)

3.将数据存到Mysql数据库

class DoubanmoviePipeline(object):def __init__(self,dbpool):self.dbpool=dbpool@classmethoddef from_settings(cls,settings):dbparams=dict(host=settings['MYSQL_HOST'],db=settings['MYSQL_DBNAME'],user=settings['MYSQL_USER'],password=settings['MYSQL_PASSWORD'],charset='utf8',cursorclass=pymysql.cursors.DictCursor,use_unicode=False,)dbpool=adbapi.ConnectionPool('pymysql',**dbparams)return cls(dbpool)def process_item(self, item, spider):asynitem = copy.deepcopy(item)if isinstance(item,DoubanmovieItem):query=self.dbpool.runInteraction(self._conditional_insert_movie,asynitem)query.addErrback(self._handle_error,asynitem,spider)elif isinstance(item,MovieRcmdItem):query=self.dbpool.runInteraction(self._conditional_insert_moviercmd,asynitem)query.addErrback(self._handle_error,asynitem,spider)return asynitemdef _conditional_insert_movie(self,tx,item):sql="insert into movie(movie_id,movie_title,movie_img,director,screenwriter,starring,type,production_country,language,release_time,length,release_year,url,imdb_link,alias,score,synopsis) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"params=(item['movie_id'], item['movie_title'],item['movie_img'],item['director'],item['screenwriter'],item['starring'],item['type'], item['production_country'],item['language'],item['release_time'],item['length'],item['release_year'],item['url'], item['imdb_link'],item['alias'],item['score'],item['synopsis'])tx.execute(sql,params)

注意对数据进行深拷贝,否则爬取速度太快已爬取的数据还没存入数据库,后面的数据就已经覆盖掉前面的数据。

4.反爬虫策略

  • 在setting里面禁用cookie
  • 使用IP代理,购买IP代理池(这里买的是阿布云的IP代理)或者网上找IP代理池
  • 随机UserAgent头

最后爬取了一万多条数据,如果只是做推荐系统的话,不需要太多的国家等这么多详细信息,网上也有很多已经爬取好的数据,我这里是做的Web推荐系统,所以需要更多详细的电影数据才自己按需求爬取的数据。另外,如果只是需要少量数据的话可以使用一些爬虫软件,比如八爪鱼、火车头、后羿采集器。我个人比较喜好后羿采集器,感觉定制规则方便很多。

Scrapy爬取豆瓣分类电影相关推荐

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

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

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

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

  3. scrapy爬取豆瓣所有电影信息(新手入门超详细版)

    本次小实验目标就是爬取豆瓣所有的电影,我们以豆瓣的分类页(https://movie.douban.com/tag/#/)作为start_urls,首要任务就是分析当前页面是否为动态加载,何为js动态 ...

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

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

  5. python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己

    本文不是python.scrapy的教程,而是分享一个好玩的点子. python教程请看python教程,scrapy教程请看scrapy教程 爬取豆瓣高分电影教程参考python爬虫入门笔记:用sc ...

  6. 爬取豆瓣Top250电影

    爬取豆瓣Top250电影数据一直是爬虫小白的入门练手项目,下面就来分享一下自己的爬取过程. 开始之前,先简单写一下需求和实现思路. 需求: 爬取豆瓣电影Top250的数据,数据包含排名.电影名称.导演 ...

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

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

  8. python 爬取豆瓣top100电影页面

    python 爬取豆瓣top100电影页面 运行结果截图: 代码: (原网站:https://movie.douban.com/top250) 1.将页面保存 避免多次访问 (登陆状态需页面cooki ...

  9. 爬取豆瓣top250电影并分析

    爬取豆瓣top250电影,提取评论关键词,然后将同一国家的关键词做成一个词云,轮廓是每个国家的地图轮廓 爬取数据 需要爬取电影名称.导演.年份.地区和前10个评论除了地区,其他的都没什么问题,我们来研 ...

最新文章

  1. python自动翻译小工具_Python实现翻译小工具
  2. 微信在诺基亚手机登录服务器繁忙,马化腾正式宣布:禁止在该手机上登录QQ和微信?网友:诺基亚再见...
  3. 电脑桌面路径多了个计算机名,文件太多,电脑桌面太乱?一个技巧帮你解决!...
  4. Vue实现仿音乐播放器3-将项目托管到git以及github
  5. 树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
  6. [js] setTimeout的第三个参数有什么用?
  7. n位数的全排列(需要考虑大数的情况)
  8. Redis中的键值过期操作
  9. oracle 列 连续,sql 查寻某列连续的几个值是否相同
  10. 多项式拟合缺点_拟合多项式的最小二乘法
  11. Python数据挖掘-词频统计-实现
  12. Scikit-learn:聚类clustering
  13. Spring实战基础1
  14. 很好的c++和Python混合编程文章
  15. 超神四年的王者荣耀 会被英雄联盟手游顺利推塔吗?
  16. idea 内嵌浏览器 翻译
  17. 各省市大学 全国各个省市重点民办本专科大学
  18. 一个自己实现的js表单验证框架。
  19. requests的基本使用以及爬虫的基本介绍:QQ机器人制作基础
  20. Offset commit failed with a retriable exception. You should retry committing the latest consumed off

热门文章

  1. 2023年MCM/ICM美国大学生数学建模竞赛报名通知
  2. 关于“拉丁方”的C语言程序
  3. 【小沐学Python】Python实现在线电子书(MkDocs + readthedocs + github + Markdown)
  4. Windows查看端口被占用查找步骤
  5. android studio提示HAXM device is not found或者could not start avd
  6. python音频 降噪_谱减法语音降噪的Python实现教程
  7. 关于windows无法登录微软账号一直转圈的问题解决办法
  8. 【统计技术】运营商数据:三大运营商2012年1月手机用户数据
  9. my97DatePicker选择年、季度、月、周、日
  10. 金蝶应收应付模块流程_金蝶KIS财务业务模块操作流程