win7 x64系统中安装Scrapy的方法


Posted in Python onNovember 18, 2018

scrapy是用python开发的爬虫框架,从网上查了安装方法,感觉都说的挺复杂,而且很多教程都很有年头了,于是记录了自己的安装过程。

首先安装python,地址:https://www.python.org/downloads/release/python-2710/,注意根据你的系统下64位(Windows x86-64 MSI installer)还是32位的(Windows x86 MSI installer)。

现在是python3.6的天下了,建议大家安装python3版本。

装完以后就可以安装scrapy了,推荐使用pip方式安装,因为scrapy需要调用很多额外的库,pip会全部帮你安装好,不需要你在到处翻找了。

pip在python安装完后就已经有了,不需要额外安装,下面只要按照scrapy官网推荐的方法在命令提示符中输入pip installscrapy(图1),然后只需静静等待即可大功告成。

win7 x64系统中安装Scrapy的方法

图1

装完以后可以敲入命令pip list看看已安装的库(图2),出来很多啊,pip真是好东西。

win7 x64系统中安装Scrapy的方法

图2

现在试下看看建个爬虫项目,按照说明文档键入命令scrapy startproject tutorial,目录已经出来(图3),看来是没问题了。但为了验证是否安装成功,还得跑一下看看,第一次创建项目的时候,系统会提示可以跑个例子看看(图4)。按照提示键入命令

win7 x64系统中安装Scrapy的方法


图3

win7 x64系统中安装Scrapy的方法

图4

scrapy genspider example example.com创建一个爬虫,再键入命令scrapy crawl example

运行爬虫,结果如下(图5),报错了,貌似是缺少win32api,立即上网下了一个(http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/),

win7 x64系统中安装Scrapy的方法

图5

下的时候注意对应的python版本。win32api装好以后再运行一次爬虫(图6),这次成功了,应该是没问题了。

win7 x64系统中安装Scrapy的方法

图6

总结一下,其实刚开始网上找资料的时候看到上面写的要先装这个库那个库的时候心中很忐忑,结果发现不是很复杂,大多数问题pip都给解决了,剩下的就是具体问题具体研究,不过也没碰到很复杂解决不了的问题。另外吐下槽就是网上的教程互抄的太厉害,看着一搜一堆,其实多数都大同小异,真正有价值的没几个,没大腿抱就是辛苦呀。

最后说一下,scrapy目前还不支持python3.x版本,我用的是python2.7,如果你碰到莫名其妙的问题时请先看看自己有没有装错python版本。

下面是其他网友补充的文章

环境

Windows7 64位
Python2.7.6 64位

Python的安装:

  • 打开http://www.python.org/getit/releases/2.7.6/页面,下载Python-2.7.6.amd64.msi 进行安装,安装完成后,需要配置环境变量,环境变量的配置可以参考该文章
  • 测试python是否安装成功,如果python成功安装并且配置好环境变量,那么在cmd中输入python,就能得到python版本的详细信息(如32位或64位)
C:\Users\Administrator>python
Python 2.7.6 (default, Nov 10 2013, 19:24:24) [MSC v.1500 64 bit (AMD64)] on win
32

easy_install的安装

保存ez_setup.py至本地,如D盘(如果失效了,可以参考下https://3water.com/article/151027.htm

#!/usr/bin/env python

"""
Setuptools bootstrapping installer.

Maintained at https://github.com/pypa/setuptools/tree/bootstrap.

Run this script to install or upgrade setuptools.

This method is DEPRECATED. Check https://github.com/pypa/setuptools/issues/581 for more details.
"""

import os
import shutil
import sys
import tempfile
import zipfile
import optparse
import subprocess
import platform
import textwrap
import contextlib

from distutils import log

try:
 from urllib.request import urlopen
except ImportError:
 from urllib2 import urlopen

try:
 from site import USER_SITE
except ImportError:
 USER_SITE = None

# 33.1.1 is the last version that supports setuptools self upgrade/installation.
DEFAULT_VERSION = "33.1.1"
DEFAULT_URL = "https://pypi.io/packages/source/s/setuptools/"
DEFAULT_SAVE_DIR = os.curdir
DEFAULT_DEPRECATION_MESSAGE = "ez_setup.py is deprecated and when using it setuptools will be pinned to {0} since it's the last version that supports setuptools self upgrade/installation, check https://github.com/pypa/setuptools/issues/581 for more info; use pip to install setuptools"

MEANINGFUL_INVALID_ZIP_ERR_MSG = 'Maybe {0} is corrupted, delete it and try again.'

log.warn(DEFAULT_DEPRECATION_MESSAGE.format(DEFAULT_VERSION))


def _python_cmd(*args):
 """
 Execute a command.

 Return True if the command succeeded.
 """
 args = (sys.executable,) + args
 return subprocess.call(args) == 0


def _install(archive_filename, install_args=()):
 """Install Setuptools."""
 with archive_context(archive_filename):
 # installing
 log.warn('Installing Setuptools')
 if not _python_cmd('setup.py', 'install', *install_args):
  log.warn('Something went wrong during the installation.')
  log.warn('See the error message above.')
  # exitcode will be 2
  return 2


def _build_egg(egg, archive_filename, to_dir):
 """Build Setuptools egg."""
 with archive_context(archive_filename):
 # building an egg
 log.warn('Building a Setuptools egg in %s', to_dir)
 _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir)
 # returning the result
 log.warn(egg)
 if not os.path.exists(egg):
 raise IOError('Could not build the egg.')


class ContextualZipFile(zipfile.ZipFile):

 """Supplement ZipFile class to support context manager for Python 2.6."""

 def __enter__(self):
 return self

 def __exit__(self, type, value, traceback):
 self.close()

 def __new__(cls, *args, **kwargs):
 """Construct a ZipFile or ContextualZipFile as appropriate."""
 if hasattr(zipfile.ZipFile, '__exit__'):
  return zipfile.ZipFile(*args, **kwargs)
 return super(ContextualZipFile, cls).__new__(cls)


@contextlib.contextmanager
def archive_context(filename):
 """
 Unzip filename to a temporary directory, set to the cwd.

 The unzipped target is cleaned up after.
 """
 tmpdir = tempfile.mkdtemp()
 log.warn('Extracting in %s', tmpdir)
 old_wd = os.getcwd()
 try:
 os.chdir(tmpdir)
 try:
  with ContextualZipFile(filename) as archive:
  archive.extractall()
 except zipfile.BadZipfile as err:
  if not err.args:
  err.args = ('', )
  err.args = err.args + (
  MEANINGFUL_INVALID_ZIP_ERR_MSG.format(filename),
  )
  raise

 # going in the directory
 subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0])
 os.chdir(subdir)
 log.warn('Now working in %s', subdir)
 yield

 finally:
 os.chdir(old_wd)
 shutil.rmtree(tmpdir)


def _do_download(version, download_base, to_dir, download_delay):
 """Download Setuptools."""
 py_desig = 'py{sys.version_info[0]}.{sys.version_info[1]}'.format(sys=sys)
 tp = 'setuptools-{version}-{py_desig}.egg'
 egg = os.path.join(to_dir, tp.format(**locals()))
 if not os.path.exists(egg):
 archive = download_setuptools(version, download_base,
  to_dir, download_delay)
 _build_egg(egg, archive, to_dir)
 sys.path.insert(0, egg)

 # Remove previously-imported pkg_resources if present (see
 # https://bitbucket.org/pypa/setuptools/pull-request/7/ for details).
 if 'pkg_resources' in sys.modules:
 _unload_pkg_resources()

 import setuptools
 setuptools.bootstrap_install_from = egg


def use_setuptools(
 version=DEFAULT_VERSION, download_base=DEFAULT_URL,
 to_dir=DEFAULT_SAVE_DIR, download_delay=15):
 """
 Ensure that a setuptools version is installed.

 Return None. Raise SystemExit if the requested version
 or later cannot be installed.
 """
 to_dir = os.path.abspath(to_dir)

 # prior to importing, capture the module state for
 # representative modules.
 rep_modules = 'pkg_resources', 'setuptools'
 imported = set(sys.modules).intersection(rep_modules)

 try:
 import pkg_resources
 pkg_resources.require("setuptools>=" + version)
 # a suitable version is already installed
 return
 except ImportError:
 # pkg_resources not available; setuptools is not installed; download
 pass
 except pkg_resources.DistributionNotFound:
 # no version of setuptools was found; allow download
 pass
 except pkg_resources.VersionConflict as VC_err:
 if imported:
  _conflict_bail(VC_err, version)

 # otherwise, unload pkg_resources to allow the downloaded version to
 # take precedence.
 del pkg_resources
 _unload_pkg_resources()

 return _do_download(version, download_base, to_dir, download_delay)


def _conflict_bail(VC_err, version):
 """
 Setuptools was imported prior to invocation, so it is
 unsafe to unload it. Bail out.
 """
 conflict_tmpl = textwrap.dedent("""
 The required version of setuptools (>={version}) is not available,
 and can't be installed while this script is running. Please
 install a more recent version first, using
 'easy_install -U setuptools'.

 (Currently using {VC_err.args[0]!r})
 """)
 msg = conflict_tmpl.format(**locals())
 sys.stderr.write(msg)
 sys.exit(2)


def _unload_pkg_resources():
 sys.meta_path = [
 importer
 for importer in sys.meta_path
 if importer.__class__.__module__ != 'pkg_resources.extern'
 ]
 del_modules = [
 name for name in sys.modules
 if name.startswith('pkg_resources')
 ]
 for mod_name in del_modules:
 del sys.modules[mod_name]


def _clean_check(cmd, target):
 """
 Run the command to download target.

 If the command fails, clean up before re-raising the error.
 """
 try:
 subprocess.check_call(cmd)
 except subprocess.CalledProcessError:
 if os.access(target, os.F_OK):
  os.unlink(target)
 raise


def download_file_powershell(url, target):
 """
 Download the file at url to target using Powershell.

 Powershell will validate trust.
 Raise an exception if the command cannot complete.
 """
 target = os.path.abspath(target)
 ps_cmd = (
 "[System.Net.WebRequest]::DefaultWebProxy.Credentials = "
 "[System.Net.CredentialCache]::DefaultCredentials; "
 '(new-object System.Net.WebClient).DownloadFile("%(url)s", "%(target)s")'
 % locals()
 )
 cmd = [
 'powershell',
 '-Command',
 ps_cmd,
 ]
 _clean_check(cmd, target)


def has_powershell():
 """Determine if Powershell is available."""
 if platform.system() != 'Windows':
 return False
 cmd = ['powershell', '-Command', 'echo test']
 with open(os.path.devnull, 'wb') as devnull:
 try:
  subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
 except Exception:
  return False
 return True
download_file_powershell.viable = has_powershell


def download_file_curl(url, target):
 cmd = ['curl', url, '--location', '--silent', '--output', target]
 _clean_check(cmd, target)


def has_curl():
 cmd = ['curl', '--version']
 with open(os.path.devnull, 'wb') as devnull:
 try:
  subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
 except Exception:
  return False
 return True
download_file_curl.viable = has_curl


def download_file_wget(url, target):
 cmd = ['wget', url, '--quiet', '--output-document', target]
 _clean_check(cmd, target)


def has_wget():
 cmd = ['wget', '--version']
 with open(os.path.devnull, 'wb') as devnull:
 try:
  subprocess.check_call(cmd, stdout=devnull, stderr=devnull)
 except Exception:
  return False
 return True
download_file_wget.viable = has_wget


def download_file_insecure(url, target):
 """Use Python to download the file, without connection authentication."""
 src = urlopen(url)
 try:
 # Read all the data in one block.
 data = src.read()
 finally:
 src.close()

 # Write all the data in one block to avoid creating a partial file.
 with open(target, "wb") as dst:
 dst.write(data)
download_file_insecure.viable = lambda: True


def get_best_downloader():
 downloaders = (
 download_file_powershell,
 download_file_curl,
 download_file_wget,
 download_file_insecure,
 )
 viable_downloaders = (dl for dl in downloaders if dl.viable())
 return next(viable_downloaders, None)


def download_setuptools(
 version=DEFAULT_VERSION, download_base=DEFAULT_URL,
 to_dir=DEFAULT_SAVE_DIR, delay=15,
 downloader_factory=get_best_downloader):
 """
 Download setuptools from a specified location and return its filename.

 `version` should be a valid setuptools version number that is available
 as an sdist for download under the `download_base` URL (which should end
 with a '/'). `to_dir` is the directory where the egg will be downloaded.
 `delay` is the number of seconds to pause before an actual download
 attempt.

 ``downloader_factory`` should be a function taking no arguments and
 returning a function for downloading a URL to a target.
 """
 # making sure we use the absolute path
 to_dir = os.path.abspath(to_dir)
 zip_name = "setuptools-%s.zip" % version
 url = download_base + zip_name
 saveto = os.path.join(to_dir, zip_name)
 if not os.path.exists(saveto): # Avoid repeated downloads
 log.warn("Downloading %s", url)
 downloader = downloader_factory()
 downloader(url, saveto)
 return os.path.realpath(saveto)


def _build_install_args(options):
 """
 Build the arguments to 'python setup.py install' on the setuptools package.

 Returns list of command line arguments.
 """
 return ['--user'] if options.user_install else []


def _parse_args():
 """Parse the command line for options."""
 parser = optparse.OptionParser()
 parser.add_option(
 '--user', dest='user_install', action='store_true', default=False,
 help='install in user site package')
 parser.add_option(
 '--download-base', dest='download_base', metavar="URL",
 default=DEFAULT_URL,
 help='alternative URL from where to download the setuptools package')
 parser.add_option(
 '--insecure', dest='downloader_factory', action='store_const',
 const=lambda: download_file_insecure, default=get_best_downloader,
 help='Use internal, non-validating downloader'
 )
 parser.add_option(
 '--version', help="Specify which version to download",
 default=DEFAULT_VERSION,
 )
 parser.add_option(
 '--to-dir',
 help="Directory to save (and re-use) package",
 default=DEFAULT_SAVE_DIR,
 )
 options, args = parser.parse_args()
 # positional arguments are ignored
 return options


def _download_args(options):
 """Return args for download_setuptools function from cmdline args."""
 return dict(
 version=options.version,
 download_base=options.download_base,
 downloader_factory=options.downloader_factory,
 to_dir=options.to_dir,
 )


def main():
 """Install or upgrade setuptools and EasyInstall."""
 options = _parse_args()
 archive = download_setuptools(**_download_args(options))
 return _install(archive, _build_install_args(options))

if __name__ == '__main__':
 sys.exit(main())

在cmd中运行:

d:\>python ez_setup.py

进行SetupTools的安装

在运行的时候会发生一个错误,该错误为"ascii codec can't decode byte 0xe8 in position 0:ordinal not in range(128)",大意为ascii编码不能解析byte 0xe8。
解决方法:找到并打开python根目录/Lib/mimetypes.py文件,在import urllib后,添加代码:

reload(sys)
sys.setdefaultencoding('gbk')

把默认编码方式改为gbk(网上有写用utf8的,在这个脚本中是无效的,需要改成gbk格式)。重新执行python ez_setup.py,如果出现刷屏的安装信息,则说明安装成功了。此时,在python目录下多了一个Script文件夹,easy_install就在里面

Scrapy依赖项的安装

Scrapy的依赖项

安装lxml-3.2.4.win32-py2.7.exe(64位系统需要安装lxml-3.2.4.win-amd64-py2.7.exe)
安装pywin32-218.win32-py2.7.exe(64位系统需要安装pywin32-218.win-amd64-py2.7.exe)
安装Twisted-13.2.0.win32-py2.7.exe(64位系统需要安装Twisted-13.2.0.win-amd64-py2.7.exe)
安装pyOpenSSL-0.13.1.win32-py2.7.exe(64位系统需要安装pyOpenSSL-0.13.1.win-amd64-py2.7.exe)
将zope.interface-4.0.5-py2.7-win32.egg拷贝到C:\Python27\Scripts目录下,执行$ easy_install.exe zope.interface-4.0.5-py2.7-win32.egg

验证scrapy依赖项是否安装成功的方法:

cmd执行$ python进入python控制台

执行import lxml,如果没报错,则说明lxml安装成功
执行import twisted,如果没报错,则说明twisted安装成功
执行import OpenSSL,如果没报错,则说明OpenSSL安装成功
执行import zope.interface,如果没报错,则说明zope.interface安装成功
如果安装成功,那么在cmd中执行& python,然后执行import lxml,如果没有报错,则说明lxml安装成功。

安装Scrapy

方法1: 控制台输入:easy_install scrapy
方法2:解压缩Scrapy-0.22.2.tar.gz,在其目录下执行$ python setup.py install进行Scrapy的安装。

检查Scrapy是否安装成功的方法:可以在cmd控制台执行 $ scrapy ,如果没有报错,说明安装成功。

相关文章

  • Windows下Scrapy环境搭建
  • Windows 8.1 (64bit) 下搭建 Scrapy 0.22 环境
  • Python第三方Window模块安装文件

这篇文章就介绍到这了,需要的朋友可以参考一下。

Python 相关文章推荐
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
python实现求两个字符串的最长公共子串方法
Jul 20 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Python数据报表之Excel操作模块用法分析
Mar 11 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
Jul 06 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
Django如何使用第三方服务发送电子邮件
Aug 14 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
解决python3输入的坑——input()
Dec 05 Python
深入理解python多线程编程
Apr 18 Python
Python使用DFA算法过滤内容敏感词
Apr 22 Python
python实现简易数码时钟
Feb 19 #Python
python爬取淘宝商品销量信息
Nov 16 #Python
python爬取网易云音乐评论
Nov 16 #Python
python实现将汉字保存成文本的方法
Nov 16 #Python
python 字符串只保留汉字的方法
Nov 16 #Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 #Python
用python标准库difflib比较两份文件的异同详解
Nov 16 #Python
You might like
PHP4(windows版本)中的COM函数
2006/10/09 PHP
php获取数组长度的方法(有实例)
2013/10/27 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
javascript入门·对象属性方法大总结
2007/10/01 Javascript
ExtJS 下拉多选框lovcombo
2010/05/19 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
jQuery之日期选择器的深入解析
2013/06/19 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
Vue项目引进ElementUI组件的方法
2018/11/11 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
jquery向后台提交数组的代码分析
2020/02/20 jQuery
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
Python三级菜单的实例
2017/09/13 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
python3 pygame实现接小球游戏
2019/05/14 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
计算机专业学生的自我评价
2013/12/15 职场文书
《藏戏》教学反思
2014/02/11 职场文书
多媒体教室标语
2014/06/26 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
详细了解MVC+proxy
2021/07/09 Java/Android