macOS下python3通过scrapy框架重新生成不得姐网站视频采集过程日志
1.搭建虚拟python3环境(Virtualenvwrapper)
参考http://www.cnblogs.com/it-tsz/p/pyhton.html
前提先安装好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框架重新生成不得姐网站视频采集过程日志的更多相关文章
- Python3安装scrapy框架步骤
Python3安装scrapy框架步骤 1. 安装wheel a) Pip install wheel 2. 安装lxml Pip install lxml 3. ...
- scrapy框架爬取糗妹妹网站妹子图分类的所有图片
爬取所有图片,一个页面的图片建一个文件夹.难点,图片中有不少.gif图片,需要重写下载规则, 创建scrapy项目 scrapy startproject qiumeimei 创建爬虫应用 cd qi ...
- windows7下安装python3的scrapy框架
强大的Anaconda和Spyder.不过如何在这个平台上安装Scrapy呢. 打开MS-DOS(win+R输入cmd回车) 然后输入: conda install -c scrapinghub sc ...
- ubuntu下python3安装scrapy,OpenSSL
环境:ubuntu 16.04 , python3.5.1+ 安装顺序如下: sudo apt-get install build-essential sudo apt-get install p ...
- 【解决】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 ...
- Python3.6+Scrapy爬取知名技术文章网站
爬取分析 伯乐在线已经提供了所有文章的接口,还有下一页的接口,所有我们可以直接爬取一页,再翻页爬. 环境搭建 Windows下安装Python: http://www.cnblogs.com/0bug ...
- python爬虫scrapy框架——爬取伯乐在线网站文章
一.前言 1. scrapy依赖包: 二.创建工程 1. 创建scrapy工程: scrapy staratproject ArticleSpider 2. 开始(创建)新的爬虫: cd Artic ...
- scrapy框架来爬取壁纸网站并将图片下载到本地文件中
首先需要确定要爬取的内容,所以第一步就应该是要确定要爬的字段: 首先去items中确定要爬的内容 class MeizhuoItem(scrapy.Item): # define the fields ...
- Python爬虫 ---scrapy框架初探及实战
目录 Scrapy框架安装 操作环境介绍 安装scrapy框架(linux系统下) 检测安装是否成功 Scrapy框架爬取原理 Scrapy框架的主体结构分为五个部分: 它还有两个可以自定义下载功能的 ...
随机推荐
- Hibernate——配置并访问数据库
Hibernate,对于java来说很重要的一个东西,用于持久层.之前看了很多配置的,都不行,自己来写一个配置成功的. 环境:jdk1.8,eclipse-jee-oxygen,mysql-conne ...
- 201621123057 《Java程序设计》第8周学习总结
1. 本周学习总结 思维导图归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 ArrayList是允许重复的,但当用它来 ...
- android批量打包
http://blog.csdn.net/johnny901114/article/details/48714849
- Echarts柱状图实现不同颜色渐变色
第一次写文,只是想记录一下自己平时发现的小功能,这篇主要是实现echarts柱状图,每个柱子实现不同颜色的渐变色,也是第一次接触echarts,后台使用ssm,前台是extjs,直接上效果图 直接上j ...
- 自制 h5 音乐播放器 可搜索
闲言碎语: 有好几天没有发表博客了,这也是因为一直开发音乐和完善我的博客项目,好不容易抽出时间总结一下这几天所做的东西,笔试又不断通知,实则匆忙 今天难得逃了一次课,就趁这时间,该写写就写写吧~~ 进 ...
- slf4j 与 log4j2 实战讲解与日志分割
这两天搭建项目的时候用到log4j2在这里把自己的问题与了解拿出来与大家分享一下. 1.为什我要用 因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用l ...
- JAVA_SE基础——25.面向对象练习
黑马程序员入学blog ... 昨晚我写了篇面向对象的内存分析,今天我们来做个小练习.. 需求: 使用java描述一个车与修车厂两个事物, 车具备的公共属性:轮子数. 名字. 颜色 ,还 具备跑的功能 ...
- 剑指offer-两个链表的第一个公共节点
题目描述 输入两个链表,找出它们的第一个公共结点. 解题思路 分析可得如果两个链表有公共节点,那么公共节点出现在两个链表的尾部,即从某一节点开始,两链表之后的节点全部相等.可以首先遍历两个链表得出各自 ...
- Python内置函数(53)——setattr
英文文档: setattr(object, name, value) This is the counterpart of getattr(). The arguments are an object ...
- ubuntu 虚拟机上的 django 服务,在外部Windows系统上无法访问
背景介绍 今天尝试着写了一个最简单的django 服务程序,使用虚拟机(Ubuntu16.02 LTS)上的浏览器访问程序没有问题.但是在物理机器上(win10 Home) 就出现错误 解决方法 在 ...