1、创建Scrapy项目

scrapy startproject XPC

2.进入项目目录,使用命令genspider创建Spider(注意后面允许爬取的域要增加)

scrapy genspider xpc xinpianchang.com

3、定义要抓取的数据(处理items.py文件)

# -*- coding: utf-8 -*-import scrapyclass XpcItem(scrapy.Item):# 视频idv_id = scrapy.Field()# 视频名字video_name = scrapy.Field()# 视频分类category = scrapy.Field()# 上传时间up_time = scrapy.Field()# 播放量play_counts = scrapy.Field()# 点赞量like_counts = scrapy.Field()# 视频链接地址video_url = scrapy.Field()# 视频介绍video_info = scrapy.Field()# json文件地址,这个页面可以查看到视频的播放地址video_urljson_url = scrapy.Field()# 视频详情页地址video_detail_url = scrapy.Field()

4、编写提取item数据的Spider(在spiders文件夹下:xpc.py)

# -*- coding: utf-8 -*-
# 获取新片场作品
import re
import datetime
import scrapy
from ..items import XpcItem
import jsonclass XpcSpider(scrapy.Spider):name = 'xpc'allowed_domains = ['xinpianchang.com','openapi-vtom.vmovier.com']start_urls = ['https://www.xinpianchang.com/channel/index/type-/sort-like/duration_type-0/resolution_type-/page-1']def parse(self, response):# 获取视频id,每页40条video_id = response.xpath('//div[@class="channel-con"]/ul[@class="video-list"]/li/@data-articleid').extract()for id in video_id:# 视频详情页地址video_detail_url = 'https://www.xinpianchang.com/a{}'.format(id)yield scrapy.Request(url=video_detail_url,meta={'meta_1':video_detail_url},callback=self.video_detail)# 非登录状态只能获取20页total_page = 20for page in range(2,total_page+1):print("处理第%s页..."%page)url = 'https://www.xinpianchang.com/channel/index/type-/sort-like/duration_type-0/resolution_type-/page-'yield scrapy.Request(url=url+str(page),callback=self.parse)# 视频详情页def video_detail(self,response):# 在spider运行到某个位置时暂停,查看被处理的response等情况# from scrapy.shell import inspect_response# inspect_response(response, self)meta_1 = response.meta['meta_1']# with open(meta_1.split('a')[-1] + ".html",'w',encoding='utf-8')as f:#     f.write(response.text)item = XpcItem()# 视频详情页面item['video_detail_url'] = meta_1item['v_id'] = meta_1.split('a')[-1]# 视频名字video_name = response.xpath('//div[@class="title-wrap"]/h3/text()').extract_first()item['video_name'] = video_name.strip()# 视频分类# category = response.xpath('//span/span[contains(@class,"cate")]//text()').extract()# item['category'] = "".join([s.strip() for s in category])# 视频分类可能有多个,先判断有几个分类,取奇数个,偶数个是个|符号category_count = len(response.xpath("//span[contains(@class,'cate-box')]/span/a[1]"))if category_count >1:category_list = []for i in range(1,category_count+1):c = response.xpath("//span[contains(@class,'cate-box')]/span["+str(2*i-1)+"]/a/text()").extract()category_list.append("-".join([s.strip() for s in c]))item['category'] = ",".join(category_list)else:category = response.xpath('//span/span[contains(@class,"cate")]//text()').extract()item['category'] = "".join([s.strip() for s in category])# 视频上传时间,时间会显示昨天不知道几号要转换up_time = response.xpath('//div/span[contains(@class,"update-time")]/i/text()').get()today = datetime.datetime.today()if '昨天' in up_time:yes = today - datetime.timedelta(days=1)up_time = up_time.replace('昨天', yes.strftime("%Y-%m-%d"))elif '今天' in up_time:up_time = up_time.replace('今天', today.strftime("%Y-%m-%d"))item['up_time'] = up_time# 播放量play_counts = response.xpath('//div/i[contains(@class,"play-counts")]/@data-curplaycounts').get()item['play_counts'] = play_counts# 喜欢量,点赞量like_counts = response.xpath('//span/span[contains(@class,"like-counts")]/@data-counts').get()item['like_counts'] = like_counts# 视频连接地址# video_url = response.xpath('//*[@id="xpc_video"]/source/@src').extract_first()# item['video_url'] = video_url.strip()# 视频介绍video_info= response.xpath('//div[@class="filmplay-info"]/div/p[1]/text()').extract()video_info = [s.strip() for s in video_info]item['video_info']= ','.join(video_info)# data-vid是json文件地址的一部分:960VAm7OGE7DRnW8# https://openapi-vtom.vmovier.com/v3/video/960VAm7OGE7DRnW8?expand=resource&usage=xpc_web&appKey=61a2f329348b3bf77# ①通过xpath获取data_vid# data_vid = response.xpath('//div[@class="filmplay-data"]/div/span/a/@data-vid').extract_first()# ②通过正则获取data_vidpatt_vid = re.compile(r'vid = "(\w+)";')data_vid = patt_vid.findall(response.text)[0]# modeServerAppKey=61a2f329348b3bf77这个值不知道会不会变patt_modeServerAppKey = re.compile(r'modeServerAppKey = "(\w+)";')data_modeServerAppKey = patt_modeServerAppKey.findall(response.text)[0]# json文件地址,这个页面可以查看到视频的播放地址video_urljson_url = 'https://openapi-vtom.vmovier.com/v3/video/{}?expand=resource&usage=xpc_web&appKey={}'.format(data_vid,data_modeServerAppKey)item['json_url'] = json_urlyield scrapy.Request(url=json_url,meta={'meta_2':item},callback=self.video_address)# 视频地址def video_address(self,respones):item = XpcItem()meta_2 = respones.meta['meta_2']item['v_id'] = meta_2['v_id']item['video_name'] = meta_2['video_name']item['video_detail_url'] = meta_2['video_detail_url']item['video_info'] = meta_2['video_info']item['json_url'] = meta_2['json_url']item['category'] = meta_2['category']item['up_time'] = meta_2['up_time']item['play_counts'] = meta_2['play_counts']item['like_counts'] = meta_2['like_counts']json_html = json.loads(respones.text)# resource = {'default':'','progressive':'','lowest':''},这里面有不同的清晰度,要进行判断resource = json_html['data']['resource']if 'default' in resource.keys():item['video_url'] = json_html['data']['resource']['default']['url']elif 'progressive' in resource.keys():item['video_url'] = json_html['data']['resource']['progressive'][0]['url']else:item['video_url'] = json_html['data']['resource']['lowest']['url']yield item

5.处理pipelines管道文件保存数据,将结果保存到数据库中(pipelines.py)

# -*- coding: utf-8 -*-import pymysqlclass MySqlPipeline(object):@classmethoddef from_crawler(cls,crawler):cls.MYSQL_HOST = crawler.settings.get('MYSQL_HOST')cls.MYSQL_PORT = crawler.settings.get('MYSQL_PORT')cls.MYSQL_USER = crawler.settings.get('MYSQL_USER')cls.MYSQL_PASSWD = crawler.settings.get('MYSQL_PASSWD')cls.MYSQL_DBNAME = crawler.settings.get('MYSQL_DBNAME')cls.MYSQL_CHARSET = crawler.settings.get('MYSQL_CHARSET')return cls()def __init__(self):self.db = pymysql.connect(host=self.MYSQL_HOST,port=self.MYSQL_PORT,user=self.MYSQL_USER,passwd=self.MYSQL_PASSWD,db=self.MYSQL_DBNAME,charset=self.MYSQL_CHARSET)self.cursor = self.db.cursor()def process_item(self,item,spider):try:# 尝试创建xpc表# self.cursor.execute('DROP table IF EXISTS xpc')sql = 'CREATE TABLE IF NOT EXISTS xpc(v_id BIGINT primary key not null COMMENT "视频页id",' \'video_name varchar(200),category varchar(100),up_time VARCHAR(50),play_counts INT(13),like_counts INT(13),' \'video_detail_url varchar(100),video_url varchar(200),video_info LONGTEXT,' \'json_url varchar(300))ENGINE =InnoDB DEFAULT CHARSET=utf8mb4;'self.cursor.execute(sql)except Exception as e:print("xpc表已存在,无需创建!")try:# 去重处理self.cursor.execute("SELECT v_id from xpc WHERE v_id=%s;",item['v_id'])repetition = self.cursor.fetchone()keys, values = zip(*item.items())# 如果存在,则不重新插入,只更新if repetition:# ON DUPLICATE KEY UPDATE:数据已存在,只是更新部分字段值,否则插入重复key值数据会报错sql = """INSERT INTO xpc({})VALUES ({}) ON DUPLICATE KEY UPDATE {};""".format(','.join(keys),','.join(['%s']*len(values)),','.join(['{}=%s'.format(k) for k in keys]))self.cursor.execute(sql,values*2)else:sql = """INSERT INTO xpc({})VALUES ({});""".format(','.join(keys),','.join(['%s'] * len(values)))self.cursor.execute(sql, values)self.db.commit()# print(self.cursor._last_executed)return itemexcept Exception as e:print("出错ERROR:",e)self.db.rollback()def close_spider(self,spider):print("mysql数据库处理完毕")self.cursor.close()self.db.close()

6.配置settings文件(settings.py)

ROBOTSTXT_OBEY = False# 配置数据库
MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'
MYSQL_DBNAME = 'python5'
MYSQL_CHARSET = 'utf8mb4'DOWNLOAD_DELAY = 3DEFAULT_REQUEST_HEADERS = {
'User-Agesettingsnt': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);',# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',# 'Accept-Language': 'en',
}ITEM_PIPELINES = {'XPC.pipelines.MySqlPipeline': 300,
}# 还可以将日志存到本地文件中(可选添加设置)
LOG_FILE = "xpc.log"
LOG_LEVEL = "DEBUG"
# 包含打印信息也一起写进日志里
LOG_STDOUT = True

7.以上设置完毕,进行爬取:执行项目命令crawl,启动Spider:

scrapy crawl xpc

利用scrapy简单爬取新片场前20页视频数据,并存入mysql数据库相关推荐

  1. python爬取豆瓣电影top250_利用python爬取豆瓣电影Top250,并把数据放入MySQL数据库...

    在学习了python基础后,一心想着快速入门爬虫,因为我就是为爬虫而学的python,所以就找了这个豆瓣电影来爬取.好了,废话不多说,进入正题 1.找到网页并分析网页结构 首先进入豆瓣电影Top250 ...

  2. python爬虫利用Scrapy框架爬取汽车之家奔驰图片--实战

    先看一下利用scrapy框架爬取汽车之家奔驰A级的效果图 1)进入cmd命令模式下,进入想要存取爬虫代码的文件,我这里是进入e盘下的python_spider文件夹内 C:\Users\15538&g ...

  3. 利用Scrapy框架爬取LOL皮肤站高清壁纸

    利用Scrapy框架爬取LOL皮肤站高清壁纸  Lan   2020-03-06 21:22   81 人阅读  0 条评论 成品打包:点击进入 代码: 爬虫文件 # -*- coding: utf- ...

  4. 利用Scrapy框架爬取前途无忧招聘信息

    利用Scrapy框架爬取前途无忧招聘信息 关于安装和命令使用可参考:https://docs.scrapy.org/en/1.7/intro/install.html 先创建项目和爬虫文件 分析网站 ...

  5. python爬虫开发数据库设计入门经典_Python3实现的爬虫爬取数据并存入mysql数据库操作示例...

    本文实例讲述了Python3实现的爬虫爬取数据并存入mysql数据库操作.分享给大家供大家参考,具体如下: 爬一个电脑客户端的订单.罗总推荐,抓包工具用的是HttpAnalyzerStdV7,与chr ...

  6. 利用scrapy框架爬取动态加载的数据

    在爬取有些网站的是后,数据不一定全部是可视化界面的,当我们拖动滚动条时才会加载其他的数据,如果我们也想爬取这部分数据,就需要使用selenium模块,在scrapy里可以结合该模块修改返回对象 一.编 ...

  7. scrapy简单爬取内容

    scrapy的简单爬取不用新建项目.安装好scrapy后编写爬虫文件 import scrapyclass ZaobaoScrapy(scrapy.Spider):name = "zaoba ...

  8. 运用Scrapy框架爬取淘车网十七万二手车数据

    本篇内容将使用scrapy框架爬取淘车网所有二手车信息. 下面开始讲解下如何爬取我们想要的数据: 明确爬取目标: 首先,进入官网:https://www.taoche.com/ 进入官网发现,我们要获 ...

  9. 初试python爬虫(简单爬取站长之家第一页图片)

    爬取站长之家第一页图片 爬虫 ----需要借助第三方库 requests beautifulsoup4 html5lib 1.模拟浏览器发送请求 并且接收服务器的响应数据 requests 2.解析并 ...

最新文章

  1. RHEL5(CentOS)下nginx+php+mysql+tomcat+memchached配置全过程(转)
  2. python【数据结构与算法】二分模板
  3. 如何用Visual Studio Code远程调试运行在服务器上的nodejs应用
  4. java oracle临时表,JdbcTemplate操作oracle的临时表
  5. 【软件测试】软件可测试性
  6. linux目录文件变化,Linux下监测目录或文件的变化---inotify
  7. 表锁 行锁 页锁 是什么区别
  8. tomcat 内存溢出配置
  9. maven配置时报错NB: JAVA_HOME should point to a JDK not a JRE**解决方法
  10. plpgsql 编译执行
  11. 微信二维码扫码登录思路
  12. Exchange如何配置安装导入SSL数字证书
  13. 【老王读Spring AOP-3】Spring AOP 执行 Pointcut 对应的 Advice 的过程
  14. 电气工程类期刊最新数据+2019年电气工程领域的中文期刊(EI期刊+中文核期刊)
  15. Kalilinux2017.2安装搜狗拼音输入法
  16. 牛顿法与牛顿下山法(切线法)
  17. python 验证码 高阶验证
  18. 正则表达式匹配多个空格和制表符
  19. xrdp在ylmf下的问题
  20. 隐形守护者服务器维护,隐形守护者更新公告一览 隐形守护者更新3.5有什么内容_游侠网...

热门文章

  1. unity3D中paint in 3D插件的简单使用
  2. 拆分pdf文件最简单的方法?PDF拆分成多个文件工具推荐
  3. 固态硬盘的好处以及固态硬盘和普通硬盘的区搜索别
  4. lua如何判断是否支持cookie_如何判断电磁炉是否故障?
  5. 彻底清除谷歌浏览器注册表方法(简单有效)
  6. 中国航空货运行业投资战略分析与发展动向展望报告2021-2027年
  7. 在技术上如何发送一条短信?
  8. java(借助eclipe操作)汉化
  9. WMP11播放列表显示法
  10. Word 2013 Bible 免积分下载