当前位置:   article > 正文

教你利用Scrapy框架全站爬取视频资源信息_scrapy爬取视频

scrapy爬取视频

1、先在settings.py把配置配好

  1. # 关闭ROBOTS协议
  2. ROBOTSTXT_OBEY = False
  3. # 设置log 日志等级
  4. LOG_LEVEL = 'WARNING'
  5. # 开启管道
  6. ITEM_PIPELINES = {
  7. 'mini_resource_scrapy.pipelines.MiniResourceScrapyPipeline': 300,
  8. }
  9. # 设置USER_AGENT 这个直接打开浏览器,F12控制台随便找个请求,请求头信息里面有
  10. USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

2、在items.py文件中定义数据模型,把要爬的字段在这里定义,我这里贴代码给大家参考 

  1. import scrapy
  2. class MiniResourceScrapyItem(scrapy.Item):
  3. # define the fields for your item here like:
  4. # name = scrapy.Field()
  5. _id = scrapy.Field() # 数据id
  6. add_date = scrapy.Field() # 视频添加的时间
  7. title = scrapy.Field() # 标题
  8. director = scrapy.Field() # 导演
  9. stars = scrapy.Field() # 主演,这里我存数组
  10. type = scrapy.Field() # 电影类型 这里我存数组
  11. area = scrapy.Field() # 电影地区
  12. year = scrapy.Field() # 电影年份
  13. describe = scrapy.Field() #电影描述
  14. source = scrapy.Field() # 视频来源,(这里我都写目前爬取的网站地址)
  15. video_url = scrapy.Field() # 视频播放url地址
  16. cover_img = scrapy.Field() # 视频封面url 地址
  17. score = scrapy.Field() # 电影评分 (我爬的网站没有拿到评分信息,后面都给初始值 0 )
  18. play_count = scrapy.Field() # 视频播放次数 (给初始值 0)
  19. is_show = scrapy.Field() # 前端是否展示
  20. is_new = scrapy.Field() # 是否是最新

3、配置管道pipelines.py, 用于把爬取来的数据存起来,存文件活着数据库这里随你,这里我直接存文件

  1. import codecs,json
  2. # 用codecs提供的open方法来指定打开的文件的语言编码,它会在读 取的时候自动转换为内部unicode
  3. class MiniResourceScrapyPipeline(object):
  4. def __init__(self):
  5. self.file = codecs.open('movie.json', 'w', encoding='utf-8')
  6. # 在open_spider 方法中打开文件也可以,爬虫启动的时候,文件之打开一次,爬虫结束的时候关闭文件
  7. # def open_spider(self, spider):
  8. # pass
  9. # 在文件里面存入json 数据
  10. def process_item(self, item, spider):
  11. lines = json.dumps(dict(item), ensure_ascii=False) + "\n"
  12. self.file.write(lines)
  13. return item
  14. # 爬虫结束,关闭文件
  15. def spider_closed(self, spider):
  16. self.file.close()

4、正式开始我们的爬虫代码 爬的是 https://www.80mv.cc/ 这个视频网站,大家也可以用别的网站爬,xpath要写正确啊,逻辑都一样

  1. import scrapy
  2. from ..items import MiniResourceScrapyItem
  3. import re
  4. class Mv80Spider(scrapy.Spider):
  5. name = 'mv80'
  6. total_page = 4 # 这边我只爬取3页数据
  7. page_index = 1 # 从第一页开始
  8. origin = 'https://www.80mv.cc'
  9. id_compile = re.compile(r'80detail_(\d+).html')
  10. r_compile = re.compile(r'https:(.+)/index.m3u8', re.I)
  11. # allowed_domains = ['www.80mv.cc']
  12. start_urls = ['https://www.80mv.cc/80show_dianying--------{}---.html']
  13. # 设置爬取的开始url地址
  14. def start_requests(self):
  15. for i in range(self.page_index, self.total_page):
  16. yield scrapy.Request(url=self.start_urls[0].format(i))
  17. def parse(self, response):
  18. lis = response.xpath('//ul[contains(@class,"stui-vodlist clearfix")]/li')
  19. for tag in lis:
  20. page_url = tag.xpath('.//a[@class="stui-vodlist__thumb lazyload"]/@href').extract_first()
  21. _id = self.id_compile.search(page_url).groups()[0]
  22. # 电影标题
  23. title = tag.xpath('.//a[@class="stui-vodlist__thumb lazyload"]/@title').extract_first()
  24. # 电影封面图
  25. cover_img = tag.xpath('.//a[@class="stui-vodlist__thumb lazyload"]/@data-original').extract_first()
  26. # 电影详情内页地址
  27. detail_url = tag.xpath('.//a[@class="stui-vodlist__thumb lazyload"]/@href').extract_first()
  28. # print(title, cover_img)
  29. # 实例化数据模型 把数据存入
  30. item = MiniResourceScrapyItem()
  31. item['title'] = title
  32. item['cover_img'] = cover_img
  33. item['_id'] = _id
  34. # 进入详情页继续爬取详情信息
  35. yield scrapy.Request(
  36. url='{}{}'.format(self.origin, detail_url),
  37. callback=self.video_detail,
  38. meta={'item': item})
  39. # 视频详情页
  40. def video_detail(self, response):
  41. item = response.meta['item']
  42. des = response.xpath('//div[@class="stui-content__detail"]')
  43. stars = des.xpath('./p[1]//a//text()').extract()
  44. director = des.xpath('./p[2]/a/text()').extract_first()
  45. describe = des.xpath('./p[5]/span[2]/text()').extract_first()
  46. m_type = des.xpath('string(./p[3]/span[contains(text(), "类型")]/following-sibling::text())')\
  47. .extract_first().strip().split(',')
  48. area = des.xpath('string(./p[3]/span[contains(text(), "地区")]/following-sibling::text())')\
  49. .extract_first().strip()
  50. year = des.xpath('string(./p[3]/span[contains(text(), "年份")]/following-sibling::text())')\
  51. .extract_first().strip()
  52. add_date = des.xpath('string(./p[4]/span[contains(text(), "时间")]/following-sibling::text())') \
  53. .extract_first().strip()
  54. video_page_url = response.xpath('//ul[@class="stui-content__playlist clearfix"]/li/a/@href').extract_first()
  55. video_page_url = '{}{}'.format(self.origin, video_page_url)
  56. item['stars'] = stars
  57. item['type'] = m_type # 类型
  58. item['area'] = area # 区域
  59. item['year'] = year # 年代
  60. item['director'] = director # 导演
  61. item['describe'] = describe # 描述
  62. item['score'] = 0 # 没有电影评分,给个初始值
  63. item['play_count'] = 0 # 点击次数 给个初始值
  64. item['is_show'] = True # 是否展示
  65. item['is_new'] = True if year == '2021' else False # 是否是最新
  66. item['add_date'] = add_date
  67. item['source'] = '80S影院'
  68. yield scrapy.Request(url=video_page_url, callback=self.video_play_page, meta={'item': item})
  69. # 视频播放页
  70. def video_play_page(self, response):
  71. item = response.meta['item']
  72. script_str = response.xpath('//div[@class="stui-player__video clearfix"]/script[1]/text()').extract_first()
  73. g_url = self.r_compile.search(script_str)
  74. video_url = g_url.group().replace('\\', '')
  75. item['video_url'] = video_url
  76. print(item)
  77. yield item

 5、这是我爬的数据

代码结束,文字很少,全是代码,如果有不明白的地方可以留言,大家相互学习讨论

!!!!!!下面是我自己的小程序,请大家多多扫码打开给点支持吧!!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/141401?site
推荐阅读
相关标签
  

闽ICP备14008679号