让蜘蛛可以恢复

时间:2017-05-17 21:42:34

标签: python scrapy web-crawler

我的目的是使用如下蜘蛛刮几个网址:

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

我打算使用更多网址。我的目的是创建一个可重启的蜘蛛,以防出现问题。我的计划是添加例外并使用剩余网址列表创建一个csv。我在哪里可以添加此功能?

1 个答案:

答案 0 :(得分:1)

您可以存储发生此类问题的当前网址,然后使用相同的ThrowPropsPlugin功能将其传递到scrapy.Request以继续。

您可以使用parse查看正在访问的网站中是否打印了某些内容,是否发生了错误,response.body新的yield如果不是,则继续照常。

也许:

scrapy.Request

请注意,再次使用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 函数的方式在很大程度上取决于哪个"异常"你想赶上。

请记住,您希望将数据写入不同的文件,具体取决于您的网址,然后我稍微调整了一下代码:

首先创建三个全局变量来存储第一个和第二个url,并将字段作为数组。 Nnote这对那些2个网址很有用,但如果它们开始增长则很难:

parse

然后在你的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

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) 获取字段,并根据网址从网址创建的数组中获取第5个元素并创建csv文件,如果已存在则打开它。

parse_and_write_csv

希望它有所帮助。你可以在这里看到gist