从脚本

时间:2017-01-01 23:44:47

标签: python scrapy

我正在尝试从脚本运行scrapy spider而不是从命令终端运行它,如下所示:

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

当我运行此脚本时,我收到以下错误:

  

文件   “/Library/Python/2.7/site-packages/Twisted-16.7.0rc1-py2.7-macosx-10.11-intel.egg/twisted/internet/_sslverify.py”,第38行,TLSVersion.TLSv1_1:SSL.OP_NO_TLSv1_1 ,   AttributeError:'module'对象没有属性'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

2 个答案:

答案 0 :(得分:0)

我找到了解决方案:

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

答案 1 :(得分:-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

并且您有一个名为" properties"的文件夹。使用文件" items"在其他等