日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python绿色版spider的idle_Python-Scrapy Spider没有收到spider_idle信号

發布時間:2024/3/26 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python绿色版spider的idle_Python-Scrapy Spider没有收到spider_idle信号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我有蜘蛛使用meta處理鏈中的請求,以產生具有來自多個請求的數據的項目.

我用來生成請求的方式是在首次調用parse函數時啟動所有請求,但是,如果我有太多鏈接無法請求,則并不是所有請求都已計劃好,最終我也無法獲得所需的一切.

為了解決這個問題,我正在嘗試使Spider一次請求5個產品,然后在Spider空閑時再次請求(通過在from_crawler中連接信號).

問題是,由于我的代碼現在正確,spider_idle沒有運行請求函數,并且蜘蛛立即關閉.好像蜘蛛不會閑置.

這是一些代碼:

class ProductSpider(scrapy.Spider):

def __init__(self, *args, **kwargs):

super(ProductSpider, self).__init__(*args, **kwargs)

self.parsed_data = []

self.header = {}

f = open('file.csv', 'r')

f_data = [[x.strip()] for x in f]

count=1

first = 'smth'

for product in f_data:

if first != '':

header = product[0].split(';')

for each in range(len(header[1:])):

self.header[header[each+1]] = each+1

first = ''

else:

product = product[0].split(';')

product.append(count)

count+=1

self.parsed_data.append(product)

f.close()

@classmethod

def from_crawler(cls, crawler, *args, **kwargs):

spider = super(ProductSpider, cls).from_crawler(crawler, *args, **kwargs)

crawler.signals.connect(spider.request, signal=signals.spider_idle)

return spider

name = 'products'

allowed_domains = [domains]

handle_httpstatus_list = [400, 404, 403, 503, 504]

start_urls = [start]

def next_link(self,response):

product = response.meta['product']

there_is_next = False

for each in range(response.meta['each']+1, len(product)-1):

if product[each] != '':

there_is_next = True

yield scrapy.Request(product[each], callback=response.meta['func_dict'][each], meta={'func_dict': response.meta['func_dict'],'product':product,'each':each,'price_dict':response.meta['price_dict'], 'item':response.meta['item']}, dont_filter=True)

break

if not there_is_next:

item = response.meta['item']

item['prices'] = response.meta['price_dict']

yield item

#[...] chain parsing functions for each request

def get_products(self):

products = []

data = self.parsed_data

for each in range(5):

if data:

products.append(data.pop())

return products

def request(self):

item = Header()

item['first'] = True

item['sellers'] = self.header

yield item

func_dict = {parsing_functions_for_every_site}

products = self.get_products()

if not products:

return

for product in products:

item = Product()

price_dict = {1:product[1]}

item['name'] = product[0]

item['order'] = product[-1]

for each in range(2, len(product)-1):

if product[each] != '':

#print each, func_dict, product[each]

yield scrapy.Request(product[each], callback=func_dict[each],

meta={'func_dict': func_dict,'product':product,

'each':each,'price_dict':price_dict, 'item':item})

break

raise DontCloseSpider

def parse(self, response=None):

pass

總結

以上是生活随笔為你收集整理的python绿色版spider的idle_Python-Scrapy Spider没有收到spider_idle信号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。