2017-01-01 75 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