制作蜘蛛网

2024-04-20 11:25:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我的意图是使用一个spider抓取几个url,如下所示:

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

我打算使用更多的网址。我的意图是创建一个可重启的spider,以防出现问题。我的计划是添加例外并创建一个csv,其中包含剩余url的列表。我到底可以在哪里添加此功能?你知道吗


Tags: fromhttpsimporturlresponsewwwitemscontent
1条回答
网友
1楼 · 发布于 2024-04-20 11:25:59

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

你可以看到,如果有什么东西被打印在网站上被访问使用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

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

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

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

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创建和写入每个文件。你知道吗

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文件,如果它已经存在,则打开它。你知道吗

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)))

希望有帮助。你可以在这里看到gist。你知道吗

相关问题 更多 >