Python 刮板卡在请求循环中

Python 刮板卡在请求循环中,python,while-loop,request,scrapy,Python,While Loop,Request,Scrapy,因此,我试图构建一个非常基本的scraper,它从我的服务器中提取信息,使用这些信息创建一个链接,然后生成一个请求,在解析之后,它从解析过的页面中获取一个链接,使用get请求将其上传回服务器。我遇到的问题是,它将从服务器中提取信息,创建链接,然后生成请求,并且根据那里的响应时间(不可靠的一致性),它将转储并重新开始向服务器发送另一个get请求。我的服务器逻辑的设计方式是,它正在拉取下一个需要处理的数据集,并且在使用此数据集决定操作过程之前,它将不断尝试拉取并解析它。我是个新手,需要帮助。我知道我

因此,我试图构建一个非常基本的scraper,它从我的服务器中提取信息,使用这些信息创建一个链接,然后生成一个请求,在解析之后,它从解析过的页面中获取一个链接,使用get请求将其上传回服务器。我遇到的问题是,它将从服务器中提取信息,创建链接,然后生成请求,并且根据那里的响应时间(不可靠的一致性),它将转储并重新开始向服务器发送另一个get请求。我的服务器逻辑的设计方式是,它正在拉取下一个需要处理的数据集,并且在使用此数据集决定操作过程之前,它将不断尝试拉取并解析它。我是个新手,需要帮助。我知道我的代码是错误的,但我无法想出另一种方法,而不改变大量服务器代码并产生不必要的麻烦,不幸的是,我对scrapy或python不是非常精通 我的启动请求方法:

name = "scrapelevelone"
start_urls = []
  def start_requests(self):
    print("Start Requests is initiatied")
    while True:
        print("Were looping")
        r = requests.get('serverlink.com')
        print("Sent request")
        pprint(r.text)
        print("This is the request response text")
        print("Now try to create json object: ")
        try:
            personObject = json.loads(r.text)
            print("Made json object: ")
            pprint(personObject)
            info = "streetaddress=" + '+'.join(personObject['address1'].split(" ")) + "&citystatezip=" + '+'.join(personObject['city'].split(" ")) + ",%20" + personObject['state'] + "%20" + personObject['postalcodeextended']
            nextPage = "https://www.webpage.com/?" + info
            print("Creating info")
            newRequest = scrapy.Request(nextPage, self.parse)
            newRequest.meta['item'] = personObject
            print("Yielding request")
            yield newRequest
        except Exception:
            print("Reach JSON exception")
        time.sleep(10)

每次调用parse函数时,它都会执行所有逻辑,在最后创建request.get语句,并将数据发送到服务器。如果它走到尽头,它会做它应该做的事情。我尝试了很多不同的方法,试图让scraper循环并不断向服务器请求更多信息。我希望scraper无限期地运行,但当我无法离开计算机时,因为它被一个请求阻塞了,这就达不到目的。在不使用start_requests功能中的愚蠢while循环的情况下,有没有建议保持刮板机24/7运行?除此之外,有人能告诉我为什么它会陷入一个请求循环中吗(我非常头痛,试图解决这个问题,最后屈服于一个论坛…

你应该做的是从你的服务器url开始,并通过生成请求对象不断重试。如果你拥有的数据是新的,那么解析它并安排你的请求:

class MyCrawler:
    start_urls = ['http://myserver.com']
    past_data = None

    def parse(self, response):
        data = json.loads(response.body_as_unicode())
        if data == past_data:  # if data is the same, retry
            # time.sleep(10) # you can add delay but sleep will stop everything
            yield Request(response.url, dont_filter=True, priority=-100)
            return
        past_data = data
        for url in data['urls']:
            yield Request(url, self.parse_url)
        # keep retrying
        yield Request(response.url, dont_filter=True, priority=-100)

    def parse_url(self, repsonse):
        #...
        yield {'scrapy': 'item'}

您应该做的是从服务器url开始,通过生成请求对象不断重试。如果您拥有的数据是新的,则解析它并安排您的请求:

class MyCrawler:
    start_urls = ['http://myserver.com']
    past_data = None

    def parse(self, response):
        data = json.loads(response.body_as_unicode())
        if data == past_data:  # if data is the same, retry
            # time.sleep(10) # you can add delay but sleep will stop everything
            yield Request(response.url, dont_filter=True, priority=-100)
            return
        past_data = data
        for url in data['urls']:
            yield Request(url, self.parse_url)
        # keep retrying
        yield Request(response.url, dont_filter=True, priority=-100)

    def parse_url(self, repsonse):
        #...
        yield {'scrapy': 'item'}

太棒了,谢谢:)我不知道为什么我没有想到这个解决方案,因为它相当明显。我想我一直在用get向服务器发出请求,而不是使用内置的scrapy函数
response.body\u as\u unicode()
对我来说是新的,谢谢。我有几个问题。为什么在请求中设置
priority=-100
?我没有使用
yield{'scrapy':'item'}
而是使用get和payload参数向服务器创建一个额外的请求。。如何使用yield语句和其他函数将dict发送回服务器?谢谢:)优先级=-100服务器重试请求将把它放在队列的末尾,并首先处理您的其他请求-您希望尽可能少地检查您的服务器,并优先考虑爬网,对吗?您可以使用
POST
类型请求将内容发送到服务器,只需设置
Request(url,method=“POST”,data='{“foo”:“bar”}')
例如,在这个特定的实例中,考虑到爬网依赖于服务器调用,这并不重要。不过,我确实理解你试图提出的概念。太棒了:)看起来很简单。谢谢。太棒了。谢谢:)我不知道为什么我没有想到这个解决方案,因为它相当明显。我想我一直在用get向服务器发出请求,而不是使用内置的scrapy函数
response.body\u as\u unicode()
对我来说是新的,谢谢。我有几个问题。为什么在请求中设置
priority=-100
?我没有使用
yield{'scrapy':'item'}
而是使用get和payload参数向服务器创建一个额外的请求。。如何使用yield语句和其他函数将dict发送回服务器?谢谢:)优先级=-100服务器重试请求将把它放在队列的末尾,并首先处理您的其他请求-您希望尽可能少地检查您的服务器,并优先考虑爬网,对吗?您可以使用
POST
类型请求将内容发送到服务器,只需设置
Request(url,method=“POST”,data='{“foo”:“bar”}')
例如,在这个特定的实例中,考虑到爬网依赖于服务器调用,这并不重要。不过,我确实理解你试图提出的概念。太棒了:)看起来很简单。非常感谢。