2017-01-01 151 views
0

我试图从运行脚本scrapy蜘蛛,而不是从这样的指令终端运行它的:错误运行scrapy从脚本

scrapy crawl spidername 

在scrapy文档,我发现下面的例子:https://doc.scrapy.org/en/latest/topics/practices.html

现在,我的代码如下所示:

import scrapy 
from scrapy.crawler import CrawlerProcess 
from scrapy.loader import ItemLoader 
from properties.items import PropertiesItem 


class MySpider(scrapy.Spider): 
    name = "basic" 
    allowed_domains = ["web"] 
    start_urls = ['http://www.example.com'] 

    def parse(self, response): 
     l = ItemLoader(item=PropertiesItem(), response = response) 
     l.add_xpath('title', '//h1[1]/text()') 

     return l.load_item() 

process = CrawlerProcess({ 
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 

process.crawl(MySpider) 
process.start() # the script will block here until the crawling is finished 

当我运行该脚本,我得到以下错误:

File "/Library/Python/2.7/site-packages/Twisted-16.7.0rc1-py2.7-macosx-10.11-intel.egg/twisted/internet/_sslverify.py", line 38, in TLSVersion.TLSv1_1: SSL.OP_NO_TLSv1_1, AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1'

所以我的问题是:

1)什么样的错误是什么?我无法在网上找到任何示例。

2)我可以通过这个脚本改变scrapy的运行方式吗?

更新时间:

安装项目添加包

attrs==16.3.0 
Automat==0.3.0 
cffi==1.9.1 
characteristic==14.3.0 
constantly==15.1.0 
cryptography==1.7.1 
cssselect==1.0.0 
enum34==1.1.6 
idna==2.2 
incremental==16.10.1 
ipaddress==1.0.17 
lxml==3.7.1 
parsel==1.1.0 
pyasn1==0.1.9 pyasn1- 
modules==0.0.8 
pycparser==2.17 
PyDispatcher==2.0.5 
pyOpenSSL==0.15.1 
queuelib==1.4.2 
Scrapy==1.3.0 service- 
identity==16.0.0 
six==1.10.0 
tree==0.1.0 
Twisted==16.6.0 
virtualenv==15.1.0 
w3lib==1.16.0 zope. 
interface==4.3.3 
+0

看起来像扭曲的问题。你可以粘贴项目中所有软件包的版本号吗?请优先粘贴'pip freeze'的输出。 –

+0

这也可能是您使用的OpenSSL版本的问题。你可以粘贴你使用的OpenSSL版本吗?如果可以的话,你可以按照[这个答案](http://apple.stackexchange.com/questions/126830/how-to-upgrade-openssl-in-os-x)来更新它。 –

+0

其实我认为你应该用'pip install --upgrade pyOpenSSL'来更新'pyOpenSSL'的版本。 –

回答

0

我找到了一个解决方案:

创建了一个基于python 3.6而不是python 2.7的新虚拟环境。我运行了完全相同的代码(不得不用urllib.parse替换urlparse),它工作正常!

-1

1)我不知道

2)但是你的缩进是需要检讨:

import scrapy 
from scrapy.crawler import CrawlerProcess 
from scrapy.loader import ItemLoader 
from properties.items import PropertiesItem 


class MySpider(scrapy.Spider): 
    name = "basic" 
    allowed_domains = ["web"] 
    start_urls = ['http://www.example.com'] 

    def parse(self, response): 
     l = ItemLoader(item=PropertiesItem(), response = response) 
     l.add_xpath('title', '//h1[1]/text()') 

     return l.load_item() 

    process = CrawlerProcess({ 
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 

    process.crawl(MySpider) 
    process.start() # the script will block here until the crawling is finished 

和我在代码中假设了其他各种各样的示例。即运行下面的蜘蛛,你需要输入

scrapy crawl basic 

并且您已经称为一个文件夹“属性”与文件“项”在这等

+0

你看了我提供的链接吗?过程不是蜘蛛的一部分。它用于启动它。 – titusAdam