【问题标题】:scrapy spider: output in chronological orderscrapy spider:按时间顺序输出
【发布时间】:2017-11-16 19:46:54
【问题描述】:

我正在使用 Scrapy 在 python 中编写网络爬虫。目的是在预定的时间间隔监控网页的变化。 登录网站后,蜘蛛每 X 分钟请求一次网页,然后从网页中提取某些数据并保存到文本文件中。 事实证明,文本文件只有在蜘蛛关闭时才写入,并且文本文件中的行没有按时间顺序排列。我无法弄清楚发生了什么。也许这是 Scrapy 模块的一种特定工作方式?有什么想法吗?

import scrapy
from scrapy.http import Request
from scrapy.http import FormRequest
from scraping_example.loginform import fill_login_form
from datetime import datetime
import time


class ExampleSpiderSpider(scrapy.Spider):
    name = 'example_spider'
    allowed_domains = ['example.com']
    start_urls = ['http:/www.example.com/login']
    login_user = 'edging780'
    login_pass = ''

    def parse(self, response):
        (args, url, method) = fill_login_form(response.url,
                response.body, self.login_user, self.login_pass)
        return FormRequest(url, method=method, formdata=args,
                           callback=self.after_login)

    def after_login(self, response):
        for i in range(0,6):
            request = Request('https://www.example.com/page_to_scrape', callback=self.get_table, dont_filter = True)
            request.meta['dateTime'] = str(datetime.now())
            request.meta['order'] = str(i)
            yield request
            time.sleep(600)
        return

    def get_table(self, response):
        table = response.xpath('//table[@class="example_table"]/tbody/tr[not(contains(@class,"thead"))]') 
        Data=[]
        for n_row in range(0,len(table)):
            row = table[n_row]
            Data.append(row.xpath('td[1]/text()').extract())    

        dictionary = {'Time': response.meta['dateTime'],
                 'Order': response.meta['order'],
                 'Data': Data}            
        with open('output.txt', 'a') as f:
            f.write(str(dictionary) + '\n')
        return

【问题讨论】:

标签: python scrapy web-crawler


【解决方案1】:

您可能想阅读以下内容:https://doc.scrapy.org/en/latest/faq.html#does-scrapy-crawl-in-breadth-first-or-depth-first-order

还有这个:LIFO (last in, first out)

Scrapy 不会按照你给他的顺序处理请求,但你可以改变这种行为(你有上面链接中描述的选项)。

另外,您可能需要考虑使用Itemsfeed exporters,而不是像您一样处理您的物品...

编辑: 最重要的是:

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

我也需要设置

CONCURRENT_REQUESTS = 1

后一种设置是逐个发出请求

【讨论】:

    猜你喜欢
    • 2018-12-20
    • 2018-05-18
    • 2018-06-12
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多