1.搭建虚拟python3环境(Virtualenvwrapper)

参考http://www.cnblogs.com/it-tsz/p/pyhton.html

2.安装scrapy

前提先安装好pip,setuptools,然后安装以下模块

pip install lxml

pip install twisted

pip install pyopenssl

windows下需要安装pywin32(pip install pywin32)

最后安装scrapy

pip install scrapy

3.通过scrapy生成scrapy spider 工程模版

scrapy startproject <project_name> [project_dir]

如:

scrapy startproject budejie

4.生成spider模块

scrapy genspider [options] <name> <domain>

如:

cd budejie

scrapy genspider getbudejievideo budejie.com

5.修改spider模块(getbudejievideo.py)

# -*- coding: utf-8 -*-
import scrapy
import os
import urllib
from lxml import etree # urlretrieve()的回调函数,显示当前的下载进度
# a为已经下载的数据块
# b为数据块大小
# c为远程文件的大小 def jindu(a, b, c):
if not a:
print("连接打开")
if c < 0:
print("要下载的文件大小为0")
else: per = 100 * a * b / c if per > 100:
per = 100
print("\r当前下载进度为:" + '%.2f%%' % per, end='')
if per == 100:
return True ''' def __init__(self):
self.headers = {
# 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
# 'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
}
''' class GetbudejievideoSpider(scrapy.Spider):
name = 'getbudejievideo'
allowed_domains = ['budejie.com']
start_urls = ['http://budejie.com/video'] cur_page = 1 def parse(self, response):
print('*' * 100) # 创建video文件保持目录
path = os.path.join(os.path.abspath(os.path.curdir), 'videos')
if not os.path.exists(path):
os.mkdir(path)
# 获取当前页所有video 的url try:
data = etree.HTML(response.text)
video_urls = data.xpath('//div[@class="j-video-c"]/div[@data-mp4]') # <a href="2" class="pagenxt">下一页</a>
nextpage = data.xpath('//a[@class="pagenxt"]')
if nextpage:
nextpage = nextpage[0].get('href') except Exception:
print('lxml parse failed------------------------------')
return
if not video_urls:
return
# 下载当前页下所有video url对应的视频文件
for v in video_urls:
# if v:
video_url = v.get('data-mp4')
print('下载:{}'.format(video_url))
p = os.path.join(path, v.get('data-mp4').split('/')[-1]) print(p) if not os.path.exists(p):
try:
urllib.request.urlretrieve(video_url, p, jindu)
except Exception:
print("\n下载文件:{}失败".format(video_url)) # 检测是否有下一页
if nextpage:
if nextpage == '1':
return
nextpage_url = self.start_urls【0】 + '/' + nextpage
            self.cur_page += 1
print('\n下载第{}页视频数据:{}'.format(self.cur_page, nextpage_url))
#通过生成器对新生成的url继续回调parse
yield scrapy.Request(nextpage_url, callback=self.parse) else:
return
4.修改配置文件settings.py以下参数选项
。。。
#以下为模拟浏览器验证
# Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'budejie (+http://www.budejie.com)'
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36' # Obey robots.txt rules 跳过robots协议验证
ROBOTSTXT_OBEY = False
。。。
5.通过scrapy开启爬虫数据采集
scrapy crawl getbudejievideo
6.测试成功。
通过该案例,进一步学习了scrapy,xpath等相关知识,实践过程中提高了分析问题和解决问题的能力,继续加油!

不使用外部xpath库源代码修改spider模块(getbudejievideo.py)修改如下:

# -*- coding: utf-8 -*-
import scrapy
import os
import urllib
import re # urlretrieve()的回调函数,显示当前的下载进度
# a为已经下载的数据块
# b为数据块大小
# c为远程文件的大小 def jindu(a, b, c):
if not a:
print("连接打开")
if c < 0:
print("要下载的文件大小为0")
else:
# global myper
per = 100 * a * b / c if per > 100:
per = 100
print("\r当前下载进度为:" + '%.2f%%' % per, end='')
if per == 100:
return True class GetbudejievideoSpider(scrapy.Spider):
name = 'getbudejievideo'
allowed_domains = ['www.budejie.com']
start_urls = ['http://www.budejie.com/video'] cur_page = 1 def parse(self, response):
print('下载url:{}'.format(response.url))
# 创建video文件保持目录
path = os.path.join(os.path.abspath(os.path.curdir), 'videos')
if not os.path.exists(path):
os.mkdir(path)
# 获取当前页所有video 的url
print('-' * 100)
try:
# data = etree.HTML(response.text)
video_urls = response.xpath('//div[@class="j-video-c"]/div[@data-mp4]').extract()
v_urls=[]
for i in video_urls:
v= re.findall(r'data-mp4="(.*?)"', i,re.M)
if v:
v_urls.append(v[0])
# <a href="2" class="pagenxt">下一页</a>
nextpage = response.xpath('//a[@class="pagenxt"]').extract()
if nextpage:
nextpage = re.findall(r'href="(.*?)"', nextpage[0]) except Exception:
print('lxml parse failed:')
return
if not v_urls:
return
# 下载当前页下所有video url对应的视频文件
for v in v_urls:
# video_url = v.get('data-mp4')
print('下载:{}'.format(v))
p = os.path.join(path, v.split('/')[-1]) print(p) if not os.path.exists(p):
try:
urllib.request.urlretrieve(v, p, jindu)
except Exception:
print("\n下载文件:{}失败".format(v)) # 检测是否有下一页
if nextpage:
if nextpage[0] == '1':
return nextpage_url = self.start_urls[0] + '/' + nextpage[0]
print(nextpage_url) self.cur_page += 1
print('\n下载第{}页视频数据:{}'.format(self.cur_page, nextpage_url))
# 通过生成器对新生成的url继续回调parse
yield scrapy.Request(nextpage_url, callback=self.parse)
else:
return

附属调试模块:(debug.py)

from scrapy import cmdline

if __name__ == '__main__':
cmdline.execute('scrapy crawl getbudejievideo'.split(' '))
from scrapy import cmdline

if __name__ == '__main__':
cmdline.execute('scrapy crawl getbudejievideo'.split(' '))





macOS下python3通过scrapy框架重新生成不得姐网站视频采集过程日志的更多相关文章

  1. Python3安装scrapy框架步骤

    Python3安装scrapy框架步骤 1.       安装wheel a)     Pip install wheel 2.       安装lxml Pip install lxml 3.    ...

  2. scrapy框架爬取糗妹妹网站妹子图分类的所有图片

    爬取所有图片,一个页面的图片建一个文件夹.难点,图片中有不少.gif图片,需要重写下载规则, 创建scrapy项目 scrapy startproject qiumeimei 创建爬虫应用 cd qi ...

  3. windows7下安装python3的scrapy框架

    强大的Anaconda和Spyder.不过如何在这个平台上安装Scrapy呢. 打开MS-DOS(win+R输入cmd回车) 然后输入: conda install -c scrapinghub sc ...

  4. ubuntu下python3安装scrapy,OpenSSL

    环境:ubuntu 16.04  ,  python3.5.1+ 安装顺序如下: sudo apt-get install build-essential sudo apt-get install p ...

  5. 【解决】MacOS下 Python3.7 使用 pyinstaller 打包后执行报错 Failed to execute script pyi_rth__tkinter

    Fix tcl/tk libs inclusion in tkinter with Python3.7 under MacOS 使用 Pyinstaller 打包时候报错 3027 ERROR: Tc ...

  6. Python3.6+Scrapy爬取知名技术文章网站

    爬取分析 伯乐在线已经提供了所有文章的接口,还有下一页的接口,所有我们可以直接爬取一页,再翻页爬. 环境搭建 Windows下安装Python: http://www.cnblogs.com/0bug ...

  7. python爬虫scrapy框架——爬取伯乐在线网站文章

    一.前言  1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...

  8. scrapy框架来爬取壁纸网站并将图片下载到本地文件中

    首先需要确定要爬取的内容,所以第一步就应该是要确定要爬的字段: 首先去items中确定要爬的内容 class MeizhuoItem(scrapy.Item): # define the fields ...

  9. Python爬虫 ---scrapy框架初探及实战

    目录 Scrapy框架安装 操作环境介绍 安装scrapy框架(linux系统下) 检测安装是否成功 Scrapy框架爬取原理 Scrapy框架的主体结构分为五个部分: 它还有两个可以自定义下载功能的 ...

随机推荐

  1. New UWP Community Toolkit - Staggered panel

    概述 前面 New UWP Community Toolkit 文章中,我们对 2.2.0 版本的重要更新做了简单回顾,其中简单介绍了 Staggered panel,本篇我们结合代码详细讲解  St ...

  2. %f使用时的注意事项

    1不是所有定义都用int,使用浮点函数需要把int改成float才能正常工作 2保留一位小数时要打入%0.1f,保留两位小数时要打入%0.2f,而不是%0.01f

  3. python API的安全认证

    我们根据pid加客户端的时间戳进行加密md5(pid|时间戳)得到的单向加密串,与时间戳,或者其它字段的串的url给服务端. 服务端接收到请求的url进行分析 客户端时间与服务端的时间戳之差如果大于规 ...

  4. django搭建web (四) models.py

    demo 该demo模型主要是用于问题,选择单个或多个答案的问卷形式应用 # -*- coding: utf-8 -*- from __future__ import unicode_literals ...

  5. Flask 学习 八 用户角色

    角色在数据库中表示 app/models.py class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primar ...

  6. NOIP2012 提高组 Day 2

    http://www.cogs.pro/cogs/page/page.php?aid=16 期望得分:100+100+0=0 实际得分:100+20+0=120 T2线段树标记下传出错 T1 同余方程 ...

  7. 直方图均衡化及matlab实现

    在处理图像时,偶尔会碰到图像的灰度级别集中在某个小范围内的问题,这时候图像很难看清楚.比如下图: 它的灰度级别,我们利用一个直方图可以看出来(横坐标从0到255,表示灰度级别,纵坐标表示每个灰度级别的 ...

  8. 吝啬的国度 nyoj

    吝啬的国度 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...

  9. nyoj Mod

    Ocean用巧妙的方法得到了一个序列,该序列有N个元素,我们用数组a来记录(下标从0到N−1). Ocean定义f[i]=(((i%a[0])%a[1])%-)%a[N−1]. 现在Ocean会给出Q ...

  10. STM32F4系列单片机上使用CUBE配置MBEDTLS实现pem格式公钥导入

    |版权声明:本文为博主原创文章,未经博主允许不得转载. 最近尝试在STM32F4下用MBEDTLS实现了公钥导入(我使用的是ECC加密),整个过程使用起来比较简单. 首先,STM32F4系列CUBE里 ...