首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使蜘蛛重新启动

使蜘蛛重新启动
EN

Stack Overflow用户
提问于 2017-05-17 21:42:34
回答 1查看 53关注 0票数 0

我的意图是使用一个蜘蛛刮几个urls,如下所示:

代码语言:javascript
复制
import scrapy
from ..items import ContentsPageSFBItem

class BasicSpider(scrapy.Spider):
    name = "contentspage_sfb"
    #allowed_domains = ["web"]
    start_urls = [
        'https://www.safaribooksonline.com/library/view/shell-programming-in/9780134496696/',
        'https://www.safaribooksonline.com/library/view/cisa-certified-information/9780134677453/'
    ]

    def parse(self, response):
            item = ContentsPageSFBItem()

            #from scrapy.shell import inspect_response
            #inspect_response(response, self)

            content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract()

            for content_item in content_items:

                item['content_item'] = content_item
                item["full_url"] = response.url
                item['title'] = response.xpath('//title[1]/text()').extract()

                yield item

我打算用更多的网址。我的意图是创造一个可重新启动的蜘蛛,以防出问题。我的计划是添加异常并创建包含剩余urls列表的csv。我到底能在哪里添加这个功能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-17 22:18:29

您可以存储发生此类问题的当前url,然后使用相同的scrapy.Request函数将其传递到parse中继续。

您可以看到在使用response.body访问的网站上是否已经打印了一些内容,是不是已经发生了一些不好的事情,那么yield就会有一个新的scrapy.Request,如果不继续正常的话。

也许:

代码语言:javascript
复制
def parse(self, response):
    current_url = response.request.url
    if 'Some or none message in the body' in response.body:
        yield scrapy.Request(current_url, callback=self.parse)
    else:
        item = ContentsPageSFBItem()
        content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract()

        for content_item in content_items:
            item['content_item'] = content_item
            item['full_url']     = response.url
            item['title']        = response.xpath('//title[1]/text()').extract()
            yield item

请注意,再次使用parse函数的方式在很大程度上取决于您想要捕获的“异常”。

请记住,您希望将数据写入不同的文件,这取决于您的url,然后我对代码做了一些调整:

首先创建三个全局变量来存储第一个和第二个url,并将字段作为数组存储。请注意,这对于这两个urls是有用的,但是如果它们开始增长,这将很困难:

代码语言:javascript
复制
global first_url, second_url, fields
fields = []
first_url = 'https://www.safaribooksonline.com/library/view/shell-programming-in/9780134496696/'
second_url = 'https://www.safaribooksonline.com/library/view/cisa-certified-information/9780134677453/'
start_urls = [first_url, second_url]

然后在parse函数中获取数据并将其存储在fields数组中,该数组将传递给第二个函数parse_and_write_csv,根据当前url在每个文件上创建和写入数据。

代码语言:javascript
复制
def parse(self, response):
    item = ContentsPageSFBItem()
    content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract()
    url = response.request.url

    for content_item in content_items:

        item['content_item'] = content_item
        item['full_url'] = response.url
        item['title'] = response.xpath('//title[1]/text()').extract()

        fields = [item['content_item'].encode('utf-8'), item['full_url'], item['title'][0]]

        self.parse_and_write_csv(response, fields)

parse_and_write_csv获取字段,并根据url获取从url创建的数组中的第5个元素,并创建一个csv文件,如果该文件已经存在,则打开它。

代码语言:javascript
复制
def parse_and_write_csv(self, response, fields):
    with open("%s.csv" % response.request.url.split('/')[5], 'a+') as file:
        file.write("{}\n".format(';'.join(str(field) 
                                      for field in fields)))

希望能帮上忙。你可以在这里看到一个要旨

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44035221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档